<?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-308361232795615929</id><updated>2012-02-25T14:57:01.157+02:00</updated><category term='Python'/><category term='Visual Studio'/><category term='Book Review'/><category term='MeeGo'/><category term='Tk'/><category term='Prayer Times'/><category term='Game'/><category term='Mobility'/><category term='Nokia'/><category term='VirtualBox'/><category term='Parallel Port'/><category term='IMAP'/><category term='WP7'/><category term='Adobe AIR'/><category term='Windows'/><category term='Tutorial'/><category term='RealPlayer'/><category term='SQLite'/><category term='Java'/><category term='USB Modem'/><category term='Symbian'/><category term='POP'/><category term='Web'/><category term='Remote Device Access'/><category term='Compression'/><category term='Google SketchUp'/><category term='C++'/><category term='Lita'/><category term='RTSP'/><category term='AI'/><category term='Database'/><category term='Linux'/><category term='Accelerometer'/><category term='GIMP'/><category term='Unity'/><category term='Play Framework'/><category term='Qt'/><category term='Cappuccino'/><category term='Presentation'/><category term='Batch'/><category term='Ubuntu'/><category term='Android'/><category term='Career Shift'/><category term='Adobe Flash Lite'/><category term='Maemo'/><title type='text'>Just  عadly</title><subtitle type='html'>Blogging What I learn</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-2889996833157950287</id><published>2012-02-25T14:57:00.000+02:00</published><updated>2012-02-25T14:57:01.187+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Qt Performance Tips</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;As I've been moving away from Qt, I thought I should write some notes about things I've been taking care of when writing a Qt application. Even if they are not the super-duper tips , they may be useful for some people out there.&lt;br /&gt;&lt;br /&gt;These tips, and more you may know or apply by default, can make a huge impact on your application. As I remember, the right compination of these tips has helped me to reduce the time of a big operation, and I was shocked by numbers. Imagine a process that takes 7 milliseconds and a smooth UX &amp;nbsp;instead of 10~30 seconds and a laggy UX!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;1-&amp;nbsp;QCoreApplication::processEvents&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;When getting inside a long loop (&lt;i&gt;for&lt;/i&gt; or &lt;i&gt;while&lt;/i&gt; loop) the application will freeze because of the intensive resource consumption, so it is advised to process events inside the loops to allow other thread to run. You will notice the difference if, for example, you have a progress bar and you update it from inside the loop. The progress bar UI will not be updated eventhough its values have been set, because the loop is not giving the chance for other processes to work. A line like the following can do the job:&lt;br /&gt;&lt;pre class="brush:cpp"&gt;qApp-&amp;gt;processEvents();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;2- Timer slots instead of threads&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Sometimes you want to make a non-blocking process inside your application, so you make another thread, then may get in the hastle of communication with the current thread or modifying the UI. An example I saw and liked was as follows:&lt;br /&gt;&lt;pre class="brush:cpp"&gt;QTimer::singleShot(0, this, SLOT(doSomething()));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It was used in a GUI application when there was much code to write in the constructor, and the code was making much delay in the appearence of the main window. So the solution was to move this code to a slot with zero timeout.&lt;br /&gt;Another usage was when querying much data from a database, showing the results of the query simultiniously in the UI (e.g. filling a datasheet line by line) instead of waiting for the query to finish had a great impact on both performance and user experience.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;3- QCache&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;One of the tasks I hate in my application is accessing a database or filesystem. So using the QCache class in my application could minimize the time of accessing a file or database. If you know how computer cache memory works on hardware level you will get the idea. When I query some data from database, I save them in QCache. So the next time I need the data, I look for it inside my cache member before going to the database. If I find it, I use it. I don't find it, I go to the database. This can help boosting the performance if you have an intensive usage of your database or filesystem in runtime (like a game data maybe or history suggestions). So what it the advantage of QCache over QMap or other classes? Here is a quote from the documentation:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;When inserting an object into the cache, you can specify a cost, which should bear some approximate relationship to the amount of memory taken by the object. When the sum of all objects' costs (totalCost()) exceeds the cache's limit (maxCost()), QCache starts deleting objects in the cache to keep under the limit, starting with less recently accessed objects.&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;4-&amp;nbsp;Qt Resource System&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;"The Qt resource system is a platform-independent mechanism for storing binary files in the application's executable". But it is not always the best choice when you have a lot of files. Remember that this increases the size of your&amp;nbsp;executable, and memory usage. So when you have files that can be placed &lt;i&gt;beside&lt;/i&gt; the app instead of beig &lt;i&gt;inside&lt;/i&gt; it, this will make less memory usage, leaving more momory for later computations, especially when you have limited hardware resources. Keep the resource system for a minimal number of basic resources like, as the documantation says,&amp;nbsp;a certain set of files (icons, translation files, etc.) that you don't want to run the risk of losing them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;5- Painting&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;When you paint some graphics inside the application, whether for a game or just a background, it is advisable to take care of the following.&lt;br /&gt;a) You do not always need to repaint all the space. Sometimes, for example, you want to update a logo at the center of your window or splash screen, then why repainting hundreds of thousands of pixels when you only want to repaint a 64x64 rectangle in the middle?&lt;br /&gt;b) When you repaint the same image over and over (for example, a background in the update() method), it is useless to load the image every time in a temporary variable &lt;i&gt;inside&lt;/i&gt; the method because loading takes time. It is better to declare a local variable in your header file and load it once (in the constructor or anywhere when needed) then only repaint it without reloading the same image.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;6- Database indexing&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;This may not be a Qt-specific tip, but it is still very important when you have a database of tables of 500,000 entries.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;A database index is a data structure that improves the speed of data retrieval operations on a database table at the cost of slower writes and increased storage space&lt;/i&gt;. [Wikipedia]&lt;/blockquote&gt;If you do not know about this topic, I suggest you spent an hour reading and applying it on any database to notice the difference it makes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;7- You application in idle state&lt;/b&gt;&lt;br /&gt;Some application features are only useful when the user is looking at them. For example when you are retrieving weather conditions from a remote server. What is the benefit of downloading an XML file, parsing, and updating your UI every couple of minutes when the user is not even looking? When the user is in a state when he does not benefit from a feature, it is better to stop/pause it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So ... these were the performance tips I had in mind till now. I hope you learned something new from them.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-2889996833157950287?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/2889996833157950287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2012/02/qt-performance-tips.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2889996833157950287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2889996833157950287'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2012/02/qt-performance-tips.html' title='Qt Performance Tips'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-2631430812400192268</id><published>2012-01-17T21:36:00.000+02:00</published><updated>2012-01-18T10:45:29.181+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unity'/><category scheme='http://www.blogger.com/atom/ns#' term='GIMP'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><category scheme='http://www.blogger.com/atom/ns#' term='Google SketchUp'/><title type='text'>Book Review: Google SketchUp for Game Design: Beginner's Guide</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.packtpub.com/google-sketchup-for-3d-game-design-beginners-guide/book" target="_blank"&gt;&lt;img border="0" height="320" src="http://www.packtpub.com/sites/default/files/1345EXP_Sketchup%20for%20Game%20DevelopmentLevels%20and%20Props,%20Beginner's%20Guide_FrontCover.jpg" width="260" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Today I'm writing a review on a very special book:&amp;nbsp;Google SketchUp for Game Design: Beginner's Guide, by Robin de Jongh, Packt Publishing. I really enjoyed this book, and to be clear and organized, I'll write my review as definite points (as usual =) ).&lt;br /&gt;&lt;br /&gt;Pros:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;As the book title mentioned, it is a guide for game design &lt;i&gt;and&lt;/i&gt; beginners. So the book did not only go from bottom up in Google SketchUp, but also went to explain the basics of other applications that can get involved in the game design process like &lt;a href="http://www.gimp.org/" target="_blank"&gt;GIMP&lt;/a&gt;, and even introduced one of the best game engines: &lt;a href="http://unity3d.com/" target="_blank"&gt;Unity&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;All tools and websites introduced are free, or have trial versions/accounts.&lt;/li&gt;&lt;li&gt;The book author stressed on a very important thing: honesty, and the cover image is an example of this honesty. Because what you see on this cover is what you get and can do yourself using what you learned in Google SketchUp.&lt;/li&gt;&lt;li&gt;The way the author explains is not boring or lengthy. But on the contrary, it was very smooth, interesting, and straight to the point.&lt;/li&gt;&lt;li&gt;The author stressed on introducing the basic and important features of each applications without getting deep, which I considered it a very nice method in dealing with a beginner in any application. Beside some tips and tricks, and notes on how bigger companies do this work and manage such tasks.&lt;/li&gt;&lt;li&gt;The book in general was like a quick tour in the world of assets and game design, opening some doors I might not see if I just go to learn Google SketchUp alone.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Cons:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;The websites and links provided inside the book were not all working. Some links were removed and some had different sub-directories, but somehow I managed to get to most of them by a quick search.&lt;/li&gt;&lt;li&gt;The author sometimes missed some small details that -for a lazy beginner- can be&amp;nbsp;crucial to get a step done. Some small details like the order of marking&amp;nbsp;objects or how to use a certain tool. But the athor has indicated that this book needs some work, so there is no place for laziness.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;All in all, I would recommend this book for reading, whether you are using Google SketchUp for game asset design, game level design, or even as an architect.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-2631430812400192268?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/2631430812400192268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2012/01/book-review-google-sketchup-for-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2631430812400192268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2631430812400192268'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2012/01/book-review-google-sketchup-for-game.html' title='Book Review: Google SketchUp for Game Design: Beginner&apos;s Guide'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-6756365329592133328</id><published>2011-11-05T23:59:00.001+02:00</published><updated>2011-11-06T11:42:05.324+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MeeGo'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='VirtualBox'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>MeeGo 1.2 for Netbooks in Virtualbox ( Windows and Ubuntu )</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="114" src="https://meego.com/sites/all/files/imagecache/image_post_width/users/u3/splash-downloads.png" width="320" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;These are the steps for installing MeeGo 1.2 for Netbooks in Virtualbox. These steps were tested on &lt;b&gt;Ubuntu 10.04&lt;/b&gt; and &lt;b&gt;Windows 7&lt;/b&gt;. Steps are the same on both OSs, and screenshots were taken from Ubuntu 10.04.&lt;br /&gt;&lt;br /&gt;First, you should download the latest version of MeeGo from:&amp;nbsp;&lt;a href="https://meego.com/downloads"&gt;https://meego.com/downloads&lt;/a&gt;&lt;br /&gt;and install Virtualbox, whether from :&amp;nbsp;&lt;a href="https://www.virtualbox.org/wiki/Downloads"&gt;https://www.virtualbox.org/wiki/Downloads&lt;/a&gt;&amp;nbsp;or from Ubuntu Software Center.&lt;br /&gt;&lt;br /&gt;Second, covert the extension from the downloaded MeeGo image from (*.img) to (*iso).&lt;br /&gt;&lt;br /&gt;Then, open Virtualbox and create a new machine.&lt;br /&gt;&lt;br /&gt;Make sure you indicate the machine as a &lt;b&gt;Fedora Linux&lt;/b&gt; version, with Ram 512MB or higher (MeeGo Wiki says 1GB) and at least 5GB of disk space. Also make sure you enable the options of "&lt;b&gt;Enable PAE/NX&lt;/b&gt;" and "&lt;b&gt;Enable 3D Acceleration&lt;/b&gt;".&lt;br /&gt;&lt;br /&gt;Here are screenshots of this step:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ltXDb7DsH8I/TrW02tpEvLI/AAAAAAAAAR0/xp7-KePJjwA/s1600/01+Screenshot-Create+New+Virtual+Machine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://3.bp.blogspot.com/-ltXDb7DsH8I/TrW02tpEvLI/AAAAAAAAAR0/xp7-KePJjwA/s320/01+Screenshot-Create+New+Virtual+Machine.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-w-ZOXFyJEKc/TrW04phmQRI/AAAAAAAAAR8/_l6UttgpJBY/s1600/02+Screenshot-Create+New+Virtual+Machine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://3.bp.blogspot.com/-w-ZOXFyJEKc/TrW04phmQRI/AAAAAAAAAR8/_l6UttgpJBY/s320/02+Screenshot-Create+New+Virtual+Machine.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-oqU6SeX3Dfg/TrW06zfr4KI/AAAAAAAAASE/TCb5z5TiRAY/s1600/03+Screenshot-Create+New+Virtual+Machine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://1.bp.blogspot.com/-oqU6SeX3Dfg/TrW06zfr4KI/AAAAAAAAASE/TCb5z5TiRAY/s320/03+Screenshot-Create+New+Virtual+Machine.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-_-9uV8qttZY/TrW09umupEI/AAAAAAAAASM/onuIKBzhaYA/s1600/04+Screenshot-Create+New+Virtual+Disk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://2.bp.blogspot.com/-_-9uV8qttZY/TrW09umupEI/AAAAAAAAASM/onuIKBzhaYA/s320/04+Screenshot-Create+New+Virtual+Disk.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-GpbNIc2VPis/TrW0_lGfcoI/AAAAAAAAASU/9U-A50o-I04/s1600/05+Screenshot-Create+New+Virtual+Disk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://3.bp.blogspot.com/-GpbNIc2VPis/TrW0_lGfcoI/AAAAAAAAASU/9U-A50o-I04/s320/05+Screenshot-Create+New+Virtual+Disk.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-jTndtUtGL18/TrW1CYXajzI/AAAAAAAAASc/kgpCCMeyX7w/s1600/06+Screenshot-Create+New+Virtual+Disk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://1.bp.blogspot.com/-jTndtUtGL18/TrW1CYXajzI/AAAAAAAAASc/kgpCCMeyX7w/s320/06+Screenshot-Create+New+Virtual+Disk.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-3TZ-3SgHEwE/TrW1EuFu4JI/AAAAAAAAASk/nMeXUQM6c0Q/s1600/07+Screenshot-VirtualBox+OSE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://3.bp.blogspot.com/-3TZ-3SgHEwE/TrW1EuFu4JI/AAAAAAAAASk/nMeXUQM6c0Q/s320/07+Screenshot-VirtualBox+OSE.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ktEN7jRIBq4/TrW1HCE4NhI/AAAAAAAAASs/-aQVW7x8WjQ/s1600/08+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://3.bp.blogspot.com/-ktEN7jRIBq4/TrW1HCE4NhI/AAAAAAAAASs/-aQVW7x8WjQ/s320/08+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0uoIbdbORD8/TrW1JLeb0EI/AAAAAAAAAS0/jwqeK4CMBNA/s1600/08+Screenshot-MeeGo+1.2+-+Settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://2.bp.blogspot.com/-0uoIbdbORD8/TrW1JLeb0EI/AAAAAAAAAS0/jwqeK4CMBNA/s320/08+Screenshot-MeeGo+1.2+-+Settings.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZsALf5jyT74/TrW1LPNh8XI/AAAAAAAAAS8/35tLgdZ5L4s/s1600/09+Screenshot-MeeGo+1.2+-+Settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://4.bp.blogspot.com/-ZsALf5jyT74/TrW1LPNh8XI/AAAAAAAAAS8/35tLgdZ5L4s/s320/09+Screenshot-MeeGo+1.2+-+Settings.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RInJbG2g-zM/TrW1OryV23I/AAAAAAAAATE/FBHz3J5zr5I/s1600/10+Screenshot-VirtualBox+OSE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/-RInJbG2g-zM/TrW1OryV23I/AAAAAAAAATE/FBHz3J5zr5I/s320/10+Screenshot-VirtualBox+OSE.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now let's start our new virtual machine. From the menu appearing, chose "Installation Only", wait until some operations end, then the UI wizard will appear. The steps of installation are almost straight forward. And after installation, A message will say that you should not remove the USB stick (or the virtual CD ROM in our case) until you press the "Close" button. So press "Close" and then un-mount the CD ROM from the Virtualbox menu: &lt;b&gt;Machine -&amp;gt; CD/DVD Devices -&amp;gt; Unmount&lt;/b&gt;. Then reboot the machine from: &lt;b&gt;Machine -&amp;gt; Reset&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-QGCcemVY7XA/TrW67A_1l5I/AAAAAAAAATM/nqf4rS6nfhE/s1600/11+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-QGCcemVY7XA/TrW67A_1l5I/AAAAAAAAATM/nqf4rS6nfhE/s320/11+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qyzEdX6ktyY/TrW68EGurII/AAAAAAAAATU/RNtvxq-Lvpk/s1600/12+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="http://3.bp.blogspot.com/-qyzEdX6ktyY/TrW68EGurII/AAAAAAAAATU/RNtvxq-Lvpk/s320/12+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-f9l0PVjVI7s/TrW69fDuCtI/AAAAAAAAATc/yXQIkd8-lFU/s1600/13+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-f9l0PVjVI7s/TrW69fDuCtI/AAAAAAAAATc/yXQIkd8-lFU/s320/13+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6E_dy5wmCF8/TrW6_bprgOI/AAAAAAAAATk/K3YzX4iyS7k/s1600/14+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-6E_dy5wmCF8/TrW6_bprgOI/AAAAAAAAATk/K3YzX4iyS7k/s320/14+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-puje_apid1Q/TrW7BkUUbMI/AAAAAAAAATs/JM9ZqJT76eQ/s1600/15+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-puje_apid1Q/TrW7BkUUbMI/AAAAAAAAATs/JM9ZqJT76eQ/s320/15+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0xO0_6J1e34/TrW7Dz_db6I/AAAAAAAAAT0/7eEicJyDB4c/s1600/16+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-0xO0_6J1e34/TrW7Dz_db6I/AAAAAAAAAT0/7eEicJyDB4c/s320/16+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-WIl5MB1LrBc/TrXJ4PUrKII/AAAAAAAAAVk/8-H3YUGJDC4/s1600/17+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-WIl5MB1LrBc/TrXJ4PUrKII/AAAAAAAAAVk/8-H3YUGJDC4/s320/17+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ROgkph0Vzsw/TrW7FA9TJUI/AAAAAAAAAT8/6o74r65VdOI/s1600/18+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-ROgkph0Vzsw/TrW7FA9TJUI/AAAAAAAAAT8/6o74r65VdOI/s320/18+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After restarting, the wizard will continue with some basic settings. When going through these steps, they went fine on Windows 7, but on Ubuntu 10.04 I had to reset the machine a couple of times to finish the settings steps and move to the next step. BTW: The blue splash screen at the beginning of these steps may stay for a few seconds.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-V3HgsSOogxE/TrW8QIxH2vI/AAAAAAAAAUE/9K4vfYnvfs8/s1600/19+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-V3HgsSOogxE/TrW8QIxH2vI/AAAAAAAAAUE/9K4vfYnvfs8/s320/19+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vPdMJrodUbM/TrW8SFW8aYI/AAAAAAAAAUM/YOqCk1tQQYQ/s1600/20+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-vPdMJrodUbM/TrW8SFW8aYI/AAAAAAAAAUM/YOqCk1tQQYQ/s320/20+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RfsDBSNbLJ4/TrW8T3xwdwI/AAAAAAAAAUU/pwjtjehIpcE/s1600/21+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-RfsDBSNbLJ4/TrW8T3xwdwI/AAAAAAAAAUU/pwjtjehIpcE/s320/21+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0dw1821bBZk/TrW8W0XbZtI/AAAAAAAAAUc/KrngBEnIdPc/s1600/22+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-0dw1821bBZk/TrW8W0XbZtI/AAAAAAAAAUc/KrngBEnIdPc/s320/22+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-os9UTUqQ9g8/TrW8YZLyMLI/AAAAAAAAAUk/k58CjNtaxV4/s1600/24+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-os9UTUqQ9g8/TrW8YZLyMLI/AAAAAAAAAUk/k58CjNtaxV4/s320/24+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DC4pRCVoG0Q/TrW8Zrlj9sI/AAAAAAAAAUs/KW4VJGYAjr4/s1600/25+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-DC4pRCVoG0Q/TrW8Zrlj9sI/AAAAAAAAAUs/KW4VJGYAjr4/s320/25+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now we come to a little dirty part. At this moment, the machine may start normally without any effort. But some other times you need to do the following steps. These steps are the best I could write after searching and trying for hours:&lt;br /&gt;&lt;br /&gt;First wait until the first blue screen appears and press "ESC" on the keyboard. This will view a list with one option to boot MeeGo. Press "Tab" key to edit the command of launching MeeGo, remove the last part of "&lt;b&gt;quite vga=current&lt;/b&gt;" and replace it with "&lt;b&gt;init 3&lt;/b&gt;" then hit the "Enter" key.&lt;br /&gt;&lt;br /&gt;Some commands will appear quickly on the screen, wait until you see the login screen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BzrSTq3zcU4/TrW-ASYwy9I/AAAAAAAAAU0/Regcm3Vo0KA/s1600/26+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-BzrSTq3zcU4/TrW-ASYwy9I/AAAAAAAAAU0/Regcm3Vo0KA/s320/26+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7DK-toGHJgs/TrW-JzMGbHI/AAAAAAAAAU8/lFu1Pf78Z3c/s1600/27+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-7DK-toGHJgs/TrW-JzMGbHI/AAAAAAAAAU8/lFu1Pf78Z3c/s320/27+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fa9hxJtQ7X0/TrW-LuX2kJI/AAAAAAAAAVE/4Y6VeXMMRzQ/s1600/28+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-fa9hxJtQ7X0/TrW-LuX2kJI/AAAAAAAAAVE/4Y6VeXMMRzQ/s320/28+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Do a login with the username/password you have set in the previous steps. Then write:&lt;br /&gt;&lt;b&gt;sudo su&lt;/b&gt;&lt;br /&gt;[enter the password again]&lt;br /&gt;&lt;b&gt;chmod +s /usr/bin/Xorg&lt;/b&gt;&lt;br /&gt;&lt;b&gt;uxlaunch&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now you should wait for a few seconds to see the MeeGo home screen appearing.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-I5ADY0DvVIE/TrW-8FyJlxI/AAAAAAAAAVM/17r_KBG3CcU/s1600/29+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-I5ADY0DvVIE/TrW-8FyJlxI/AAAAAAAAAVM/17r_KBG3CcU/s320/29+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Hh1Om0qOmDc/TrW-_6_RexI/AAAAAAAAAVU/2n02unNmXUk/s1600/30+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-Hh1Om0qOmDc/TrW-_6_RexI/AAAAAAAAAVU/2n02unNmXUk/s320/30+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you want to shutdown the machine in a legal way, you will notice that there is no "Shutdown" button. But you can still choose "&lt;b&gt;Machine -&amp;gt; ACPI Shutdown&lt;/b&gt;" from the virtual machine menubar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-xMD0u3Ttn2U/TrW_C9qTyAI/AAAAAAAAAVc/9tQ5O8tOv68/s1600/31+Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-xMD0u3Ttn2U/TrW_C9qTyAI/AAAAAAAAAVc/9tQ5O8tOv68/s320/31+Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;There is another final note: Although I had to write the terminal commands whenever I launch the machine on Windows 7, I found the machine booting normally on Ubuntu 10.04 once I hit the "Start" button&lt;/strike&gt;.&lt;br /&gt;&lt;i&gt;Update: It booted fine on both OSs. The problem was because I did not make a legal shutdown, so the session was not saved.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-6756365329592133328?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/6756365329592133328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/11/meego-12-for-netbooks-in-virtualbox-in.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/6756365329592133328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/6756365329592133328'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/11/meego-12-for-netbooks-in-virtualbox-in.html' title='MeeGo 1.2 for Netbooks in Virtualbox ( Windows and Ubuntu )'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ltXDb7DsH8I/TrW02tpEvLI/AAAAAAAAAR0/xp7-KePJjwA/s72-c/01+Screenshot-Create+New+Virtual+Machine.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-8429600735495211979</id><published>2011-10-12T15:16:00.000+02:00</published><updated>2011-10-12T15:21:41.382+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobility'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Read/Edit Phone Contacts Using Qt</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Here I'm posting a code snippet I used to modify my contacts on both SIM card and phone memory. What this code does is that it loops over all available memories on phone and edits each number according to a criteria I set. To simplify the code, I removed the business parts and posted only the parts related to Qt Framework and the loop over the contacts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;The skeleton of the process is as follows:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Get all available manager on device. In my case they where "symbian" (i.e: phone memory) and "symbiansim" (i.e: SIM card)&lt;/li&gt;&lt;li&gt;Loop over the list of managers.&lt;/li&gt;&lt;li&gt;For each manager, get the ids of available contacts.&lt;/li&gt;&lt;li&gt;For each contact id, get all the available phone numbers.&lt;/li&gt;&lt;li&gt;For each phone number, decide if it needs to be changed (the business part), or just output the number or use it however you want.&lt;/li&gt;&lt;li&gt;A couple of flags are set to save any changes in a number/contact&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[*.pro]&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;symbian:TARGET.CAPABILITY += ReadUserData WriteUserData&lt;br /&gt;&lt;br /&gt;CONFIG += mobility&lt;br /&gt;MOBILITY += contacts&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;[*.h]&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include &amp;lt;QContactManager&amp;gt;&lt;br /&gt;#include &amp;lt;QContact&amp;gt;&lt;br /&gt;#include &amp;lt;QContactPhoneNumber&amp;gt;&lt;br /&gt;&lt;br /&gt;QTM_USE_NAMESPACE&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;[*.cpp]&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//find all the available mamagers on device&lt;br /&gt;QStringList managers = QContactManager::availableManagers();&lt;br /&gt;&lt;br /&gt;//loop on all the available managers&lt;br /&gt;for(int m=0; m&amp;lt;managers.length(); m++)&lt;br /&gt;{&lt;br /&gt;    //initialize a new contact manager with one of the ids in "mamagers" list&lt;br /&gt;    QContactManager cManager(managers.at(m));&lt;br /&gt;&lt;br /&gt;    QList&amp;lt;QContactLocalId&amp;gt; idsList = cManager.contactIds();&lt;br /&gt;    &lt;br /&gt;    //loop on all the available contacts&lt;br /&gt;    for(int i=0; i&amp;lt;idsList.length(); i++)&lt;br /&gt;    {&lt;br /&gt;        QContact contact = cManager.contact(idsList.at(i));&lt;br /&gt;        bool contactEdited = false;&lt;br /&gt;        &lt;br /&gt;        //get all contact details the can be considered a phone numbers (mobile, home .. etc)&lt;br /&gt;        QList&amp;lt;QContactPhoneNumber&amp;gt; phoneNumbers = contact.details&amp;lt;QContactPhoneNumber&amp;gt;();&lt;br /&gt;&lt;br /&gt;        //iterate on the phone numbers of the contact&lt;br /&gt;        for(int idx=0; idx&amp;lt;phoneNumbers.length(); idx++)&lt;br /&gt;        {&lt;br /&gt;            QContactPhoneNumber phone = phoneNumbers.at(idx);&lt;br /&gt;            QString number = phone.value(QContactPhoneNumber::FieldNumber);&lt;br /&gt;            bool numberEdited = false;&lt;br /&gt;&lt;br /&gt;            // ################### Editing Zone #################&lt;br /&gt;            &lt;br /&gt;            // here you put any operations related to editing the number&lt;br /&gt;            // and set the "edited" flag to true if you changed the number&lt;br /&gt;            &lt;br /&gt;            // ##################################################&lt;br /&gt;&lt;br /&gt;            //if the number is edited, save it in the "contact" object&lt;br /&gt;            if(numberEdited)&lt;br /&gt;            {&lt;br /&gt;                phone.setNumber(number);&lt;br /&gt;                contact.saveDetail(&amp;amp;phone);&lt;br /&gt;                &lt;br /&gt;                //raise the contactEdited flag to save the contact later&lt;br /&gt;                contactEdited = true;&lt;br /&gt;            }&lt;br /&gt;        } // end of numbers loop&lt;br /&gt;&lt;br /&gt;        if(contactEdited)&lt;br /&gt;        {&lt;br /&gt;            //save the edited contact&lt;br /&gt;            cManager.saveContact(&amp;amp;contact);&lt;br /&gt;        }&lt;br /&gt;    } // end of contacts loop&lt;br /&gt;} // end of managers loop&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Here are some notes about this code:&lt;/b&gt;&lt;br /&gt;- If you need to interact with one manager, just pass one item to the "managers" list, or simply remove the managers loop.and set the manager manually.&lt;br /&gt;&lt;pre class="brush:cpp"&gt;QContactManager cManager("symbiansim");&lt;br /&gt;&lt;/pre&gt;- It is a good practice to not freeze the application with all these nested loops. So if you are sure that no other event can cause a problem while executing these operations, you can insert this line inside each loop.&lt;br /&gt;&lt;pre class="brush:cpp"&gt;qApp-&amp;gt;processEvents();&lt;br /&gt;&lt;/pre&gt;- Self-signing is enough to get this code running on a Symbian device.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-8429600735495211979?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/8429600735495211979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/10/readedit-phone-contacts-using-qt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8429600735495211979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8429600735495211979'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/10/readedit-phone-contacts-using-qt.html' title='Read/Edit Phone Contacts Using Qt'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-8003044354180446017</id><published>2011-09-21T21:48:00.000+02:00</published><updated>2011-09-21T22:05:47.062+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Play Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review: Play Framework Cookbook</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Ok, after some reading in parts of the book and touring some other parts (remember my previous &lt;a href="http://3adly.blogspot.com/2011/09/to-read-play-framework-cookbook.html"&gt;entry&lt;/a&gt;?), here are my notes about this book. But first I have to mention the beckground I come from:&lt;br /&gt;- Basically I come from a front-end development environment.&lt;br /&gt;- C++ is my main interest, then comes Java.&lt;br /&gt;- I've just started to learn Play framework and found it interesting to go deeper into.&lt;br /&gt;&lt;br /&gt;Now let's get to the review:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://link.packtpub.com/HWeOxF"&gt;&lt;img border="0" src="https://www.packtpub.com/sites/default/files/imagecache/productview/5528OS_Play%20Framework%20Cookbook_Frontcover.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;1- From the book intro, the author indicated that proceeding with a Play tutorial plus some web developer skills—HTML and JavaScript. So I thought it would not be that hard to get started, and it wasn't at the very beginning, then it accelerated very quickly that I had to skip more parts chapter after chapter. Maybe I needed more that some knowledge or skills, I needed the "web culture".&lt;br /&gt;&lt;br /&gt;2- I liked how the examples were introduced along with test cases. Examples on the internet may settle with some code and leave the testing to the user, so the book made it more professional.&lt;br /&gt;&lt;br /&gt;3- Some code parts seemed to be eligible to be put inside real projects, not just dummy examples. They were well designed.&lt;br /&gt;&lt;br /&gt;4- Most of the times I notice how the author tends to to stop at some part of the explanation or move faster. So I sometimes had the feeling that parts of the book were more like highlights.&lt;br /&gt;&lt;br /&gt;5- This book can be useful as a reference while coding or preparing materials for a course/project. But not a solid tutorial to take (remember my background, it is still useful as I mentioned).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-8003044354180446017?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/8003044354180446017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/09/book-review-play-framework-cookbook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8003044354180446017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8003044354180446017'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/09/book-review-play-framework-cookbook.html' title='Book Review: Play Framework Cookbook'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-2866748882470592915</id><published>2011-09-08T20:34:00.000+02:00</published><updated>2011-09-09T09:33:38.925+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Play Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>To Read: Play Framework Cookbook</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://link.packtpub.com/HWeOxF"&gt;&lt;img border="0" src="https://www.packtpub.com/sites/default/files/imagecache/productview/5528OS_Play%20Framework%20Cookbook_Frontcover.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Today I had the opportunity to receive a softcopy of a new book:&amp;nbsp;&lt;a href="http://link.packtpub.com/HWeOxF"&gt;Play Framework Cookbook&lt;/a&gt;&amp;nbsp;, by&amp;nbsp;Alexander Reelsen, Packt Publishing.&lt;br /&gt;&lt;br /&gt;And since Play Framework has not so many books to find, It was a good&amp;nbsp;opportunity I cannot miss. What is attractive in this book? From the first look, it does not require deep experience with Play Framework. You just need to follow a couple of examples ( &lt;a href="http://www.playframework.org/documentation/1.2.3/home#guide"&gt;link1&lt;/a&gt; ,&amp;nbsp;&lt;a href="http://3adly.blogspot.com/2011/07/play-framework-tutorial.html"&gt;link2&lt;/a&gt; ) on the internet to be ready for this book which already explains some basics in the first chapter and promises to mention some basic throughout the book.&lt;br /&gt;&lt;br /&gt;Now let me start reading and give my review. If you are in a hurry to see the book from inside, here is a link to a sample chapter: (&lt;a href="http://www.packtpub.com/sites/default/files/5528OS-Chapter-2-Using-Controllers.pdf?utm_source=packtpub&amp;amp;utm_medium=free&amp;amp;utm_campaign=pdf"&gt;download&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Stay tuned ...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-2866748882470592915?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/2866748882470592915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/09/to-read-play-framework-cookbook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2866748882470592915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2866748882470592915'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/09/to-read-play-framework-cookbook.html' title='To Read: Play Framework Cookbook'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-7900179588168721955</id><published>2011-07-08T23:35:00.000+02:00</published><updated>2011-09-08T20:35:13.125+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Play Framework'/><title type='text'>Play Framework Tutorial</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.playframework.org/"&gt;&lt;img border="0" height="99" src="http://2.bp.blogspot.com/-D3YVpDZZMsc/ThduljxSXgI/AAAAAAAAAO0/B9z6bpMWTco/s320/playframework.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A couple of weeks ago, I attended a introductory one-hour session about Play Framework. And it was interesting as it was my first time to experience anything related to the web. So I decided to give it a try. And guess what, I could navigate inside the framework and make my first simple service within two hours (remember: zero web experience and not so much Java experience), And thought I could write about it. Why? Because I wanted a tutorial that gives me the basics without going deeps, then gives me the keywords and options to go deeper in any part, and did not find what I want, so I did it my way.&lt;br /&gt;&lt;br /&gt;Note: Even for the front-end developer, knowing the basics of web applications. Why? Imagine making an application that depends on a web service, say, BBC RRS feed). To test the application you have to make some scenarios like: service down, content with special characters, etc. So you have to create a "development environment" different from the "production environment" (which usually cannot be halted for some front-end testing).&lt;br /&gt;&lt;br /&gt;In this tutorial I will make a service that takes a city name and returns a four-day forecast from Google weather API. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installation:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is straight forward. Just go to &lt;a href="http://www.playframework.org/"&gt;http://www.playframework.org/&lt;/a&gt; and download the latest version. (for Ubunutu, I had to go to &lt;a href="http://download.playframework.org/miscellaneous/"&gt;http://download.playframework.org/miscellaneous/&lt;/a&gt; to download the debian package)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Starting a new Project:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[I'm using Play 1.0.2.1 on Ubuntu 10.10]&lt;br /&gt;1- Open Terminal&lt;br /&gt;2- Assuming we want to make a project called "MyWeatherService", write:&lt;br /&gt;&lt;pre class="brush:xml"&gt;play new MyWeatherService&lt;/pre&gt;&lt;br /&gt;3- It will ask for application name (the previous name was the project name, so write:&lt;br /&gt;&lt;pre class="brush:xml"&gt;MyWeatherService&lt;/pre&gt;&lt;br /&gt;4- Now the project is created and can be accessed by typing:&lt;br /&gt;&lt;pre class="brush:xml"&gt;play run MyWeatherService&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-v5raKSQ5bx8/ThdspCewCEI/AAAAAAAAAN8/jQNnGEZXwoA/s1600/newProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://2.bp.blogspot.com/-v5raKSQ5bx8/ThdspCewCEI/AAAAAAAAAN8/jQNnGEZXwoA/s320/newProject.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;5- Now the service is running. Open your web browser and type&lt;br /&gt;&lt;pre class="brush:xml"&gt;http://localhost:9000/&lt;/pre&gt;(9000 is the default port, let's see this later)&lt;br /&gt;&lt;br /&gt;6- To stop the service, just go back to the terminal and press: Ctrl+C&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Editing project from NetBeans:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For easier development, the Play! project can be opened in different IDE's like NetBeans and Eclipse. So I'm going to use NetBeans.&lt;br /&gt;&lt;br /&gt;1- From terminal type:&lt;br /&gt;&lt;pre class="brush:xml"&gt;play netbeansify MyWeatherService&lt;/pre&gt;(there is also "eclipsify")&lt;br /&gt;&lt;br /&gt;2- From NetBeans: File -&amp;gt; Open Project&lt;br /&gt;&lt;br /&gt;3- In my case, the project is located in &lt;br /&gt;&lt;pre class="brush:xml"&gt;/home/adly/MyWeatherService&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Project's Basic Structure:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Let's take an overview on the must-know basics before proceeding, The Play! project follows the MVC stucture, so We are dealing with:&lt;br /&gt;&lt;b&gt;Model&lt;/b&gt;: where database queries, mathematical computations .. etc happen&lt;br /&gt;&lt;b&gt;View&lt;/b&gt;: the template used for rendering the data from the model. The view can be HTML/XML.&lt;br /&gt;&lt;b&gt;Controller&lt;/b&gt;: maps model data to fit in the view.&lt;br /&gt;&lt;br /&gt;and there is and important file: &lt;b&gt;conf -&amp;gt; routes&lt;/b&gt;. This file defines how the user can talk to the web service, and which controller handles each route.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating our web service:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1- Lets create the model first. Right click on app -&amp;gt; models and choose new -&amp;gt; Java Class .And let's name it WeatherModel.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-eJ0yAt1RO9k/Thds3uOimjI/AAAAAAAAAOE/lpL86SXmvqY/s1600/model.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://2.bp.blogspot.com/-eJ0yAt1RO9k/Thds3uOimjI/AAAAAAAAAOE/lpL86SXmvqY/s320/model.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;2- Make this class extend Model.&lt;br /&gt;&lt;br /&gt;3- Create a method to be interfaced by the controller. I made a getAllWeatherStates() method which returns an array list of the weather states representing today and some days to come. I'm not going to use databases ad relations and all these stuff, I want to keep it simple as a beginning. So all I'm going to do is call a Google weather API, parse data, create WeatherState objects, put them in an ArrayList and return this ArrayList to the caller.&lt;br /&gt;&lt;br /&gt;First, I created a simple class and called it WeatherState that has nothing but strings of data/state/max/min.&lt;br /&gt;&lt;br /&gt;[WeatherState.java]&lt;br /&gt;&lt;pre class="brush:java"&gt;package models;&lt;br /&gt;&lt;br /&gt;public class WeatherState {&lt;br /&gt;    &lt;br /&gt;    public String date;&lt;br /&gt;    public String state;&lt;br /&gt;    public String max;&lt;br /&gt;    public String min;&lt;br /&gt;    &lt;br /&gt;    public WeatherState(String date, String state, String max, String min){&lt;br /&gt;        this.date = date;&lt;br /&gt;        this.state = state;&lt;br /&gt;        this.max = max;&lt;br /&gt;        this.min = min;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Now let's see the code of the our model&lt;br /&gt;&lt;br /&gt;[WeatherModel.java]&lt;br /&gt;&lt;pre class="brush:java"&gt;/**&lt;br /&gt; * To change this template, choose Tools | Templates&lt;br /&gt; * and open the template in the editor.&lt;br /&gt; */&lt;br /&gt;package models;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.net.HttpURLConnection;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import javax.xml.parsers.DocumentBuilder;&lt;br /&gt;import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;import org.w3c.dom.Document;&lt;br /&gt;import org.w3c.dom.Element;&lt;br /&gt;import org.w3c.dom.Node;&lt;br /&gt;import org.w3c.dom.NodeList;&lt;br /&gt;import play.db.jpa.Model;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author adly&lt;br /&gt; */&lt;br /&gt;public class WeatherModel extends Model{&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * A controller should call this method&lt;br /&gt;     */&lt;br /&gt;    public static ArrayList getAllWeatherStates(String cityName){&lt;br /&gt;        try {&lt;br /&gt;            return getCityStates(cityName);&lt;br /&gt;        } catch (IOException ex) {&lt;br /&gt;            ArrayList weatherStates = new ArrayList();&lt;br /&gt;            return weatherStates;&lt;br /&gt;        }&lt;br /&gt;    } &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * A private method that calls a Google weather API, parses content,&lt;br /&gt;     * and returns an ArrayList on WeatherState objects&lt;br /&gt;     */&lt;br /&gt;    private static ArrayList getCityStates(String cityName) throws IOException {&lt;br /&gt;        &lt;br /&gt;        ArrayList weatherStates = new ArrayList();&lt;br /&gt;        try{&lt;br /&gt;            &lt;br /&gt;            /**&lt;br /&gt;             * Download XML data&lt;br /&gt;             */&lt;br /&gt;            &lt;br /&gt;            URL connectURL = new URL("http://www.google.com/ig/api?weather="+cityName);&lt;br /&gt;            HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); &lt;br /&gt;            &lt;br /&gt;            conn.setDoInput(true);&lt;br /&gt;            conn.setDoOutput(true);&lt;br /&gt;            conn.setUseCaches(false); &lt;br /&gt;            conn.setRequestMethod("GET"); &lt;br /&gt;            // connect and flush the request out&lt;br /&gt;            conn.connect();&lt;br /&gt;&lt;br /&gt;            InputStream inStream = conn.getInputStream();&lt;br /&gt;            &lt;br /&gt;            /**&lt;br /&gt;             * Parse data into an ArrayList&lt;br /&gt;             */&lt;br /&gt;            &lt;br /&gt;            try{&lt;br /&gt;                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();&lt;br /&gt;                DocumentBuilder builder = factory.newDocumentBuilder();&lt;br /&gt;                Document dom = builder.parse(inStream);&lt;br /&gt;                Element root = dom.getDocumentElement();&lt;br /&gt;                NodeList items = root.getElementsByTagName("forecast_conditions");&lt;br /&gt;  &lt;br /&gt;                for(int i=0; i&amp;lt;items.getLength(); i++){&lt;br /&gt;                    String day = "";&lt;br /&gt;                    String low = "";&lt;br /&gt;                    String high = "";&lt;br /&gt;                    String condition = "";&lt;br /&gt;                    &lt;br /&gt;                    Node item = items.item(i);&lt;br /&gt;                    NodeList properties = item.getChildNodes();&lt;br /&gt;                    for(int j=0; j&amp;lt;properties.getLength(); j++){&lt;br /&gt;                        Node property = properties.item(j);&lt;br /&gt;                        String name = property.getNodeName();&lt;br /&gt;                        if(name.equalsIgnoreCase("day_of_week")){&lt;br /&gt;                            Element child = (Element) property;&lt;br /&gt;                            day = child.getAttribute("data");&lt;br /&gt;                        }else if(name.equalsIgnoreCase("low")){&lt;br /&gt;                            Element child = (Element) property;&lt;br /&gt;                            low = child.getAttribute("data");&lt;br /&gt;                        }else if(name.equalsIgnoreCase("high")){&lt;br /&gt;                            Element child = (Element) property;&lt;br /&gt;                            high = child.getAttribute("data");&lt;br /&gt;                        }else if(name.equalsIgnoreCase("condition")){&lt;br /&gt;                            Element child = (Element) property;&lt;br /&gt;                            condition = child.getAttribute("data");&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    WeatherState weather = new WeatherState(day, condition, high, low);&lt;br /&gt;                    weatherStates.add(weather);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            catch(Exception e)&lt;br /&gt;            {&lt;br /&gt;                //parsing exception&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        catch(Exception e)&lt;br /&gt;        {&lt;br /&gt;            //downloading exception&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return weatherStates;&lt;br /&gt;    } //end of 'getCityStates' method&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note that the code of getCityStates method is pure Java, I actually used it before in an android project.&lt;br /&gt;&lt;br /&gt;So this is all we had to make for or model. And the big part of "coding" is done.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4- Now let's make the controller. It is the one containing a method the will be called when a user requests with a certain URL (to see that later).&lt;br /&gt;&lt;br /&gt;5- Right click on app -&amp;gt; controllers and choose new -&amp;gt; Java class. And let's name it Weather.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2QJnnhSTGds/ThdtPTWMHJI/AAAAAAAAAOM/K2Epq2ZlPbQ/s1600/controller.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-2QJnnhSTGds/ThdtPTWMHJI/AAAAAAAAAOM/K2Epq2ZlPbQ/s320/controller.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;6- Make it extend Controller. And let's make a requestWeather method that will call the model and then the appropriate view by a method called render().&lt;br /&gt;&lt;br /&gt;7- The code is as simple as this:&lt;br /&gt;&lt;br /&gt;[Weather.java]&lt;br /&gt;&lt;pre class="brush:java"&gt;/**&lt;br /&gt; * To change this template, choose Tools | Templates&lt;br /&gt; * and open the template in the editor.&lt;br /&gt; */&lt;br /&gt;package controllers;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import models.WeatherModel;&lt;br /&gt;import play.mvc.Controller;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author adly&lt;br /&gt; */&lt;br /&gt;public class Weather extends Controller{&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Called when a user requests weather with a certail URL containing&lt;br /&gt;     * city name&lt;br /&gt;     */&lt;br /&gt;    public static void requestWeather(String cityName) {&lt;br /&gt;        ArrayList weatherStates = WeatherModel.getAllWeatherStates(cityName);&lt;br /&gt;        render(weatherStates);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;8- Now let's make the view for this controller. I want to make an XML file that appears to the user when the weather of a certain city is requested. And views an error message if city name is not valid.&lt;br /&gt;&lt;br /&gt;9- Right click on app/views -&amp;gt; new -&amp;gt; other and chose a new folder with name: Weather (the same name of the controller)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-kGxKY6c-wG0/ThdtfPUV70I/AAAAAAAAAOU/zn7qedhwqzM/s1600/newFolder.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-kGxKY6c-wG0/ThdtfPUV70I/AAAAAAAAAOU/zn7qedhwqzM/s320/newFolder.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-id07dDE6Vb4/ThdtfQsWA2I/AAAAAAAAAOc/mFch62WTWP4/s1600/newFolder1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://1.bp.blogspot.com/-id07dDE6Vb4/ThdtfQsWA2I/AAAAAAAAAOc/mFch62WTWP4/s320/newFolder1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;10- Right click on Weather folder and choose new -&amp;gt; XML Document and name it requestWeather (the same name of the controller requesWeather() method)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-lvFVQJ-uqEE/Thdtrrt_5gI/AAAAAAAAAOk/2f6SN_waXIU/s1600/view0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-lvFVQJ-uqEE/Thdtrrt_5gI/AAAAAAAAAOk/2f6SN_waXIU/s320/view0.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JVOv-cTyrLA/ThdtrxOu54I/AAAAAAAAAOs/xQC1_3bok2I/s1600/view1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://3.bp.blogspot.com/-JVOv-cTyrLA/ThdtrxOu54I/AAAAAAAAAOs/xQC1_3bok2I/s320/view1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;11- The content of returned XML file will be multiple blocks of "forecast" tags, so I made a loop on the weatherStated list passed to this XML view by the render() method in the controller. An if-else condition is added to view an error message is case of an invalid city name.&lt;br /&gt;&lt;br /&gt;[requestWeather.xml]&lt;br /&gt;&lt;pre class="brush:xml"&gt;#{set title:'Weather Forecast' /}&lt;br /&gt;&lt;br /&gt;#{ifnot weatherStates}&lt;br /&gt;&amp;lt;forecasts&amp;gt;&lt;br /&gt;&amp;lt;error&amp;gt;city not available&amp;lt;/error&amp;gt;    &lt;br /&gt;&amp;lt;/forecasts&amp;gt;&lt;br /&gt;#{/ifnot}&lt;br /&gt;&lt;br /&gt;#{else}&lt;br /&gt;&amp;lt;forecasts&amp;gt;&lt;br /&gt;    #{list items:weatherStates, as:'weather'}&lt;br /&gt;    &amp;lt;forecast&amp;gt;&lt;br /&gt;        &amp;lt;date&amp;gt;${weather.date}&amp;lt;/date&amp;gt;&lt;br /&gt;        &amp;lt;state&amp;gt;${weather.state}&amp;lt;/state&amp;gt;&lt;br /&gt;        &amp;lt;max&amp;gt;${weather.max}&amp;lt;/max&amp;gt;&lt;br /&gt;        &amp;lt;min&amp;gt;${weather.min}&amp;lt;/min&amp;gt;&lt;br /&gt;     &amp;lt;/forecast&amp;gt;&lt;br /&gt;    #{/list}&lt;br /&gt;&amp;lt;/forecasts&amp;gt;&lt;br /&gt;#{/else}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;12- Now we are almost done. The only missing thing is defining a URL the user can use to access this service. So let's go to the conf -&amp;gt; routes file and add the following line&lt;br /&gt;&lt;br /&gt;[routes]&lt;br /&gt;&lt;pre class="brush:xml"&gt;# Request Weather Forecast&lt;br /&gt;GET     /forecast/{cityName}                    Weather.requestWeather(format:'xml')&lt;br /&gt;&lt;/pre&gt;This line defines the format concatenated to the service IP &amp;amp; port to access the weather service. I chose to add the "forecast" word first, then accept the "cityName" variable from user. When a URL with this format is called, The requestWeather method in the Weather class (the controller) will be called and will render the output as xml.&lt;br /&gt;&lt;br /&gt;13- Now the service is ready to run. Just save your work and make sure the service is running (from terminal window) and call the following two URLs to see the results:&lt;br /&gt;http://localhost:9000/forecast/cairo&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;forecasts&amp;gt;&lt;br /&gt;     &amp;lt;forecast&amp;gt;&lt;br /&gt;        &amp;lt;date&amp;gt;Fri&amp;lt;/date&amp;gt;&lt;br /&gt;        &amp;lt;state&amp;gt;Scattered Thunderstorms&amp;lt;/state&amp;gt;&lt;br /&gt;        &amp;lt;max&amp;gt;91&amp;lt;/max&amp;gt;&lt;br /&gt;        &amp;lt;min&amp;gt;74&amp;lt;/min&amp;gt;&lt;br /&gt;     &amp;lt;/forecast&amp;gt;&lt;br /&gt;     &amp;lt;forecast&amp;gt;&lt;br /&gt;        &amp;lt;date&amp;gt;Sat&amp;lt;/date&amp;gt;&lt;br /&gt;        &amp;lt;state&amp;gt;Scattered Thunderstorms&amp;lt;/state&amp;gt;&lt;br /&gt;        &amp;lt;max&amp;gt;93&amp;lt;/max&amp;gt;&lt;br /&gt;        &amp;lt;min&amp;gt;74&amp;lt;/min&amp;gt;&lt;br /&gt;     &amp;lt;/forecast&amp;gt;&lt;br /&gt;     &amp;lt;forecast&amp;gt;&lt;br /&gt;        &amp;lt;date&amp;gt;Sun&amp;lt;/date&amp;gt;&lt;br /&gt;        &amp;lt;state&amp;gt;Scattered Thunderstorms&amp;lt;/state&amp;gt;&lt;br /&gt;        &amp;lt;max&amp;gt;93&amp;lt;/max&amp;gt;&lt;br /&gt;        &amp;lt;min&amp;gt;74&amp;lt;/min&amp;gt;&lt;br /&gt;     &amp;lt;/forecast&amp;gt;&lt;br /&gt;     &amp;lt;forecast&amp;gt;&lt;br /&gt;        &amp;lt;date&amp;gt;Mon&amp;lt;/date&amp;gt;&lt;br /&gt;        &amp;lt;state&amp;gt;Scattered Thunderstorms&amp;lt;/state&amp;gt;&lt;br /&gt;        &amp;lt;max&amp;gt;94&amp;lt;/max&amp;gt;&lt;br /&gt;        &amp;lt;min&amp;gt;75&amp;lt;/min&amp;gt;&lt;br /&gt;     &amp;lt;/forecast&amp;gt;&lt;br /&gt;&amp;lt;/forecasts&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;http://localhost:9000/forecast/cair&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;forecasts&amp;gt;&lt;br /&gt;    &amp;lt;error&amp;gt;city not available&amp;lt;/error&amp;gt;&lt;br /&gt;&amp;lt;/forecasts&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note 1: A good thing about Play! Framework is that you do not need to compile anything after editing your code. Just save the edited file and refresh the requested page.&lt;br /&gt;&lt;br /&gt;Note 2: Although your service is running fine, it is still not ready for production for many reasons. For example, try the following URL:&lt;br /&gt;&lt;pre class="brush:xml"&gt;http://localhost:9000/@kill&lt;br /&gt;&lt;/pre&gt;This kills the service. And it happens because you are running in something called "dev mode" not "prod mode". Please check conf -&amp;gt; application.conf file for more details and options&lt;br /&gt;&lt;br /&gt;[application.conf]&lt;br /&gt;&lt;pre class="brush:xml"&gt;# Application mode&lt;br /&gt;# ~~~~~&lt;br /&gt;# Set to dev to enable instant reloading and other development help.&lt;br /&gt;# Otherwise set to prod.&lt;br /&gt;application.mode=dev&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Done! This was a quick tutorial to get hands into the framework. You can enjoy the documentation on their website, it is a very useful one.&lt;br /&gt;&lt;br /&gt;Download this example from &lt;a href="http://www.mediafire.com/?g3y5eigwu35l17i"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-7900179588168721955?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/7900179588168721955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/07/play-framework-tutorial.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7900179588168721955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7900179588168721955'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/07/play-framework-tutorial.html' title='Play Framework Tutorial'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-D3YVpDZZMsc/ThduljxSXgI/AAAAAAAAAO0/B9z6bpMWTco/s72-c/playframework.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-8543589144326127159</id><published>2011-07-06T13:33:00.004+02:00</published><updated>2011-07-06T18:48:23.232+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Game'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Developing My First Android Game</title><content type='html'>So, this entry is less about explaining and more about showing references. To come up with this game, I was studying and playing for a while with Qt/Python/Android code because I was not intending to come up with a real product. But anyways, it appeared that moving between languages is not that hard once you got used to it.&lt;br /&gt;&lt;br /&gt;This is the very basic beginning of the game where I was learning the basics of game logic, the complete game should better go to the market that be posted as a project (sorry about that). But I guess the the coding is not much from this point. It is all about a better architecture of game objects/logic and graphics design (activity lifecycle, levels, special items, licensed graphics ... etc).&lt;br /&gt;&lt;br /&gt;And do not worry about me posting the names and graphics, these are dummy names and graphics for learning :D&lt;br /&gt;&lt;br /&gt;Here is a look at the game:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-N6wFBzYen0A/ThQ-1LdcDdI/AAAAAAAAAN0/DidyaVnFibk/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-N6wFBzYen0A/ThQ-1LdcDdI/AAAAAAAAAN0/DidyaVnFibk/s320/Screenshot.png" width="216" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-24067d0c954fbcbd" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v8.nonxt1.googlevideo.com/videoplayback?id%3D24067d0c954fbcbd%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1332551456%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D1CB8C991569A454400A4C818633F30D8C5B4D98C.2F96CC94F8797F039C02320EA6AD56E4569FBE4D%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D24067d0c954fbcbd%26offsetms%3D5000%26itag%3Dw160%26sigh%3Dsnmba3TwqvQzi6oCjrXpJDThMFU&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v8.nonxt1.googlevideo.com/videoplayback?id%3D24067d0c954fbcbd%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1332551456%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D1CB8C991569A454400A4C818633F30D8C5B4D98C.2F96CC94F8797F039C02320EA6AD56E4569FBE4D%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D24067d0c954fbcbd%26offsetms%3D5000%26itag%3Dw160%26sigh%3Dsnmba3TwqvQzi6oCjrXpJDThMFU&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Download Project: &lt;a href="http://www.mediafire.com/?oy3r9a397td9gm7"&gt;here&lt;/a&gt;&lt;br /&gt;(if you have problems with compilation, check the "target=android-10" line in "default.properties" file)&lt;br /&gt;&lt;br /&gt;This is what I read, not all Android, but still logically helpful:&lt;br /&gt;1- &lt;a href="http://www.tonypa.pri.ee/tbw/"&gt;Tile-Based Games&lt;/a&gt;&lt;br /&gt;2- &lt;a href="http://inventwithpython.com/"&gt;Invent Your Own Computer Games with Python&lt;/a&gt;&lt;br /&gt;3- &lt;a href="http://p-xr.com/android-tutorial-how-to-make-a-basic-game-loop-and-fps-counter/"&gt;Android Tutorial: How to make a basic game loop and FPS counter&lt;/a&gt;&lt;br /&gt;4- &lt;a href="http://obviam.net/index.php/the-android-game-loop/"&gt;Against the Grain: The Android Game Loop&lt;/a&gt; (the most help I could find)&lt;br /&gt;&lt;br /&gt;Finally, this a great daily journal of an Android developer upgrading his game (Light Racer). I've read it a couple of months ago and had a great impact on how I think:&lt;br /&gt;- &lt;a href="http://www.rbgrn.net/content/215-light-racer-3d-development-journal"&gt;The Light Racer 3D Development Journal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I hope I can find the time to complete the game and post it on the market.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-8543589144326127159?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/8543589144326127159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/07/developing-my-first-android-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8543589144326127159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8543589144326127159'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/07/developing-my-first-android-game.html' title='Developing My First Android Game'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-N6wFBzYen0A/ThQ-1LdcDdI/AAAAAAAAAN0/DidyaVnFibk/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-4361142239412719549</id><published>2011-07-05T19:21:00.001+02:00</published><updated>2011-07-05T19:30:33.170+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MeeGo'/><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='Maemo'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>Nokia and Operating Systems [presentation]</title><content type='html'>This is a presentation I prepared for a small session about current Nokia devices and operating systems on them. The presentation depended on talking plus viewing, but I guess it can still be somehow useful alone.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://twitter.com/MamdouhAlshamy"&gt;Mamdouh Al-Shamy&lt;/a&gt; for introducing &lt;a href="http://prezi.com/"&gt;Prezi&lt;/a&gt; to me.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="prezi-player"&gt;&lt;style type="text/css" media="screen"&gt;.prezi-player { width: 500px; } .prezi-player-links { text-align: center; }&lt;/style&gt;&lt;object id="prezi_uk69meewxhab" name="prezi_uk69meewxhab" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="500" height="330"&gt;&lt;param name="movie" value="http://prezi.com/bin/preziloader.swf"/&gt;&lt;param name="allowfullscreen" value="true"/&gt;&lt;param name="allowscriptaccess" value="always"/&gt;&lt;param name="bgcolor" value="#ffffff"/&gt;&lt;param name="flashvars" value="prezi_id=uk69meewxhab&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"/&gt;&lt;embed id="preziEmbed_uk69meewxhab" name="preziEmbed_uk69meewxhab" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="500" height="330" bgcolor="#ffffff" flashvars="prezi_id=uk69meewxhab&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="prezi-player-links"&gt;&lt;p&gt;&lt;a title="A brief description of different OS's on Nokia devices, and how to develop applications for each OS." href="http://prezi.com/uk69meewxhab/nokia-vs-os/"&gt;Nokia vs OS&lt;/a&gt; on &lt;a href="http://prezi.com"&gt;Prezi&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-4361142239412719549?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/4361142239412719549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/07/nokia-and-operating-systems.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/4361142239412719549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/4361142239412719549'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/07/nokia-and-operating-systems.html' title='Nokia and Operating Systems [presentation]'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-8848773666509448407</id><published>2011-06-18T15:14:00.002+02:00</published><updated>2011-11-06T11:42:16.780+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='USB Modem'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Vodafone USB  Modem on Ubuntu 10.10</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;[Note: I also tried the following commands/steps on Ubuntu 11.04 from a virtual machine, but could not test the hardware. You can give it a try]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As mentioned &lt;a href="http://www.betavine.net/bvportal/resources/datacards/os/ubuntu"&gt;here&lt;/a&gt;, the last driver for Vodafone USB modem on Ubuntu is for Ubuntu 10.04, and it is a beta version. I still gave these steps a try on Ubuntu 10.10 and hoped it worked (and it did).&lt;br /&gt;&lt;br /&gt;I had to go through two ways to run the USB modem.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Way #1:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;1- Install the dependencies as mentioned on website, except for &lt;i&gt;python-gnome2-extras&lt;/i&gt; (which is not available). And also two important drivers.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;sudo apt-get install wvdial hal python-twisted python-serial python-sqlite python-tz python-gobject python-dbus python-cairo python-crypto python-gtk2 python-gnome2  lsb-release python-glade2&lt;br /&gt;sudo apt-get install usb-modeswitch ozerocdoff&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2- Download the Vodafone USB Connect folder from &lt;a href="http://www.betavine.net/repo/packages/ubuntu/Ubuntu.tgz"&gt;this link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;3- Uncompress the package and install it.&lt;br /&gt;[assuming I downloaded it in /tmp]&lt;br /&gt;&lt;pre class="brush:xml"&gt;cd /tmp&lt;br /&gt;tar xvfz Ubuntu.tgz&lt;br /&gt;cd ./Ubuntu&lt;br /&gt;sudo dpkg -i vodafone-mobile-connect_2.20.01-1_all.deb&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4- Run the application from the terminal with the command&lt;br /&gt;&lt;pre class="brush:xml"&gt;vodafone-mobile-connect-card-driver-for-linux&lt;/pre&gt;or from the Applications/Internet menu.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PiEEER93c2s/TfyfLkzvPoI/AAAAAAAAAMI/7p37NIfqios/s1600/vod1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-PiEEER93c2s/TfyfLkzvPoI/AAAAAAAAAMI/7p37NIfqios/s320/vod1.png" width="316" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-mBBGzVju1WA/TfyfnJfjL2I/AAAAAAAAAMQ/cNaRHhpAETU/s1600/vod2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-mBBGzVju1WA/TfyfnJfjL2I/AAAAAAAAAMQ/cNaRHhpAETU/s320/vod2.png" width="285" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xPoZZEws4ng/TfyfnR3QdLI/AAAAAAAAAMY/25N9C-EkKww/s1600/vod3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://4.bp.blogspot.com/-xPoZZEws4ng/TfyfnR3QdLI/AAAAAAAAAMY/25N9C-EkKww/s320/vod3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-XeQifJc6FWk/TfyfnvrPLJI/AAAAAAAAAMg/Y2CHyIEtKew/s1600/vod4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="199" src="http://4.bp.blogspot.com/-XeQifJc6FWk/TfyfnvrPLJI/AAAAAAAAAMg/Y2CHyIEtKew/s320/vod4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-yRuMWItLOZU/TfyfoIOPqPI/AAAAAAAAAMo/pLtc3689_Wc/s1600/vod5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://2.bp.blogspot.com/-yRuMWItLOZU/TfyfoIOPqPI/AAAAAAAAAMo/pLtc3689_Wc/s320/vod5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ebwH3daabrM/TfyfoDVWUuI/AAAAAAAAAMw/JOkrvCw6vZs/s1600/vod6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="http://1.bp.blogspot.com/-ebwH3daabrM/TfyfoDVWUuI/AAAAAAAAAMw/JOkrvCw6vZs/s320/vod6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qv7QWphTgAU/TfygIzWiOBI/AAAAAAAAAM4/1o7MB5CEDIc/s1600/vod7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://4.bp.blogspot.com/-qv7QWphTgAU/TfygIzWiOBI/AAAAAAAAAM4/1o7MB5CEDIc/s320/vod7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Way #2:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;After trying this and working with it, I had today the following problem: the USB modem was not recognized, and did not want to get recognized for a while (but after a couple of hours I tried again and worked fine).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-69zkAdX6bLw/TfyhyWxXAfI/AAAAAAAAANA/rhdAGHYZM8c/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-69zkAdX6bLw/TfyhyWxXAfI/AAAAAAAAANA/rhdAGHYZM8c/s320/Screenshot.png" width="286" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;So I tried to search for another solution and found that option from the connections icon to "Set up a Mobile Broadband Connection"&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Bk3xD8kI1AU/Tfyis1RefqI/AAAAAAAAANI/qKzO45Df7FA/s1600/Screenshot-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-Bk3xD8kI1AU/Tfyis1RefqI/AAAAAAAAANI/qKzO45Df7FA/s320/Screenshot-1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Jj0BDrqqoiA/TfyitJeR1TI/AAAAAAAAANQ/AEJitBYRUuM/s1600/Screenshot-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-Jj0BDrqqoiA/TfyitJeR1TI/AAAAAAAAANQ/AEJitBYRUuM/s320/Screenshot-2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TadCTOsHers/Tfyitm-T8WI/AAAAAAAAANY/86gPcd36e8s/s1600/Screenshot-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-TadCTOsHers/Tfyitm-T8WI/AAAAAAAAANY/86gPcd36e8s/s320/Screenshot-3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vpSdLEUYzmI/TfyitzNK8VI/AAAAAAAAANg/LM_CSTsuEuA/s1600/Screenshot-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://4.bp.blogspot.com/-vpSdLEUYzmI/TfyitzNK8VI/AAAAAAAAANg/LM_CSTsuEuA/s320/Screenshot-4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;[as far as I know, the plans are: Contract,Prepaid]&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-bMYGaZIxqAA/Tfyitx4sR8I/AAAAAAAAANo/XDLEoRRb8bc/s1600/Screenshot-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/-bMYGaZIxqAA/Tfyitx4sR8I/AAAAAAAAANo/XDLEoRRb8bc/s320/Screenshot-5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pjqyxlCIiik/Tfyi9sZ-h4I/AAAAAAAAANw/Ct7PUtkqbjE/s1600/Screenshot-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://3.bp.blogspot.com/-pjqyxlCIiik/Tfyi9sZ-h4I/AAAAAAAAANw/Ct7PUtkqbjE/s320/Screenshot-6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;But this way does not give me the options I use like: Usage, Speed, SMS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This was all my experience with Vodafone USB Modem on Ubuntu 10.10. I hope it helps.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-8848773666509448407?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/8848773666509448407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/06/vodafone-usb-modem-on-ubuntu-1010.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8848773666509448407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8848773666509448407'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/06/vodafone-usb-modem-on-ubuntu-1010.html' title='Vodafone USB  Modem on Ubuntu 10.10'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-PiEEER93c2s/TfyfLkzvPoI/AAAAAAAAAMI/7p37NIfqios/s72-c/vod1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-9057420135903468799</id><published>2011-06-02T14:59:00.000+02:00</published><updated>2011-06-02T14:59:13.131+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compression'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Qt Folder Compression</title><content type='html'>I needed a compression module that does not depend on anything but Qt, and I mean a module to compress a complete folder with its children. This is because I wanted the compression module to work on &lt;b&gt;any platform supported by Qt&lt;/b&gt; with no other dependencies. So I made this modules that only uses only &lt;b&gt;qCompress()&lt;/b&gt; &amp; &lt;b&gt;qUncompress()&lt;/b&gt; methods plus some logic.&lt;br /&gt;&lt;br /&gt;It is mainly a recursive algorithm that serializes data into a single file, each with its relative path to the parent folder. And deserializing is just taking binary data, creating needed subfolders, and saving the file.&lt;br /&gt;&lt;br /&gt;Download: &lt;a href="http://www.mediafire.com/?4kz4mpbnw7ixtss"&gt;QtFolderCompressor.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[FolderCompressor.h]&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#ifndef FOLDERCOMPRESSOR_H&lt;br /&gt;#define FOLDERCOMPRESSOR_H&lt;br /&gt;&lt;br /&gt;#include &amp;lt;QFile&amp;gt;&lt;br /&gt;#include &amp;lt;QObject&amp;gt;&lt;br /&gt;#include &amp;lt;QDir&amp;gt;&lt;br /&gt;&lt;br /&gt;class FolderCompressor : public QObject&lt;br /&gt;{&lt;br /&gt;    Q_OBJECT&lt;br /&gt;public:&lt;br /&gt;    explicit FolderCompressor(QObject *parent = 0);&lt;br /&gt;&lt;br /&gt;    //A recursive function that scans all files inside the source folder&lt;br /&gt;    //and serializes all files in a row of file names and compressed&lt;br /&gt;    //binary data in a single file&lt;br /&gt;    bool compressFolder(QString sourceFolder, QString destinationFile);&lt;br /&gt;&lt;br /&gt;    //A function that deserializes data from the compressed file and&lt;br /&gt;    //creates any needed subfolders before saving the file&lt;br /&gt;    bool decompressFolder(QString sourceFile, QString destinationFolder);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    QFile file;&lt;br /&gt;    QDataStream dataStream;&lt;br /&gt;&lt;br /&gt;    bool compress(QString sourceFolder, QString prefex);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;#endif // FOLDERCOMPRESSOR_H&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;[FolderCompressor.cpp]&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include &amp;quot;FolderCompressor.h&amp;quot;&lt;br /&gt;&lt;br /&gt;FolderCompressor::FolderCompressor(QObject *parent) :&lt;br /&gt;    QObject(parent)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool FolderCompressor::compressFolder(QString sourceFolder, QString destinationFile)&lt;br /&gt;{&lt;br /&gt;    QDir src(sourceFolder);&lt;br /&gt;    if(!src.exists())//folder not found&lt;br /&gt;    {&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    file.setFileName(destinationFile);&lt;br /&gt;    if(!file.open(QIODevice::WriteOnly))//could not open file&lt;br /&gt;    {&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    dataStream.setDevice(&amp;amp;file);&lt;br /&gt;&lt;br /&gt;    bool success = compress(sourceFolder, &amp;quot;&amp;quot;);&lt;br /&gt;    file.close();&lt;br /&gt;&lt;br /&gt;    return success;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool FolderCompressor::compress(QString sourceFolder, QString prefex)&lt;br /&gt;{&lt;br /&gt;    QDir dir(sourceFolder);&lt;br /&gt;    if(!dir.exists())&lt;br /&gt;        return false;&lt;br /&gt;&lt;br /&gt;    //1 - list all folders inside the current folder&lt;br /&gt;    dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs);&lt;br /&gt;    QFileInfoList foldersList = dir.entryInfoList();&lt;br /&gt;&lt;br /&gt;    //2 - For each folder in list: call the same function with folders&amp;#39; paths&lt;br /&gt;    for(int i=0; i&amp;lt;foldersList.length(); i++)&lt;br /&gt;    {&lt;br /&gt;        QString folderName = foldersList.at(i).fileName();&lt;br /&gt;        QString folderPath = dir.absolutePath()+&amp;quot;/&amp;quot;+folderName;&lt;br /&gt;        QString newPrefex = prefex+&amp;quot;/&amp;quot;+folderName;&lt;br /&gt;&lt;br /&gt;        compress(folderPath, newPrefex);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //3 - List all files inside the current folder&lt;br /&gt;    dir.setFilter(QDir::NoDotAndDotDot | QDir::Files);&lt;br /&gt;    QFileInfoList filesList = dir.entryInfoList();&lt;br /&gt;&lt;br /&gt;    //4- For each file in list: add file path and compressed binary data&lt;br /&gt;    for(int i=0; i&amp;lt;filesList.length(); i++)&lt;br /&gt;    {&lt;br /&gt;        QFile file(dir.absolutePath()+&amp;quot;/&amp;quot;+filesList.at(i).fileName());&lt;br /&gt;        if(!file.open(QIODevice::ReadOnly))//couldn&amp;#39;t open file&lt;br /&gt;        {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        dataStream &amp;lt;&amp;lt; QString(prefex+&amp;quot;/&amp;quot;+filesList.at(i).fileName());&lt;br /&gt;        dataStream &amp;lt;&amp;lt; qCompress(file.readAll());&lt;br /&gt;&lt;br /&gt;        file.close();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool FolderCompressor::decompressFolder(QString sourceFile, QString destinationFolder)&lt;br /&gt;{&lt;br /&gt;    //validation&lt;br /&gt;    QFile src(sourceFile);&lt;br /&gt;    if(!src.exists())&lt;br /&gt;    {//file not found, to handle later&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;    QDir dir;&lt;br /&gt;    if(!dir.mkpath(destinationFolder))&lt;br /&gt;    {//could not create folder&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    file.setFileName(sourceFile);&lt;br /&gt;    if(!file.open(QIODevice::ReadOnly))&lt;br /&gt;        return false;&lt;br /&gt;&lt;br /&gt;    dataStream.setDevice(&amp;amp;file);&lt;br /&gt;&lt;br /&gt;    while(!dataStream.atEnd())&lt;br /&gt;    {&lt;br /&gt;        QString fileName;&lt;br /&gt;        QByteArray data;&lt;br /&gt;&lt;br /&gt;        //extract file name and data in order&lt;br /&gt;        dataStream &amp;gt;&amp;gt; fileName &amp;gt;&amp;gt; data;&lt;br /&gt;&lt;br /&gt;        //create any needed folder&lt;br /&gt;        QString subfolder;&lt;br /&gt;        for(int i=fileName.length()-1; i&amp;gt;0; i--)&lt;br /&gt;        {&lt;br /&gt;            if((QString(fileName.at(i)) == QString(&amp;quot;\\&amp;quot;)) || (QString(fileName.at(i)) == QString(&amp;quot;/&amp;quot;)))&lt;br /&gt;            {&lt;br /&gt;                subfolder = fileName.left(i);&lt;br /&gt;                dir.mkpath(destinationFolder+&amp;quot;/&amp;quot;+subfolder);&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        QFile outFile(destinationFolder+&amp;quot;/&amp;quot;+fileName);&lt;br /&gt;        if(!outFile.open(QIODevice::WriteOnly))&lt;br /&gt;        {&lt;br /&gt;            file.close();&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;        outFile.write(qUncompress(data));&lt;br /&gt;        outFile.close();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    file.close();&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-9057420135903468799?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/9057420135903468799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/06/qt-folder-compression.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/9057420135903468799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/9057420135903468799'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/06/qt-folder-compression.html' title='Qt Folder Compression'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5281093990177820888</id><published>2011-06-01T15:47:00.002+02:00</published><updated>2011-06-01T15:59:10.439+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compression'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>ZLib Static Library for Qt/Symbian</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I've been surfing the internet looking for the zlib static library -which is missing from the Qt/Symbian SDK. I downloaded and installed some old Symbian SDKs and finally found the needed files.&lt;br /&gt;&lt;br /&gt;You can download them from &lt;a href="http://www.mediafire.com/?cmsrxzgq3n2txbj"&gt;this link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is a code example of how I used it:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;LIBS+= -lefsrv -lezlib -leikcore -lcone&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include &amp;lt;ezgzip.h&amp;gt;&lt;br /&gt;#include &amp;lt;f32file.h&amp;gt;&lt;br /&gt;#include &amp;lt;ezcompressor.h&amp;gt;&lt;br /&gt;#include &amp;lt;ezdecompressor.h&amp;gt;&lt;br /&gt;#include &amp;lt;ezfilebuffer.h&amp;gt;&lt;br /&gt;#include &amp;lt;eikenv.h&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;void CompressFileL(QString sourceFile, QString destinationFile)&lt;br /&gt;{&lt;br /&gt;    TPtrC16 aSrcFile(reinterpret_cast&amp;lt;const TUint16*&amp;gt;(sourceFile.utf16()));&lt;br /&gt;    TPtrC16 aDesFile(reinterpret_cast&amp;lt;const TUint16*&amp;gt;(destinationFile.utf16()));&lt;br /&gt;    &lt;br /&gt;    CEZFileBufferManager* fileCompressor = NULL;&lt;br /&gt;    CEZCompressor* comprsr = NULL;&lt;br /&gt;    RFs iFs = CEikonEnv::Static()-&amp;gt;FsSession();&lt;br /&gt;    RFile inFile,outFile;&lt;br /&gt;    User::LeaveIfError(inFile.Open(iFs,aSrcFile,EFileRead));&lt;br /&gt;    CleanupClosePushL(inFile);&lt;br /&gt;    User::LeaveIfError(outFile.Create(iFs,aDesFile,EFileRead | EFileWrite));&lt;br /&gt;    CleanupClosePushL(outFile);&lt;br /&gt;&lt;br /&gt;    fileCompressor = CEZFileBufferManager::NewLC(inFile,outFile);&lt;br /&gt;    comprsr = CEZCompressor::NewLC(*fileCompressor,CEZCompressor::EBestCompression);&lt;br /&gt;&lt;br /&gt;    TBool res = EFalse;&lt;br /&gt;    do&lt;br /&gt;    {&lt;br /&gt;        res = comprsr-&amp;gt;DeflateL();&lt;br /&gt;    }while(res);&lt;br /&gt;&lt;br /&gt;    CleanupStack::PopAndDestroy(4);//inputFile,outFile,fileCompressor,comprsr&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void DecompressFileL(QString sourceFile, QString destinationFile)&lt;br /&gt;{&lt;br /&gt;    TPtrC16 aSrcFile(reinterpret_cast&amp;lt;const TUint16*&amp;gt;(sourceFile.utf16()));&lt;br /&gt;    TPtrC16 aDesFile(reinterpret_cast&amp;lt;const TUint16*&amp;gt;(destinationFile.utf16()));&lt;br /&gt;    &lt;br /&gt;    CEZFileBufferManager* fileCompressor = NULL;&lt;br /&gt;    CEZDecompressor* decomprsr = NULL;&lt;br /&gt;    RFs iFs = CEikonEnv::Static()-&amp;gt;FsSession();&lt;br /&gt;    RFile inFile,outFile;&lt;br /&gt;    User::LeaveIfError(inFile.Open(iFs,aSrcFile,EFileRead));&lt;br /&gt;    CleanupClosePushL(inFile);&lt;br /&gt;    User::LeaveIfError(outFile.Create(iFs,aDesFile,EFileRead | EFileWrite));&lt;br /&gt;    CleanupClosePushL(outFile);&lt;br /&gt;&lt;br /&gt;    fileCompressor = CEZFileBufferManager::NewLC(inFile,outFile);&lt;br /&gt;    decomprsr = CEZDecompressor::NewLC(*fileCompressor);&lt;br /&gt;&lt;br /&gt;    TBool res = EFalse;&lt;br /&gt;    do&lt;br /&gt;    {&lt;br /&gt;        res = decomprsr-&amp;gt;InflateL();&lt;br /&gt;    }while(res);&lt;br /&gt;&lt;br /&gt;    CleanupStack::PopAndDestroy(4);//inputFile,outFile,fileCompressor,decomprsr&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5281093990177820888?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5281093990177820888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/06/zlib-static-library-for-qtsymbian.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5281093990177820888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5281093990177820888'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/06/zlib-static-library-for-qtsymbian.html' title='ZLib Static Library for Qt/Symbian'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-582893032013112484</id><published>2011-05-14T16:21:00.002+02:00</published><updated>2011-05-14T16:25:22.786+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tk'/><category scheme='http://www.blogger.com/atom/ns#' term='POP'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='IMAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>GMail/Hotmail Notifier (Python, Tk UI)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;This was both an exercise after learning some Python and an application I needed as a simple replacement to my dear Digsby on Ubuntu.&lt;br /&gt;&lt;br /&gt;It is an email notifier to automatically check mailbox every 60 seconds. In the case of GMail, it was no problem at all, just a couple of lines and I get the new "UnSeen" mail. But for Hotmail, it was a problem because POP3 protocol does not offer this feature. So if you use this script/application for Hotmail, notice that it will notify if any mail arrives after logging in, and notification will still be there until you log in again.&lt;br /&gt;&lt;br /&gt;The application deals with one account at a time, but I could run several instances.&lt;br /&gt;&lt;br /&gt;The script is not perfect but it did the job on both Ubuntu 10.10 and Windows 7 Professional :)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-hi4mePZgKG4/Tc57qdUVnvI/AAAAAAAAALs/M3x6E4MBdSs/s1600/hotmail_empty.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-hi4mePZgKG4/Tc57qdUVnvI/AAAAAAAAALs/M3x6E4MBdSs/s1600/hotmail_empty.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-V7ppSWbYbxA/Tc57tUNnFuI/AAAAAAAAALw/rq_f2AuaGTg/s1600/hotmail_new.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-V7ppSWbYbxA/Tc57tUNnFuI/AAAAAAAAALw/rq_f2AuaGTg/s1600/hotmail_new.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-BM_i0A9LxD4/Tc57uxuXOCI/AAAAAAAAAL0/nvtNOs3eTi0/s1600/gmail.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-BM_i0A9LxD4/Tc57uxuXOCI/AAAAAAAAAL0/nvtNOs3eTi0/s1600/gmail.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can find a compiled version of the script (for linux) here : &lt;a href="http://www.mediafire.com/?7rjlj9g67anbliy"&gt;Download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;for compiling the code, I used &lt;a href="http://www.pyinstaller.org/"&gt;PyInstaller&lt;/a&gt; :&lt;br /&gt;the process was as simple as that:&lt;br /&gt;&lt;pre class="brush:xml"&gt;adly@ubuntu:~/Documents/pyinstaller-1.5$ python Configure.py &lt;br /&gt;adly@ubuntu:~/Documents/pyinstaller-1.5$ python Makespec.py --onefile /home/adly/Documents/mail_notifier.py&lt;br /&gt;adly@ubuntu:~/Documents/pyinstaller-1.5$ python Build.py /home/adly/Documents/pyinstaller-1.5/mail_notifier/mail_notifier.spec &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;then the application was created in:&lt;br /&gt;&lt;pre class="brush:xml"&gt;/home/adly/Documents/pyinstaller-1.5/mail_notifier/dist&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Script Code:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;[mail_notifier.py] &lt;a href="http://www.mediafire.com/?bgo80kpsv7bgav7"&gt;Download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:python"&gt;from Tkinter import *&lt;br /&gt;import imaplib&lt;br /&gt;import poplib&lt;br /&gt;import re&lt;br /&gt;import time&lt;br /&gt;import threading&lt;br /&gt;&lt;br /&gt;#GUI root&lt;br /&gt;root = Tk()&lt;br /&gt;&lt;br /&gt;#variables connecting between core and GUI&lt;br /&gt;email = StringVar()&lt;br /&gt;password = StringVar()&lt;br /&gt;status = StringVar()&lt;br /&gt;&lt;br /&gt;def checkMail(*args):&lt;br /&gt;    #check for GMail&lt;br /&gt;    if re.search(r'@gmail.', email.get()):&lt;br /&gt;        okbutton.configure(state=DISABLED)&lt;br /&gt;        gmail = gmailThread()&lt;br /&gt;        gmail.setDaemon(True)&lt;br /&gt;        gmail.start()&lt;br /&gt;    #check for Hotmail/Live accounts&lt;br /&gt;    elif re.search(r'@hotmail.', email.get()) or re.search(r'@live.', email.get()):&lt;br /&gt;        okbutton.configure(state=DISABLED)&lt;br /&gt;        msn = msnThread()&lt;br /&gt;        msn.setDaemon(True)&lt;br /&gt;        msn.start()&lt;br /&gt;    else:&lt;br /&gt;        status.set("Only GMail/Hotmail/Live accounts accepted!")&lt;br /&gt;&lt;br /&gt;class gmailThread (threading.Thread):&lt;br /&gt;    def run(self):&lt;br /&gt;        try:&lt;br /&gt;            status.set("Checking inbox. Please wait ...")&lt;br /&gt;            &lt;br /&gt;            #gmail only takes username, so some splitting needed&lt;br /&gt;            usernameString = email.get().split('@')[0]&lt;br /&gt;            passwordString = password.get()&lt;br /&gt;            &lt;br /&gt;            #Working with IMAP protocol in GMail allows to get the number of &lt;br /&gt;            #"UnSeen" mail. So the Gmail part of this script is just straight &lt;br /&gt;            #forward.&lt;br /&gt;            &lt;br /&gt;            while 1==1:&lt;br /&gt;                mailObj = imaplib.IMAP4_SSL('imap.gmail.com','993')&lt;br /&gt;                mailObj.login(usernameString, passwordString)&lt;br /&gt;                mailObj.select()&lt;br /&gt;                unreadMail = str(len(mailObj.search(None, 'UnSeen')[1][0].split()))&lt;br /&gt;                mailObj.close()&lt;br /&gt;                mailObj.logout()&lt;br /&gt;                msg = email.get()+"("+unreadMail+")"&lt;br /&gt;                status.set(msg)&lt;br /&gt;                #sleep for 60 sec&lt;br /&gt;                time.sleep(60)&lt;br /&gt;        except:&lt;br /&gt;            okbutton.configure(state=NORMAL)&lt;br /&gt;            status.set("Error occurred! Please check credentials or internet connection.")&lt;br /&gt;&lt;br /&gt;class msnThread (threading.Thread):&lt;br /&gt;    def run(self):&lt;br /&gt;        try:&lt;br /&gt;            status.set("You will get notification of any new mail(s) since login ...")&lt;br /&gt;            &lt;br /&gt;            usernameString = email.get()&lt;br /&gt;            passwordString = password.get()&lt;br /&gt;            &lt;br /&gt;            #get list of email unique ids&lt;br /&gt;            mailObj = poplib.POP3_SSL('pop3.live.com', 995)&lt;br /&gt;            mailObj.user(usernameString)&lt;br /&gt;            mailObj.pass_(passwordString)&lt;br /&gt;            mailList = mailObj.uidl()[1]&lt;br /&gt;            mailObj.quit()&lt;br /&gt;            &lt;br /&gt;            #the only thing to do is to get the id of newest email and&lt;br /&gt;            #check if it exists in the list above, if it does not exist&lt;br /&gt;            #then it is a new email. So actually user can only notice &lt;br /&gt;            #any new mail that came after the first login, this is all&lt;br /&gt;            #because POP3 protocol does not give data about new mail and&lt;br /&gt;            #what i made was just a simple solution&lt;br /&gt;            while 1==1:&lt;br /&gt;                time.sleep(60)&lt;br /&gt;                mailObj = poplib.POP3_SSL('pop3.live.com', 995)&lt;br /&gt;                mailObj.user(usernameString)&lt;br /&gt;                mailObj.pass_(passwordString)&lt;br /&gt;                newestMailId = mailObj.uidl()[1][-1]&lt;br /&gt;                if newestMailId not in mailList:&lt;br /&gt;                    status.set("New mail(s) arrived since last login!")&lt;br /&gt;                mailObj.quit()&lt;br /&gt;                &lt;br /&gt;        except:&lt;br /&gt;            okbutton.configure(state=NORMAL)&lt;br /&gt;            status.set("Error occurred! Please check credentials or internet connection.")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;########## GUI section ###########&lt;br /&gt;&lt;br /&gt;root.title("GMail/Hotmail Notifier")&lt;br /&gt;&lt;br /&gt;mainframe = Frame(root)&lt;br /&gt;mainframe.grid(column=0, row=0, sticky=(N, W, E, S))&lt;br /&gt;mainframe.columnconfigure(0, weight=1)&lt;br /&gt;mainframe.rowconfigure(0, weight=1)&lt;br /&gt;&lt;br /&gt;#email&lt;br /&gt;emailLabel = Label(mainframe, text="Email:")&lt;br /&gt;emailLabel.grid(column=1, row=1, sticky=W)&lt;br /&gt;emailEntry = Entry(mainframe, width=30, textvariable=email)&lt;br /&gt;emailEntry.grid(column=2, row=1, sticky=(W,E))&lt;br /&gt;&lt;br /&gt;#password&lt;br /&gt;passwordLabel = Label(mainframe, text="Password:")&lt;br /&gt;passwordLabel.grid(column=1, row=2, sticky=W)&lt;br /&gt;passwordEntry = Entry(mainframe, width=30, textvariable=password, show="*")&lt;br /&gt;passwordEntry.grid(column=2, row=2, sticky=(W,E))&lt;br /&gt;&lt;br /&gt;#ok button&lt;br /&gt;okbutton = Button(mainframe, text="ok", command=checkMail )&lt;br /&gt;okbutton.grid(column=2, row=3, sticky=E)&lt;br /&gt;&lt;br /&gt;#status bar&lt;br /&gt;statusLabel = Label(mainframe, textvariable=status)&lt;br /&gt;statusLabel.grid(column=1, row=4, columnspan=2, sticky=W)&lt;br /&gt;&lt;br /&gt;#capture focus on start&lt;br /&gt;emailEntry.focus()&lt;br /&gt;&lt;br /&gt;#capture the "enter" key for usability&lt;br /&gt;emailEntry.bind('&amp;lt;Return&amp;gt;', checkMail)&lt;br /&gt;passwordEntry.bind('&amp;lt;Return&amp;gt;', checkMail)&lt;br /&gt;root.bind('&amp;lt;Return&amp;gt;', checkMail)&lt;br /&gt;&lt;br /&gt;root.mainloop()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Resources:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://www.tutorialspoint.com/python/index.htm"&gt;Tutorials Point - Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/aix/library/au-threadingpython/"&gt;DeveloperWorks: Practical Threaded Programming with Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/190010/daemon-threads-explanation"&gt;StackOverflow: Daemon Threads Explanation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.java2s.com/Code/Python/CatalogPython.htm"&gt;Java2S: PythonExamples&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt; &lt;a href="http://infohost.nmt.edu/tcc/help/pubs/tkinter/"&gt;Tkinter 8.4 reference: a GUI for Python&lt;/a&gt; [this is the current code for my GUI]&lt;/li&gt;&lt;li&gt;&lt;a href="http://effbot.org/tkinterbook/"&gt;An Introduction to Tkinter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://effbot.org/zone/python-compile.htm"&gt;Compiling Python Code&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tkdocs.com/tutorial/index.html"&gt;TkDocs&lt;/a&gt; [note: faced some problems as I needed Python3 which conflicted with some other core code]&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.python.org/moin/TkInter"&gt;Python.org: Tkinter&lt;/a&gt; [some helpful links]&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/953561/check-unread-count-of-gmail-messages-with-python"&gt;StackOverflow: Check unread count of Gmail messages with Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://forum.k0d.cc/showthread.php?t=2887&amp;amp;s=848b62b0b2b6d11c92d845b99a0aecb5"&gt;k0d.cc: Multi Account Checker Gmail-Hotmail-Yahoo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/3251237/python-hotmail-login"&gt;StackOverflow: Python Hotmail login&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Python docs: &lt;a href="http://docs.python.org/library/imaplib.html"&gt;IMAP4 protocol&lt;/a&gt; - &lt;a href="http://docs.python.org/library/poplib.html"&gt;POP3 protocol&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-582893032013112484?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/582893032013112484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/05/gmailhotmail-notifier-python-tk-ui.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/582893032013112484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/582893032013112484'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/05/gmailhotmail-notifier-python-tk-ui.html' title='GMail/Hotmail Notifier (Python, Tk UI)'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-hi4mePZgKG4/Tc57qdUVnvI/AAAAAAAAALs/M3x6E4MBdSs/s72-c/hotmail_empty.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-4817397625296992800</id><published>2011-04-25T16:39:00.000+02:00</published><updated>2011-04-25T16:39:20.649+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AI'/><category scheme='http://www.blogger.com/atom/ns#' term='Career Shift'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>My Career Shift - II</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Okay, I made a schedule for the next phase. It is about &lt;b&gt;three months long&lt;/b&gt;, but I hope it is useful as I thought. &lt;b&gt;The main objectives of this phase are:&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Strengthen my knowledge of Python.&lt;/li&gt;&lt;li&gt;Learn and apply the basics of AI, so I can decide the following phase depending on the current one.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;The schedule is as follows:&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;It starts from 1 May 2011.&lt;/li&gt;&lt;li&gt;OS to use is Ubuntu 11.04. Just a normal usage to get used to it, so whenever I have to use it technically, I don't start from scratch. And because I want to be be free of cracked applications.&lt;/li&gt;&lt;li&gt;2-week course to revise the basics of Python and cover the main modules. [1:14 May]&lt;/li&gt;&lt;li&gt;1-week project to apply what I learned. [15:21 May] [project not decided yet]&lt;/li&gt;&lt;li&gt;8-week course to start AI from the beginning. I didn't go deep anyways, but this time with applying the examples using Python. [22May:16July]&lt;/li&gt;&lt;li&gt;Reading about Software Product Management will get in the queue with other general books I read.&lt;/li&gt;&lt;li&gt;I should not put in mind the targeted platform for my future applications. I can watch the market carefully. But choosing the platform is not part of the current phase.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Resources:&lt;/b&gt;&lt;br /&gt;I try to use only free resources ...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Choosing Python, not Ruby:&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://www.wikivs.com/wiki/Python_vs_Ruby"&gt;Python vs Ruby&lt;/a&gt; [WikiVS, the open comparison website]&lt;/li&gt;&lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?PythonVsRuby"&gt;Python Vs Ruby&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Learning Python:&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=tKTZoB2Vjuk&amp;amp;playnext=1&amp;amp;list=PL555AC8FD2C9C8EEB"&gt;Google Python Class&lt;/a&gt; [YouTube Videos]&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=4Mf0h3HphEA&amp;amp;playnext=1&amp;amp;list=PLEA1FEF17E1E5C0DA"&gt;Python Programming Tutorials&lt;/a&gt; [YouTube Videos]&lt;/li&gt;&lt;li&gt;&lt;a href="http://diveintopython.org/index.html"&gt;Dive Into Python&lt;/a&gt; [Book]&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Learning AI:&lt;/b&gt;&lt;br /&gt;I haven't decided the best place to learn AI yet. But till now the &lt;a href="http://en.wikipedia.org/wiki/NPTEL"&gt;NPTEL&lt;/a&gt; course was an average one. I still have some time to find better books/resources.&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=fV2k2ivttL0&amp;amp;playnext=1&amp;amp;list=PLA5CF9FBD7BC7E2ED"&gt;NPTEL Computer Sc - Artificial Intelligence&lt;/a&gt; [YouTube Videos]&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If you have comments/suggestions, you are more than welcomed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-4817397625296992800?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/4817397625296992800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/04/my-career-shift-ii.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/4817397625296992800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/4817397625296992800'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/04/my-career-shift-ii.html' title='My Career Shift - II'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5359290939805966472</id><published>2011-04-24T19:03:00.001+02:00</published><updated>2011-04-25T16:40:28.727+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Career Shift'/><title type='text'>My Career Shift - I</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;Ok, this post, or maybe more, is not about coding or applications but more about technology /knowledge and where can I go next in my life. Just thinking loudly.&lt;br /&gt;&lt;br /&gt;After graduation, less than a year ago, I decided to try new technologies until I get a job. But the job came fast enough, thank God, to get me into real life of software. I developed Qt applications and thought that Qt is coming to the top as a crossplatform framework (Windows / Linux / MacOS / Symbian / MeeGo), but suddenly Nokia dropped Symbian &amp;amp; MeeGo from its future main mobile phones, and maybe used in Linux tablets. Now Qt seems to be a promising framework but outside mobile applications. And since the current big bubble is the mobile applications bubble, I lost a big opportunity that could come from this framework.&lt;br /&gt;&lt;br /&gt;I forgot the plans of learning other technologies and now I have to pay more time and effort to compensate the lost months of nothing but Qt.&lt;br /&gt;&lt;br /&gt;What are my options?&lt;br /&gt;&lt;br /&gt;The best career is the one that I like and can give me a good life. So I can search for the intersection points between what I like and what technologies or career paths the market needs/provides.&lt;br /&gt;&lt;br /&gt;This is a shortened list of what came in my mind till now. I just listened to my mind and judged:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Artificial Intelligence&lt;/li&gt;&lt;li&gt;Game Development&lt;/li&gt;&lt;li&gt;Android&lt;/li&gt;&lt;li&gt;Tablets&lt;/li&gt;&lt;li&gt;Scripting (Python/Ruby)&lt;/li&gt;&lt;li&gt;Linux Systems Engineering&lt;/li&gt;&lt;li&gt;Software Product Management&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;… These are the loudest sounds in my head, so what is better for my career shift?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Artificial Intelligence:&lt;/b&gt;&lt;br /&gt;This is my biggest dream of all. Applications that evolve and change with their users, where every user has a different experience for the same application. I started to revise the basics of AI a couple of months ago, but stopped in the rush of life. So it is the field with the top priority right now.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Game Development:&lt;/b&gt;&lt;br /&gt;This is a nice and amusing way to practice everything related to software development. I consider it the ultimate software product, where catchy ideas, AI, UX, performance meet. Also games have a great effect on the ideas and thoughts of a society, so it can be a powerful tool to spread certain ideas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tablets &amp;amp; Android:&lt;/b&gt;&lt;br /&gt;As I said before, news is popping everyday about the increase of mobile &amp;amp; tablet applications. Browsing, reading, playing, chatting …etc. And what is more growing and popular than the Android OS and iOS? Mobiles and tablets are growing in specifications that the difference between them is decreasing to be a matter of physical size. And by looking at the application stores, the good application will somehow find its way with support of cheap marketing like the social networks. The Android OS seems a better choice as is it not adopting the concept of Apple -which I hate- about creating their own closed kingdom and all developers are peasants who follow all the instructions to get their applications accepted.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scripting (Python/Ruby):&lt;/b&gt;&lt;br /&gt;I’ve started to learn Python about a year ago, but not enough to call myself a good python programmer. Although it saved my day twice –as I can remember- and still doing, I didn’t give it a chance to get deeper in my life. The good and stylish opponent is Ruby. I found that it is a good choice with great power, especially when combined with Rails, and now it seems to be going for mobile apps too. After some search I decided that Python would still be a good choice with big number of APIs and communities, and don’t forget the Google support for Python.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linux Systems Engineering:&lt;/b&gt;&lt;br /&gt;Ok, this is really looks weird between all other topics. I’ve heard of it a few weeks ago, but it is neither suitable for me nor my very small experience. Let’s skip this and maybe think of it in the next phase of my life.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software Product Management:&lt;/b&gt;&lt;br /&gt;And this is another new topic I’ve heard about and found important and interesting. This is not coding but who said that software products are only about coding?&lt;br /&gt;&lt;br /&gt;.. So, these were the thoughts inside my mind. Now I have to decide a plan for the next few months of my life.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5359290939805966472?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5359290939805966472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/04/my-career-shift-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5359290939805966472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5359290939805966472'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/04/my-career-shift-i.html' title='My Career Shift - I'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-6356638906925216662</id><published>2011-04-02T21:09:00.000+02:00</published><updated>2011-04-02T21:09:26.181+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel Port'/><title type='text'>Interfacing Parallel Port using Qt</title><content type='html'>I've been in a situation today where I wanted a quick app to interact with the parallel port. Although it is no big deal, it was my first time. So I wanted to document it and make a simple application.&lt;br /&gt;&lt;br /&gt;There is no Qt API to access the parallel port, so there was no other way but using an extra DLL: &lt;b&gt;inpout32.dll&lt;/b&gt;. The core of code in brief is like that:&lt;br /&gt;&lt;br /&gt;Note: the DLL was not available by default. So I downloaded it and Had the choice to put it in C:\Windows\System32 or just point to it in the application's folder.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*.h&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;/* prototype (function typedef) for DLL function Inp32: */&lt;br /&gt;typedef short _stdcall (*inpfuncPtr)(short portaddr);&lt;br /&gt;typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;private:&lt;br /&gt;    HINSTANCE hLib;&lt;br /&gt;    inpfuncPtr inp32;&lt;br /&gt;    oupfuncPtr oup32;&lt;br /&gt;    short portData; //must be in hex&lt;br /&gt;    int portNumber; //must be in hex&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;*.cpp&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;/* Load the library */&lt;br /&gt;hLib = LoadLibraryA(&amp;quot;inpout32.dll&amp;quot;);&lt;br /&gt;&lt;br /&gt;/* get the address of the function */&lt;br /&gt;inp32 = (inpfuncPtr) GetProcAddress(hLib, &amp;quot;Inp32&amp;quot;);&lt;br /&gt;oup32 = (oupfuncPtr) GetProcAddress(hLib, &amp;quot;Out32&amp;quot;);&lt;br /&gt;&lt;/pre&gt;Note: I faced an encoding error with &lt;b&gt;LoadLibrary()&lt;/b&gt;. so I used &lt;b&gt;LoadLibraryA()&lt;/b&gt; instead.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reading&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;portData = (inp32)(portNumber);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Writing&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;(oup32)(portNumber, portData);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A useful hint for converting from QString to Hex/Binary, and vise versa&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//QString to Hex&lt;br /&gt;portNumber = myString.toInt(&amp;amp;ok, 16);&lt;br /&gt;&lt;br /&gt;//Hex to QString&lt;br /&gt;myString = QString::number(portData, 16);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; Icons in this application are free! &lt;a href="http://www.freedesktop.org/"&gt;http://www.freedesktop.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-YP4DY_yYqg4/TZdvyo1R3iI/AAAAAAAAAK0/MHWm9buouO0/s1600/ppi.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="216" width="320" src="http://1.bp.blogspot.com/-YP4DY_yYqg4/TZdvyo1R3iI/AAAAAAAAAK0/MHWm9buouO0/s320/ppi.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?z53s76t5qz1zfo9"&gt;Download source code&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?4yt1ba81b58bt7y"&gt;Download executable&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resources:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/4105472/parallel-port-output-on-windows-xp-using-qt4-and-c"&gt;Parallel Port Output On Windows XP using Qt4 and C++&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.qtcentre.org/threads/12641-MinGW-char-to-WCHAR"&gt;MinGW: char to WCHAR&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-6356638906925216662?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/6356638906925216662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/04/interfacing-parallel-port-using-qt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/6356638906925216662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/6356638906925216662'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/04/interfacing-parallel-port-using-qt.html' title='Interfacing Parallel Port using Qt'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-YP4DY_yYqg4/TZdvyo1R3iI/AAAAAAAAAK0/MHWm9buouO0/s72-c/ppi.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-8818657307572404819</id><published>2011-03-26T14:38:00.003+02:00</published><updated>2011-03-26T14:46:05.468+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Batch'/><title type='text'>Batch Files Tutorial</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;[&lt;/b&gt;This was a tutorial I prepared in December 2009. And I thought about posting it for the record. The expected reader of this tutorial was a person who knows nothing about batch files. It introduced the very basics to make batch files.&lt;b&gt;]&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here is a quick tutorial.. it will not take more than 1hr to learn.&lt;br /&gt;&lt;br /&gt;What are batch files? Batch files are not programs, they are lists of command line instructions that are batched together in one file. For the most part, you could manually type in the lines of a batch file and get the same results, but batch files make this work easy. Batch files do not contain "compiled" code like C++ so they can be opened, copied and edited.&lt;br /&gt;&lt;br /&gt;Batch files can save time by automating specific actions taken on the computer down to one simple click. They can also potentially hide damaging code, so a good understanding of what they are, how they work, and how to create your own, is crucial to today's IT force.&lt;br /&gt;&lt;br /&gt;If you look in your C:\, C:\WINDOWS, or C:\WINNT folder you will see a multitude of .BAT, .SYS, .CFG, .INF and other types. These are all kinds of batch files. This may shock you, but while most applications are writen in Basic or C++ they sit on a mountain of batch files. Batch files are the backbone of the Windows operating system, delete them and you've effectively disabled the OS. There is a reason for this. The system batch files on each computer are unique the that computer and change each time a program is loaded. The operating system must have access to these files and be able to add and delete instructions from them.&lt;br /&gt;&lt;br /&gt;To create a simple batch file, all you need is a single command you want to run, typed into a text file and saved with the .BAT extension, like 'mybatchfile.bat'. Double click this file and it will run your command. Let's test it out...&lt;br /&gt;&lt;br /&gt;Here is an example. Run it and see what will happen and by the end of this topic you will know what it does.(solution is at the end of this topic) : &lt;a href="http://www.mediafire.com/?t0xser7a2o6y11y"&gt;Download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Topics:&lt;/b&gt;&lt;br /&gt;I- Creating batch files&lt;br /&gt;II- Anatomy of a batch file&lt;br /&gt;III- Additional batch file commands.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;b&gt;I- Creating batch files&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Here is a very simple one&lt;br /&gt;1. Open a text editor like notepad(NOT word or wordpad)&lt;br /&gt;2. Type or copy this text:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@ECHO OFF&lt;br /&gt;ECHO.&lt;br /&gt;ECHO This is a batch file&lt;br /&gt;ECHO.&lt;br /&gt;PAUSE&lt;br /&gt;CLS&lt;br /&gt;EXIT &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. Save this as batchfile.bat, make sure there is no .txt extension after the .bat&lt;br /&gt;4. Double-click the file icon&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;1. First open an explorer window to your c: drive, using Windows Explorer or 'my computer.' Arrange the window so you can see both your desktop and your c: drive contents.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bPtGu50c2KA/TY3V98_8wlI/AAAAAAAAAKc/PB4Xun0FHKA/s1600/batchfile_desk.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" src="http://3.bp.blogspot.com/-bPtGu50c2KA/TY3V98_8wlI/AAAAAAAAAKc/PB4Xun0FHKA/s320/batchfile_desk.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;2. Open the notepad application. In the blank notepad window, type:&lt;br /&gt;&lt;pre class="brush:xml"&gt;md c:\testsource&lt;br /&gt;md c:\testbackup &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The 'md' command instructs the system to create a directory using a name and location following the command.&lt;br /&gt;&lt;br /&gt;3. Now go to 'file' and 'save as'. Save your first batch file on the desktop as 'myfirstbatch.bat'.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NifxNp2Fuj8/TY3WNH63qaI/AAAAAAAAAKk/l9hjAtOPNaA/s1600/batchfile_saveas.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="52" src="http://3.bp.blogspot.com/-NifxNp2Fuj8/TY3WNH63qaI/AAAAAAAAAKk/l9hjAtOPNaA/s320/batchfile_saveas.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;4. Close notepad and you'll see that 'myfirstbatch.bat' has appeared on the desktop. Double click the file to run it. Check your c: window. The 'testsource' and 'testbackup' directories have appeared. Your simple batch file is a success! Delete the 'myfirstbatch.bat' file from your desktop.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Now we are going to create a useful batch file that will copy all the files in your 'c:\testsource' directory into your 'c:\testbackup' directory each time you run it. We'll also make it so that the next time you run that batch file, it will only copy the files that have changed and new files, not every single one in the 'c:\testsource' directory. Ideally you'd use this batch file to copy your files onto a second hard drive or removable media like a USB key&lt;br /&gt;&lt;br /&gt;1. First we need to create a couple of dummy files in our c:\testsource directory to give us something to work with:&lt;br /&gt;&lt;br /&gt;2. Navigate to your c:\testsource directory in Explorer and right click on the empty space inside. Select 'new\text document.' Call your new text file 'testdoc1'. Now right click again and create a new bitmap image. Call your image 'testbit1'. Your c:\testsource directory should now have the following contents:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-02hY5LTUBA8/TY3WwD7B_CI/AAAAAAAAAKs/oYtUvnSNKGE/s1600/batchfile_testsource.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="84" src="http://1.bp.blogspot.com/-02hY5LTUBA8/TY3WwD7B_CI/AAAAAAAAAKs/oYtUvnSNKGE/s320/batchfile_testsource.gif" width="152" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;3. Now to create a batch file to backup these files into your c:\testbackup directory automatically. Open up notepad and type the following:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@echo off&lt;br /&gt;xcopy c:\testsource c:\testbackup /m /e /y&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The '@echo off' line tells the computer not to display anything onscreen when it runs this batch file.&lt;br /&gt;&lt;br /&gt;The second line uses the xcopy command to copy all contents of the c:\testsource' directory to c:\testbackup the first time the batch file is run. The second time and all remaining times, it will only copy new files and files which have changed since it was last run. It will not copy unchanged files which it previously copied, even if you delete the copies it made from the c:\testbackup' directory.&lt;br /&gt;&lt;br /&gt;4. Now save your batch file as 'testbackup.bat' on your desktop and double click it to run the script.&lt;br /&gt;&lt;br /&gt;Check the contents of your c:\testbackup directory. It should now have copies of the two files you created in c:\testsource. Good stuff. Now open 'testdoc1' in your c:\testsource directory and add some text then save it.&lt;br /&gt;&lt;br /&gt;5. Run your testbackup.bat batch file again, and go to the 'testdoc1' file in the c:\testbackup folder. It should have been updated with the changes you made in the other folder.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;b&gt;II - Anatomy of a batch file&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;As you've seen, batch files are essentially simple programs, using the built in command prompt commands as a programming 'library'.&lt;br /&gt;&lt;br /&gt;Each line in a batch file is executed sequentially, and they do not have to be numbered or otherwise identified. The computer simply reads the whole file from top to bottom and performs any commands the batch file contains.&lt;br /&gt;&lt;br /&gt;In addition to the standard command prompt commands that can be used in batch files, there are a few additional extras like the '@ECHO off' command we used in the last batch file we created. These can be used to modify how a batch file works.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;b&gt;III - Additional Batch file commands:&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Any valid DOS command may be placed in a batch file, these commands are for setting-up the structure and flow of a batch file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CLS&lt;/b&gt;&lt;br /&gt;Clears the screen&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EXIT&lt;/b&gt;&lt;br /&gt;Exits the command-line process when the batch file terminates&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BREAK&lt;/b&gt;&lt;br /&gt;When turned on, batch file will stop if the user presses &amp;lt; Ctrl &amp;gt;-&amp;lt; Break &amp;gt; when turned off, the script will continue until done.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;BREAK=ON&lt;br /&gt;BREAK=OFF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CALL&lt;/b&gt;&lt;br /&gt;Calls another batch file and then returns control to the first when done.&lt;br /&gt;&lt;pre class="brush:xml"&gt;CALL C:\WINDOWS\NEW_BATCHFILE.BAT&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Calls another program&lt;br /&gt;&lt;pre class="brush:xml"&gt;CALL C:\calc.exe&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CHOICE&lt;/b&gt;&lt;br /&gt;Allows user input. Default is Y or N.&lt;br /&gt;You may make your own choice with the /C: switch. This batch file displays a menu of three options. Entering 1, 2 or 3 will display a different row of symbols. Take note that the IF ERRORLEVEL statements must be listed in the reverse order of the selection. CHOICE is not recognized in some versions of NT.&lt;br /&gt;&lt;pre class="brush:xml"&gt;@ECHO OFF&lt;br /&gt;ECHO 1 - Stars&lt;br /&gt;ECHO 2 - Dollar Signs&lt;br /&gt;ECHO 3 - Crosses&lt;br /&gt;&lt;br /&gt;CHOICE /C:123&lt;br /&gt;&lt;br /&gt;IF errorlevel 3 goto CRS&lt;br /&gt;IF errorlevel 2 goto DLR&lt;br /&gt;IF errorlevel 1 goto STR&lt;br /&gt;&lt;br /&gt;:STR&lt;br /&gt;ECHO *******************&lt;br /&gt;ECHO.&lt;br /&gt;PAUSE&lt;br /&gt;CLS&lt;br /&gt;EXIT&lt;br /&gt;&lt;br /&gt;:DLR&lt;br /&gt;ECHO $$$$$$$$$$$$$$$$$$$$&lt;br /&gt;ECHO.&lt;br /&gt;PAUSE&lt;br /&gt;CLS&lt;br /&gt;EXIT&lt;br /&gt;&lt;br /&gt;:CRS&lt;br /&gt;ECHO +++++++++++++++++++++&lt;br /&gt;ECHO.&lt;br /&gt;PAUSE&lt;br /&gt;CLS&lt;br /&gt;EXIT&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FOR...IN...DO&lt;/b&gt;&lt;br /&gt;Runs a specified command for each file in a set of files. FOR %%dosvar IN (set of items) DO command or command strcuture.&lt;br /&gt;%%dosvar is the variable that will hold items in the list, usually a single leter: %%a or %%b. Case sensitive, %%a is different from %A. The items in the (set) are assigned to this variable each time the loop runs.&lt;br /&gt;&lt;br /&gt;(set of items) is one item or multiple items seperated by commas that determine how many times the loop runs.&lt;br /&gt;&lt;br /&gt;command or command strcuture is the operation you want to perform for each item in the list.&lt;br /&gt;&lt;br /&gt;This code will run through the set (A, B, C), when it gets to B it will print the message: "B is in the set!"&lt;br /&gt;&lt;pre class="brush:xml"&gt;FOR %%b in (A, B, C) DO IF %%b == B echo B is in the set!&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This line will print the contents of C:\windows\desktop&lt;br /&gt;&lt;pre class="brush:xml"&gt;FOR %%c in (C:\windows\desktop\*.:$ DO echo %%c&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, you may create your own list or use various objects like files to determine the loop run.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GOTO&lt;/b&gt;&lt;br /&gt;To go to a different section in a batch file. You may create different sections by preceding the name with a colon.&lt;br /&gt;:SUBSECTION&lt;br /&gt;Programmers may find this similar to funtions or sub-routines.&lt;br /&gt;&lt;pre class="brush:xml"&gt;@ECHO OFF&lt;br /&gt;:FIRSTSECTION&lt;br /&gt;ECHO This is the first section&lt;br /&gt;PAUSE&lt;br /&gt;GOTO SUBSECTION&lt;br /&gt;&lt;br /&gt;:SUBSECTION&lt;br /&gt;ECHO This is the subsection&lt;br /&gt;PAUSE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Skip sections of a batch file&lt;br /&gt;&lt;pre class="brush:xml"&gt;@ECHO OFF&lt;br /&gt;:ONE&lt;br /&gt;ECHO This is ONE, we'll skip TWO&lt;br /&gt;PAUSE&lt;br /&gt;GOTO THREE&lt;br /&gt;&lt;br /&gt;:TWO&lt;br /&gt;ECHO This is not printed&lt;br /&gt;&lt;br /&gt;:THREE&lt;br /&gt;ECHO We skipped TWO!&lt;br /&gt;PAUSE&lt;br /&gt;GOTO END&lt;br /&gt;:END&lt;br /&gt;CLS&lt;br /&gt;EXIT&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Looping with GOTO&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;:BEGIN&lt;br /&gt;REM Endless loop, Help!!&lt;br /&gt;GOTO BEGIN&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IF, IF EXIST, IF NOT EXIST&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;IF EXIST C:\tempfile.txt&lt;br /&gt;DEL C:\tempfile.txt&lt;br /&gt;IF NOT EXIST C:\tempfile.txt&lt;br /&gt;COPY C:\WINDOWS\tempfile.txt C:\tempfile.txt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Use with "errorlevel"&lt;/b&gt;&lt;br /&gt;The generic paramater errorlevel refers to the output another program or command and is also used with the CHOICE structure. If you try and run a command in a batch file and produces an error, you can use errorlevel to accept the returned code and take some action. For example, let's say you have a batch file that deletes some file.&lt;br /&gt;&lt;pre class="brush:xml"&gt;COPY C:\file.txt C:\file2.txt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If "file.txt" doesn't exist, you will get the error: COULD NOT FIND C:\FILE.TXT. Instead, use a structure like this to create the file, then copy it by accepting the error.&lt;br /&gt;&lt;pre class="brush:xml"&gt;@ECHO OFF&lt;br /&gt;:START&lt;br /&gt;COPY file.txt file2.txt&lt;br /&gt;IF errorlevel 1 GOTO MKFILE&lt;br /&gt;GOTO :END&lt;br /&gt;&lt;br /&gt;:MKFILE&lt;br /&gt;ECHO file text&amp;gt;file.txt&lt;br /&gt;GOTO START&lt;br /&gt;&lt;br /&gt;:END&lt;br /&gt;ECHO Quitting&lt;br /&gt;PAUSE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;an errorlevel of 1 means there was an error, errorlevel of 0 means there was no error. You can see these levels by adding this line after any line of commands:&lt;br /&gt;&lt;pre class="brush:xml"&gt;ECHO errorlevel: %errorlevel%&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PAUSE&lt;/b&gt;&lt;br /&gt;Pauses until the user hits a key.&lt;br /&gt;This displays the familiar "Press any key to continue..." message.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;REM&lt;/b&gt;&lt;br /&gt;Allows a remark to be inserted in the batch script.&lt;br /&gt;&lt;pre class="brush:xml"&gt;REM DIR C:\WINDOWS&lt;br /&gt;&lt;/pre&gt;Not run as a command&lt;br /&gt;&lt;pre class="brush:xml"&gt;DIR C:\WINDOWS&lt;br /&gt;&lt;/pre&gt;Run as a command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ECHO&lt;/b&gt;&lt;br /&gt;Setting ECHO "on" will display the batch process to the screen, setting it to "off" will hide the batch process.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@ECHO OFF&lt;/pre&gt;Commands are NOT displayed&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;@ECHO ON&lt;/pre&gt;Commands are displayed&lt;br /&gt;&lt;br /&gt;ECHO can also be used in batch file to send output to the screen:&lt;br /&gt;&lt;pre class="brush:xml"&gt;@ECHO OFF&lt;br /&gt;ECHO.&lt;br /&gt;ECHO Hi, this is a batch file&lt;br /&gt;ECHO.&lt;br /&gt;PAUSE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;ECHO.&lt;/pre&gt;sends a blank line.&lt;br /&gt;&lt;br /&gt;To echo special characters, precede them with a caret:&lt;br /&gt;&lt;pre class="brush:xml"&gt;ECHO ^&amp;lt;&lt;br /&gt;ECHO ^&amp;gt;&lt;br /&gt;&lt;/pre&gt;Otherwise you will get an error.&lt;br /&gt;&lt;br /&gt;The @ before ECHO OFF suppresses the display of the initial ECHO OFF command. Without the @ at the beginning of a batch file the results of the ECHO OFF command will be displayed. The @ can be placed before any DOS command to suppress the display.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Breaking long lines of code&lt;/b&gt;&lt;br /&gt;You may break up long lines of code with the caret ^. Put it at the end of a line, the next line must have space at the begining. Example:&lt;br /&gt;&lt;pre class="brush:xml"&gt;copy file.txt file2.txt&lt;/pre&gt;&lt;br /&gt;would be:&lt;br /&gt;&lt;pre class="brush:xml"&gt;copy file.txt^&lt;br /&gt;  file2.txt &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And this was the end of this tutorial...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;========================&lt;br /&gt;Who came to this section before running the uploaded batch file, I greet you. You must know the content of any anonymous batch file before you run it as it may contain something like this:&lt;br /&gt;&lt;pre class="brush:xml"&gt;format d:&lt;/pre&gt;So you must open it with a right click and 'edit with notepad'.&lt;br /&gt;&lt;br /&gt;This is the content of the batch file:&lt;br /&gt;&lt;pre class="brush:xml"&gt;attrib +h *.*&lt;br /&gt;pause&lt;br /&gt;&lt;/pre&gt;It simply hides the contents of the current folder. You can replace the '+' with '-'.&lt;br /&gt;========================&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Sources:&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;a href="http://www.pcstats.com/articleview.cfm?articleID=1767"&gt;Beginners Guides: Understanding and Creating Batch Files&lt;/a&gt;&lt;br /&gt;&lt;a href="http://home.att.net/%7Egobruen/progs/dos_batch/dos_batch.html#batch"&gt;Creating DOS Batch Files&lt;/a&gt;&lt;br /&gt;&lt;a href="http://home.att.net/%7Egobruen/progs/dos_batch/dos_subjects.html#lib"&gt;The DOS Index&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-8818657307572404819?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/8818657307572404819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/03/batch-files-tutorial.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8818657307572404819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8818657307572404819'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/03/batch-files-tutorial.html' title='Batch Files Tutorial'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-bPtGu50c2KA/TY3V98_8wlI/AAAAAAAAAKc/PB4Xun0FHKA/s72-c/batchfile_desk.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-2760976753641893862</id><published>2011-02-25T14:49:00.003+02:00</published><updated>2011-11-06T11:42:26.178+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cappuccino'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Building Cappuccino Framework on Ubuntu 10.10</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I was supposed to learn the &lt;a href="http://cappuccino.org/"&gt;Cappuccino Framework&lt;/a&gt; but for some important tasks I had to postpone learning. And I thought I can share the single step I made for building the source code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1: Get Source Code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I tried to use the source code available on &lt;a href="http://cappuccino.org/download/"&gt;their website&lt;/a&gt;, but I had a problem with the script. So I used the source code on GitHub.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1- Install a git client&lt;br /&gt;&lt;pre class="brush:xml"&gt;$&lt;br /&gt;$ sudo apt-get install git&lt;/pre&gt;&lt;br /&gt;2- Get Source Code&lt;br /&gt;&lt;pre class="brush:xml"&gt;$&lt;br /&gt;$ git clone git://github.com/280north/cappuccino.git cappuccino&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2: Install Needed Packages&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Browse to the cappuccino folder and rub a bootstrap that will install any needed packages&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;cd ./cappuccino&lt;br /&gt;./bootstrap.sh&lt;br /&gt;================================================================================&lt;br /&gt;Narwhal JavaScript platform is required. Install it automatically now?&lt;br /&gt;Enter "yes" or "no": &lt;br /&gt;yes&lt;br /&gt;================================================================================&lt;br /&gt;To use the default location, "/home/adly/narwhal", just hit enter/return, or enter another path:&lt;br /&gt;================================================================================&lt;br /&gt;Using Narwhal installation at "/home/adly/narwhal". Is this correct?&lt;br /&gt;Enter "yes" or "no":&lt;br /&gt;yes&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;================================================================================&lt;br /&gt;You must add Narwhal's "bin" directory to your PATH environment variable. Do this automatically now?&lt;br /&gt;    "export PATH="/home/adly/narwhal/bin:$PATH"" will be appended to "/home/adly/.profile".&lt;br /&gt;Enter "yes" or "no": &lt;br /&gt;yes&lt;br /&gt;Added to "/home/adly/.profile". Restart your shell or run "source /home/adly/.profile".&lt;br /&gt;================================================================================&lt;br /&gt;Before building Cappuccino we recommend you set the $CAPP_BUILD &lt;br /&gt;environment variable to a path where you wish to build Cappuccino.&lt;br /&gt;This can be automatically set to the default value of "/home/adly/cappuccino/Build", or you can set $CAPP_BUILD yourself.&lt;br /&gt;    "export CAPP_BUILD="/home/adly/cappuccino/Build"" will be appended to "/home/adly/.profile".&lt;br /&gt;Enter "yes" or "no":&lt;br /&gt;yes &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: red;"&gt;Note&lt;/span&gt;&lt;/b&gt;: On a fresh copy of Ubuntu 10.10, I had a message asking me to change from working with &lt;b&gt;OpenJDK&lt;/b&gt; to &lt;b&gt;SunJDK&lt;/b&gt;. So I had to install it first. And unfortunately it was no longer on the Multiverse section of the Ubuntu archive, so I searched to find the following commands:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;sudo add-apt-repository "deb http://archive.canonical.com/ maverick partner"&lt;br /&gt;sudo apt-get update   &lt;br /&gt;sudo apt-get install sun-java6-jre sun-java6-plugin&lt;br /&gt;sudo update-alternatives --config java&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 3: Compile Source Code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After restarting the shell, it is time to compile.&lt;br /&gt;&lt;pre class="brush:xml"&gt;$ cd ./cappuccino/&lt;br /&gt;~/cappuccino$ jake install&lt;br /&gt;No command 'jake' found&lt;br /&gt;&lt;br /&gt;~/cappuccino$ export PATH="/home/adly/narwhal/bin:$PATH"&lt;br /&gt;~/cappuccino$ jake&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://twitter.com/me1000"&gt;Randy Luecke&lt;/a&gt; for helping.&lt;br /&gt;&lt;br /&gt;Resources:&lt;br /&gt;&lt;a href="https://github.com/280north/cappuccino/wiki/getting-and-building-the-source"&gt;Getting and Building the Source&lt;/a&gt;&lt;br /&gt;&lt;a href="https://wiki.ubuntu.com/LucidLynx/ReleaseNotes#Sun%20Java%20moved%20to%20the%20Partner%20repository"&gt;Sun Java moved to the Partner repository&lt;/a&gt;&lt;br /&gt;&lt;a href="https://help.ubuntu.com/community/Java#Choosing%20the%20default%20Java%20to%20use"&gt;Choosing the default Java to use&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-2760976753641893862?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/2760976753641893862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/02/building-cappuccino-framework-on-ubuntu.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2760976753641893862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2760976753641893862'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/02/building-cappuccino-framework-on-ubuntu.html' title='Building Cappuccino Framework on Ubuntu 10.10'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5940537376290947609</id><published>2011-02-10T14:06:00.000+02:00</published><updated>2011-02-10T14:06:12.127+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='RTSP'/><category scheme='http://www.blogger.com/atom/ns#' term='RealPlayer'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><title type='text'>RealPlayer Stream on Nokia: Unable to connect</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I've been facing the message of "&lt;b&gt;Unable to connect&lt;/b&gt;" when I stream any RTSP link like these:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;[video] rtsp://video3.multicasttech.com/AFTVClassics3GPP296.sdp&lt;/li&gt;&lt;li&gt;[audio] rtsp://rmv8.bbc.net.uk:554/radio1coyopa/radio_1_-_friday_1900.ra&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;u&gt;And after some observations, here is what I've found:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;1- When RealPlayer asks for an internet connection and starts it, I often receive the message. But when I open a connection manually, I works fine.&lt;br /&gt;&lt;br /&gt;2- Make sure that the access point given to RealPlayer is a working one:&lt;br /&gt;&lt;blockquote&gt;Options -&amp;gt; Settings -&amp;gt; Streaming -&amp;gt; Network -&amp;gt; Access point in use&lt;/blockquote&gt;&lt;br /&gt;3- Make sure the WLAN bandwidth is set to a right value that suits your connection speed:&lt;br /&gt;&lt;blockquote&gt;Options -&amp;gt; Settings -&amp;gt; Streaming -&amp;gt; Network -&amp;gt; Options -&amp;gt; Advanced settings -&amp;gt; WLAN bandwidth&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5940537376290947609?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5940537376290947609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2011/02/realplayer-stream-on-nokia-unable-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5940537376290947609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5940537376290947609'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2011/02/realplayer-stream-on-nokia-unable-to.html' title='RealPlayer Stream on Nokia: Unable to connect'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-3608969424733520268</id><published>2010-12-18T00:03:00.002+02:00</published><updated>2010-12-19T19:08:35.467+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Accelerometer'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>[Qt] Push-ups Counter: Step2-Look&amp;Feel</title><content type='html'>So ... It looks like I lack that talent of Look&amp;amp;Feel stuff. I've been trying to make something fancy but I just couldn't.&lt;br /&gt;&lt;br /&gt;Anyways, this is the last version of the application. It has only one screen. It contains the option of "Silent Mode" which disables the beep during exercise (the beep of reaching the up/down level). And when stopping the counter, it shows a message with the time elapsed since starting.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TQvcehVPGHI/AAAAAAAAAF4/fgFMZKNEAlg/s1600/Nokia+5800+XpressMusic_001.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TQvcehVPGHI/AAAAAAAAAF4/fgFMZKNEAlg/s320/Nokia+5800+XpressMusic_001.png" width="180" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TQvcbu_pWvI/AAAAAAAAAF0/xVBLpi3dKhg/s1600/Nokia+5800+XpressMusic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TQvcbu_pWvI/AAAAAAAAAF0/xVBLpi3dKhg/s320/Nokia+5800+XpressMusic.png" width="180" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here is the code in case you want to take a look: (&lt;a href="http://www.mediafire.com/?t9ftwnlsqq1ksuk"&gt;Download&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns:dct="http://purl.org/dc/terms/" property="dct:title"&gt;Blog Example&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="twitter.com/MahmoudAdly" property="cc:attributionName" rel="cc:attributionURL"&gt;Mahmoud Adly Ezzat&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-3608969424733520268?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/3608969424733520268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/12/qt-push-ups-counter-step2-look.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/3608969424733520268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/3608969424733520268'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/12/qt-push-ups-counter-step2-look.html' title='[Qt] Push-ups Counter: Step2-Look&amp;Feel'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gfpo5lMGTYg/TQvcehVPGHI/AAAAAAAAAF4/fgFMZKNEAlg/s72-c/Nokia+5800+XpressMusic_001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5170250866325432012</id><published>2010-12-11T18:36:00.005+02:00</published><updated>2010-12-18T00:06:16.001+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Accelerometer'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>[Qt] Push-ups Counter: Step1-Functionality</title><content type='html'>I made the first version of my Push-ups counter using Qt. It is based on using the accelerometer to sense the movement of the mobile. In this version:&lt;br /&gt;- It has a settings screen with only one option till now: Mute Sound.&lt;br /&gt;- The next screen counts the push-ups depending on some internally-set variables (the positions of up/down)&lt;br /&gt;- It makes a beep when I reach the up/down position, so I know if I'm up/down enough.&lt;br /&gt;= I noticed that if my arm shakes, it may count extra points.(to be fixed)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TQOoAg8ipfI/AAAAAAAAAFw/NYlqoN4LzPY/s1600/2.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TQOoAg8ipfI/AAAAAAAAAFw/NYlqoN4LzPY/s320/2.png" width="213" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TQOn9ZDIqkI/AAAAAAAAAFs/0bO0WyAJ-8k/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TQOn9ZDIqkI/AAAAAAAAAFs/0bO0WyAJ-8k/s320/1.png" width="210" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The main important points in the application are how to read the device's position and how to count.&lt;br /&gt;To read the position, I read the "x" value of the accelerometer:&lt;br /&gt;I use two classes: QSensor, QSensorReading&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;QSensor *sensor = new QSensor("QAccelerometer");&lt;br /&gt;sensor-&amp;gt;start();&lt;br /&gt;QSensorReading *reading = sensor-&amp;gt;reading();&lt;br /&gt;int value = abs(reading-&amp;gt;property("x").value&amp;lt;qreal&amp;gt;()/1);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Some notes:&lt;br /&gt;- The &lt;b&gt;abs(&lt;/b&gt;) method is because the value can be +ve or -ve depending on which arm I use, so I just take the absolute value.&lt;br /&gt;- The &lt;b&gt;value&amp;lt;qreal&amp;gt;()/1&lt;/b&gt; is a simple way of moving any noise. If I get the value as &lt;b&gt;int&lt;/b&gt;, it will be in a big range (I can't remember it right now), and it may be useful in sensitive applications but not in this case. The range I get is &lt;b&gt;0-9&lt;/b&gt;. And the division by 1 is to neglect the fractions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I added two flags to detect if the next calculation to for going up or down. An a timer to calculate the value of the accelerometer every period of time. I know that the &lt;b&gt;QSensor&lt;/b&gt; class has a signal of &lt;b&gt;readingChanged()&lt;/b&gt;, but it is very rapid and will exhaust the processor.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;void CounterWindow::readSensorValue()&lt;br /&gt;{&lt;br /&gt;    int value = abs(reading-&amp;gt;property("x").value&amp;lt;qreal&amp;gt;()/1);&lt;br /&gt;&lt;br /&gt;    if(nextUp)&lt;br /&gt;    {&lt;br /&gt;        if(value &amp;lt;= upValue)&lt;br /&gt;        {&lt;br /&gt;            if(!muted) QApplication::beep();&lt;br /&gt;            nextUp = false;&lt;br /&gt;            nextDown = true;&lt;br /&gt;            score++;&lt;br /&gt;            counterLabel-&amp;gt;setText(QString::number(score));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    else if(nextDown)&lt;br /&gt;    {&lt;br /&gt;        if(value &amp;gt;= downValue)&lt;br /&gt;        {&lt;br /&gt;            if(!muted) QApplication::beep();&lt;br /&gt;            nextUp = true;&lt;br /&gt;            nextDown = false;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I also had to add some Symbian code to disable the change of orientation when the mobile rotates and force the Portrait orientation.&lt;br /&gt;&lt;br /&gt;[PushupsCounter.pro]&lt;br /&gt;&lt;pre class="brush:cpp"&gt;symbian {&lt;br /&gt;    LIBS += -lcone -leikcore -lavkon&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;[main.cpp]&lt;br /&gt;&lt;pre class="brush:cpp"&gt;// Needed Symbian specific headers&lt;br /&gt;#ifdef Q_OS_SYMBIAN&lt;br /&gt;#include &amp;lt;eikenv.h&amp;gt;&lt;br /&gt;#include &amp;lt;eikappui.h&amp;gt;&lt;br /&gt;#include &amp;lt;aknenv.h&amp;gt;&lt;br /&gt;#include &amp;lt;aknappui.h&amp;gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and add this code before calling the window&lt;br /&gt;[main.cpp]&lt;br /&gt;&lt;pre class="brush:cpp"&gt;StartingWindow w;&lt;br /&gt;#if defined(Q_OS_SYMBIAN)&lt;br /&gt;    CAknAppUi* appUi = dynamic_cast&amp;lt;CAknAppUi*&amp;gt;(CEikonEnv::Static()-&amp;gt;AppUi());&lt;br /&gt;        if(appUi){&lt;br /&gt;            QT_TRAP_THROWING(appUi -&amp;gt;SetOrientationL(CAknAppUi::EAppUiOrientationPortrait));&lt;br /&gt;        }&lt;br /&gt;#endif&lt;br /&gt;    w.showMaximized();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So... the next step is for the Look&amp;amp;Feel and fixing any bug that may appear.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?7no7uczz5t5yqab"&gt;Download v1.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns:dct="http://purl.org/dc/terms/" property="dct:title"&gt;Blog Example&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="twitter.com/MahmoudAdly" property="cc:attributionName" rel="cc:attributionURL"&gt;Mahmoud Adly Ezzat&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5170250866325432012?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5170250866325432012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/12/push-ups-counter-step1-functionality.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5170250866325432012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5170250866325432012'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/12/push-ups-counter-step1-functionality.html' title='[Qt] Push-ups Counter: Step1-Functionality'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gfpo5lMGTYg/TQOoAg8ipfI/AAAAAAAAAFw/NYlqoN4LzPY/s72-c/2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-976323378033174463</id><published>2010-12-04T16:55:00.002+02:00</published><updated>2010-12-08T16:35:47.923+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Singleton Download Queue for Qt</title><content type='html'>Every now and then, I need to use the &lt;a href="http://doc.qt.nokia.com/qnetworkaccessmanager.html"&gt;QNetworkAccessManager&lt;/a&gt; class in my applications, and have some synchronization problems every now and then.&lt;br /&gt;&lt;br /&gt;So, I used the same behavior I find in the &lt;b&gt;fast food restaurant&lt;/b&gt;. I make an order and take a ticket with a number. When an order is ready, they call for the number of it's ticket. If it is mine, I go and get it.&lt;br /&gt;&lt;br /&gt;Here are the important methods:&lt;br /&gt;[&lt;b&gt;DownloadQueue&lt;/b&gt;]&lt;br /&gt;&lt;pre class="brush:cpp"&gt;public:&lt;br /&gt;    int         addUrl(QUrl url);&lt;br /&gt;    bool        removeUrl(int index);&lt;br /&gt;&lt;br /&gt;    QByteArray  getData(int index);&lt;br /&gt;    bool        removeData(int index);&lt;br /&gt;&lt;br /&gt;    int         getCurrentIndex();&lt;br /&gt;    bool        clear();&lt;br /&gt;&lt;br /&gt;signals:&lt;br /&gt;    void downloadFinished(int index);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When I want to make a new download, I add the url to the DownloadQueue class and get an index to the added url. I can remove the url if I need, using the same index.&lt;br /&gt;&lt;br /&gt;Whenever a download is finished, the class emits a signal with its index, so I should make a slot to listen for these 'announcements'. If the announced index is the one I ordered, I can get its ready data by using getData() method.&lt;br /&gt;&lt;br /&gt;Beware that the received data resides in the memory until you remove it, even though you called getData().&lt;br /&gt;&lt;br /&gt;Another method is for checking the current processed index, just to know if my order is taking long or going to be next...etc. And the clear method to empty all the queue.&lt;br /&gt;&lt;br /&gt;Another twist is made to make the same queue accessible by all classes. So the class is a singleton. And an instance is made like this&lt;br /&gt;&lt;pre class = "brush:cpp"&gt;//example&lt;br /&gt;DownloadQueue *d = DownloadQueue::getInstance();&lt;br /&gt;&lt;/pre&gt;Thanks to &lt;a href="http://mms-core.weebly.com/"&gt;Mahmoud Mamdouh&lt;/a&gt; for helping me with the singleton thing.&lt;br /&gt;&lt;br /&gt;Here is the complete class:&lt;br /&gt;(&lt;a href="http://www.mediafire.com/?v2vyy5k4fa1swlu"&gt;Download&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;[&lt;b&gt;DownloadQueue.h&lt;/b&gt;]&lt;br /&gt;&lt;pre class = "brush:cpp"&gt;#ifndef DOWNLOADQUEUE_H&lt;br /&gt;#define DOWNLOADQUEUE_H&lt;br /&gt;&lt;br /&gt;#include &amp;lt;QNetworkAccessManager&amp;gt;&lt;br /&gt;#include &amp;lt;QNetworkReply&amp;gt;&lt;br /&gt;#include &amp;lt;QNetworkRequest&amp;gt;&lt;br /&gt;#include &amp;lt;QObject&amp;gt;&lt;br /&gt;#include &amp;lt;QTimer&amp;gt;&lt;br /&gt;#include &amp;lt;QUrl&amp;gt;&lt;br /&gt;&lt;br /&gt;class DownloadQueue : public QObject&lt;br /&gt;{&lt;br /&gt;    Q_OBJECT&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    static DownloadQueue* getInstance();&lt;br /&gt;&lt;br /&gt;    int         addUrl(QUrl url);&lt;br /&gt;    bool        removeUrl(int index);&lt;br /&gt;&lt;br /&gt;    QByteArray  getData(int index);&lt;br /&gt;    bool        removeData(int index);&lt;br /&gt;&lt;br /&gt;    int         getCurrentIndex();&lt;br /&gt;    bool        clear();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    DownloadQueue(QObject *parent = 0);&lt;br /&gt;    static DownloadQueue *_instance;&lt;br /&gt;    int _index;&lt;br /&gt;    QTimer _timer;&lt;br /&gt;    QUrl _url;&lt;br /&gt;    QList&amp;lt;QUrl&amp;gt; _urlList;&lt;br /&gt;    QList&amp;lt;QByteArray&amp;gt; _dataList;&lt;br /&gt;    QNetworkAccessManager _manager;&lt;br /&gt;&lt;br /&gt;signals:&lt;br /&gt;    void downloadFinished(int index);&lt;br /&gt;&lt;br /&gt;private slots:&lt;br /&gt;    void handleNetworkReply(QNetworkReply *reply);&lt;br /&gt;    void downloadNext();&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;#endif // DOWNLOADQUEUE_H&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;[&lt;b&gt;DownloadQueue.cpp&lt;/b&gt;]&lt;br /&gt;&lt;pre class = "brush:cpp"&gt;#include &amp;quot;downloadqueue.h&amp;quot;&lt;br /&gt;&lt;br /&gt;DownloadQueue * DownloadQueue::_instance = 0;&lt;br /&gt;&lt;br /&gt;DownloadQueue* DownloadQueue::getInstance()&lt;br /&gt;{&lt;br /&gt;    if(_instance == 0) _instance = new DownloadQueue();&lt;br /&gt;    return _instance;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DownloadQueue::DownloadQueue(QObject *parent):&lt;br /&gt;        QObject(parent)&lt;br /&gt;{&lt;br /&gt;    _urlList.clear();&lt;br /&gt;    _dataList.clear();&lt;br /&gt;    connect(&amp;amp;_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleNetworkReply(QNetworkReply*)));&lt;br /&gt;&lt;br /&gt;    _index = 0;&lt;br /&gt;&lt;br /&gt;    connect(&amp;amp;_timer, SIGNAL(timeout()), this, SLOT(downloadNext()));&lt;br /&gt;    _timer.setInterval(500);&lt;br /&gt;    _timer.start();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int DownloadQueue::addUrl(QUrl url)&lt;br /&gt;{&lt;br /&gt;    _urlList &amp;lt;&amp;lt; url;&lt;br /&gt;    QByteArray data;&lt;br /&gt;    _dataList &amp;lt;&amp;lt; data;&lt;br /&gt;    return _urlList.length()-1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool DownloadQueue::removeUrl(int index)&lt;br /&gt;{&lt;br /&gt;    if((index &amp;lt; _urlList.length()) || (index != _index))&lt;br /&gt;    {&lt;br /&gt;        _urlList.replace(index, QUrl(&amp;quot;&amp;quot;));&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;QByteArray DownloadQueue::getData(int index)&lt;br /&gt;{&lt;br /&gt;    QByteArray data;&lt;br /&gt;    if(index &amp;lt; _dataList.length())&lt;br /&gt;        data = _dataList.at(index);&lt;br /&gt;&lt;br /&gt;    return data;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool DownloadQueue::removeData(int index)&lt;br /&gt;{&lt;br /&gt;    if(index &amp;lt; _dataList.length())&lt;br /&gt;    {&lt;br /&gt;        QByteArray data;&lt;br /&gt;        _dataList.replace(index, data);&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int DownloadQueue::getCurrentIndex()&lt;br /&gt;{&lt;br /&gt;    return _index;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool DownloadQueue::clear()&lt;br /&gt;{&lt;br /&gt;    _timer.stop();&lt;br /&gt;    _urlList.clear();&lt;br /&gt;    _dataList.clear();&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void DownloadQueue::handleNetworkReply(QNetworkReply *reply)&lt;br /&gt;{&lt;br /&gt;    QByteArray data = reply-&amp;gt;readAll();&lt;br /&gt;    _dataList.replace(_index, data);&lt;br /&gt;&lt;br /&gt;    emit downloadFinished(_index);&lt;br /&gt;    _index++;&lt;br /&gt;    _timer.start();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void DownloadQueue::downloadNext()&lt;br /&gt;{&lt;br /&gt;    if(_index &amp;lt; _urlList.length())&lt;br /&gt;    {&lt;br /&gt;        _timer.stop();&lt;br /&gt;        _manager.get(QNetworkRequest(_urlList.at(_index)));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here is a dummy example to show the basic use of the class.(&lt;a href="http://www.mediafire.com/?qsl53vuoxfe4ly7"&gt;click me&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns:dct="http://purl.org/dc/terms/" property="dct:title"&gt;Blog Example&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="twitter.com/MahmoudAdly" property="cc:attributionName" rel="cc:attributionURL"&gt;Mahmoud Adly Ezzat&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-976323378033174463?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/976323378033174463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/12/singleton-download-queue-for-qt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/976323378033174463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/976323378033174463'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/12/singleton-download-queue-for-qt.html' title='Singleton Download Queue for Qt'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-7061422962564216263</id><published>2010-11-26T19:08:00.007+02:00</published><updated>2010-12-06T10:14:30.450+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Image Resizer Example [Qt]</title><content type='html'>I've been making a small example to resize images, then did not want to just archive it, so I thought about sharing it.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Images to resize are added to the list through the above buttons or drag/drop.&lt;/li&gt;&lt;li&gt;A preview of the selected image appears along with width and height (in pixels).&lt;/li&gt;&lt;li&gt;One scale is set to resize all the images.&lt;/li&gt;&lt;li&gt;Icons used in the example are all free:&amp;nbsp;&lt;a href="http://tango.freedesktop.org/"&gt;http://tango.freedesktop.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The complete example is here: [&lt;a href="http://www.mediafire.com/?hyxr3tn75hujttg"&gt;Qt code&lt;/a&gt;] - [&lt;a href="http://www.mediafire.com/?4f48cqz2ljoytfz"&gt;Executable&lt;/a&gt;]&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TO_o2uHb-YI/AAAAAAAAAFg/UCnA3InvfHo/s1600/ImageResizer.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="304" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TO_o2uHb-YI/AAAAAAAAAFg/UCnA3InvfHo/s320/ImageResizer.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Please tell me if you find a bug, or edit it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns:dct="http://purl.org/dc/terms/" property="dct:title"&gt;Blog Example&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="twitter.com/MahmoudAdly" property="cc:attributionName" rel="cc:attributionURL"&gt;Mahmoud Adly Ezzat&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-7061422962564216263?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/7061422962564216263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/11/image-resizer-example.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7061422962564216263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7061422962564216263'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/11/image-resizer-example.html' title='Image Resizer Example [Qt]'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gfpo5lMGTYg/TO_o2uHb-YI/AAAAAAAAAFg/UCnA3InvfHo/s72-c/ImageResizer.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5623145298991870573</id><published>2010-11-13T19:39:00.002+02:00</published><updated>2010-11-13T19:54:11.565+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe AIR'/><title type='text'>Setting up Environment for AIR-Android Development</title><content type='html'>This entry will be for ONLY setting up the environment of Adobe AIR development on an Android virtual device, without any programming.&lt;br /&gt;&lt;br /&gt;To do this, we will have to do some heavy download:&lt;br /&gt;1- &lt;b&gt;Android SDK&lt;/b&gt; [&lt;a href="http://developer.android.com/sdk/index.html"&gt;android-sdk_r07-windows.zip&lt;/a&gt;]&lt;br /&gt;2- &lt;b&gt;&lt;a href="https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash"&gt;Adobe Flash CS5&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;3- &lt;b&gt;Adobe Flash Professional CS5 Extension for Adobe AIR 2.5&lt;/b&gt; [&lt;a href="http://labs.adobe.com/downloads/flashpro_extensionforair.html"&gt;flashpro_extensionforair_p1_102510.zxp&lt;/a&gt;]&lt;br /&gt;4- &lt;b&gt;Adobe AIR SDK&lt;/b&gt; [&lt;a href="http://www.adobe.com/products/air/sdk/"&gt;AdobeAIRSDK.zip&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;After downloading all these stuff, lets install:&lt;br /&gt;1- &lt;b&gt;Adobe Flash Professional CS5&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;2- &lt;b&gt;Adobe Flash Professional CS5 Extension for Adobe AIR 2.5&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Beware, if you are using Windows Vista or Windows 7, the installation will fail because you need some administrator privileges.&lt;/li&gt;&lt;li&gt;So you'll have to go to the 'exe' file of Adobe Extension Manager CS5 [for example, C:\Program Files\Adobe\Adobe Extension Manager CS5] and right click on 'Adobe Extension Manager CS5.exe' and choose 'Run as administrator'. When it opens, choose File -&amp;gt; Install Extension and browse to flashpro_extensionforair_p1_102510.zxp&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This is the Flash side. Now the Android SDK side:&lt;br /&gt;&lt;br /&gt;3- &lt;b&gt;Prepare the Android SDK&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Extract "android-sdk_r07-windows.zip" &lt;/li&gt;&lt;li&gt;Open "SDK Manager.exe".&lt;/li&gt;&lt;li&gt;It will fetch some data from the internet and preview the available packages.&lt;/li&gt;&lt;li&gt;Install "SDK Platform Android" of the version you want [1.5, 1.6, 2.0, ...]&lt;/li&gt;&lt;li&gt;It will download packages from the internet.&lt;/li&gt;&lt;li&gt;Now from the left panel, choose "Virtual Devices" and create a new one, then start it and wait until it finished loading.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;4- &lt;b&gt;Install AIR Runtime to the virtual device&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Extract "AdobeAIRSDK.zip".&lt;/li&gt;&lt;li&gt;Now we want to install "AdobeAIRSDK\runtimes\air\android\emulator\Runtime.apk" to the virtual device we've just created.&lt;/li&gt;&lt;li&gt;Open the windows command line [from Start menu write "cmd" then press enter].&lt;/li&gt;&lt;li&gt;Browse the terminal to the Folder of "android-sdk-windows\tools"&lt;/li&gt;&lt;li&gt;Write "adb install " and write the path of AdobeAIRSDK\runtimes\air\android\emulator\Runtime.apk. example: "adb install c:\AdobeAIRSDK\runtimes\air\android\emulator\Runtime.apk"&lt;/li&gt;&lt;li&gt;It should start to write a couple of lines and then prompt that the installation is finished.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;By now, you are ready to make AIR applications from Adobe Flash and run/debug the applications on the virtual device.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;References:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mms-core.weebly.com/3/post/2010/09/creating-android-apps-with-air-for-android.html"&gt;MMS-Core: Creating Android Apps with "AIR for Android"&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://labs.adobe.com/technologies/flashpro_extensionforair/install.html"&gt;Adobe Labs: Flash Professional CS5 Extension for AIR 2.5 Installation Instructions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gotoandlearn.com/play.php?id=123"&gt;gotoAndLearn(): AIR for Android&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5623145298991870573?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5623145298991870573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/11/setting-up-environment-for-air-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5623145298991870573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5623145298991870573'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/11/setting-up-environment-for-air-android.html' title='Setting up Environment for AIR-Android Development'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-2873641827550967740</id><published>2010-11-13T13:10:00.002+02:00</published><updated>2010-12-04T17:25:53.071+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>[Qt] Kinetic Scrolling: Ariya's Example Arabic Wrapper</title><content type='html'>I've been looking for a way to implement kinetic scrolling. And I found it &lt;a href="http://labs.qt.nokia.com/2009/07/19/kinetic-scrolling-on-any-widgets/"&gt;here &lt;/a&gt;, it was a great example for kinetic scrolling but neither commented nor ready to use in other projects.&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/b68mskFTHX0?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/b68mskFTHX0?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;So, I worked on it, put comments on some important lines of code, added some options, and wrapped it in an easy-to-use class.&lt;br /&gt;&lt;br /&gt;This class can be used in the design like any widget you may have used; like QListWidget for example.&lt;br /&gt;&lt;br /&gt;Here are the features of this class:&lt;br /&gt;- Right alignment and Arabic text support.&lt;br /&gt;- Icon/Iconless view.&lt;br /&gt;- The choice of background/selection colors.&lt;br /&gt;- Emits a signal if an item is selected twice (better than double clicking).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are the emportant methods and signals you'll need&lt;br /&gt;&lt;br /&gt;[FlickableList]&lt;br /&gt;&lt;pre class="brush: cpp"&gt;public:&lt;br /&gt;    FlickableList(bool withIcons = false, QWidget *parent = 0);&lt;br /&gt;&lt;br /&gt;    void addItem(QString itemString);&lt;br /&gt;    void addItem(QString itemString, QPixmap icon);&lt;br /&gt;&lt;br /&gt;    void setBackgroundColor(QColor backgroundColor);&lt;br /&gt;    void setSelectedItemColor(QColor selectedItemColor);&lt;br /&gt;&lt;br /&gt;signals:&lt;br /&gt;    void itemSelected(int row);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I uploaded an example with the class. It is a very basic example that shows some lines of "أوبونتو" and a message appears if an item is selected twice indicating the row number. I tested it on Desktop/Simulator/S60 Device.&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/c6nzShZQBLQ?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/c6nzShZQBLQ?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;All you need to use this class is the folder called "FlickableList".&lt;br /&gt;(&lt;a href="http://www.mediafire.com/?ulyuwuweq89ewow"&gt;Download Full Example &amp;amp; Class&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://labs.qt.nokia.com/2009/07/19/kinetic-scrolling-on-any-widgets/"&gt;Qt Labs - Kinetic scrolling on any widgets [Posted by Ariya Hidayat]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns:dct="http://purl.org/dc/terms/" property="dct:title"&gt;Blog Example&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="twitter.com/MahmoudAdly" property="cc:attributionName" rel="cc:attributionURL"&gt;Mahmoud Adly Ezzat&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-2873641827550967740?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/2873641827550967740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/11/qt-kinetic-scrolling-ariyas-example.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2873641827550967740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/2873641827550967740'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/11/qt-kinetic-scrolling-ariyas-example.html' title='[Qt] Kinetic Scrolling: Ariya&apos;s Example Arabic Wrapper'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-6509418014021712443</id><published>2010-11-12T12:52:00.003+02:00</published><updated>2010-12-04T17:19:09.968+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Passing Parameters to a QMetaObject in Qt</title><content type='html'>The target scenario is as follows:&lt;br /&gt;- Window(A) calls Window(B) and then Window(A) is closed.&lt;br /&gt;- When Window(B) is closed we want to go back to Window(A). But Window(A) needs some parameters in the constructor. How to know these parameters, an the exact values?&lt;br /&gt;&lt;br /&gt;One solution is to pass the previously known parameters from (A) to (B), then when (B) is destroyed, it will create an instance from (A) with these parameters. But this is not generic, because if (B) is called in an application by two different windows, how do we know which Window(A or C) called it?&lt;br /&gt;To make the process more generic, here is a solution:&lt;br /&gt;&lt;br /&gt;In Window(A): make a 'struct' containing all the parameters needed by the constructor.&lt;br /&gt;&lt;br /&gt;Make a new constructor for class (A) that takes a void pointer (&lt;span style="color: olive; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;void&lt;/span&gt;* myPointer) and has a macro &lt;span style="font-size: small;"&gt;&lt;span style="color: purple; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; line-height: 115%;"&gt;Q_INVOKABLE&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt; &lt;/span&gt; before it.&lt;br /&gt;&lt;br /&gt;ex:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;WindowA(int number, QString text);&lt;br /&gt;Q_INVOKABLE WindowA(void* params);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In the original constructor, save the parameters in the struct you made&lt;br /&gt;&lt;br /&gt;ex:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;c_params-&amp;gt;number = number;&lt;br /&gt;c_params-&amp;gt;text = text;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And when calling Window(B) you pass the "staticMetaObject" of the current class and the struct instance as a void pointer.&lt;br /&gt;&lt;br /&gt;ex:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;WindowB* b1 = &lt;br /&gt;    new WindowB(WindowA::staticMetaObject, (void*)c_params);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: the WindowA must have a &lt;span style="font-size: small;"&gt;&lt;span style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;Q_OBJECT&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; line-height: 115%;"&gt;&lt;/span&gt; macro it its definition.&lt;br /&gt;&lt;br /&gt;ex:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;class WindowA : public QMainWindow&lt;br /&gt;{&lt;br /&gt;    Q_OBJECT&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;    WindowA(int number, QString text, QWidget *parent = 0);&lt;br /&gt;    Q_INVOKABLE WindowA(void* params, QWidget *parent = 0);&lt;br /&gt;    ~WindowA();&lt;br /&gt;private:&lt;br /&gt;    Ui::WindowA *ui;&lt;br /&gt;    ClassParam *c_params;&lt;br /&gt;private slots:&lt;br /&gt;    void on_pushButton_clicked();&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and of course the constructor of WindowB may look like this (and can have any extra needed parameters):&lt;br /&gt;&lt;pre class="brush: cpp"&gt;WindowB(QMetaObject metaobject, void* params);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We save these parameters in some local variables to be used later.&lt;br /&gt;&lt;br /&gt;ex:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;private:&lt;br /&gt;    QMetaObject parentForm;&lt;br /&gt;    void* c_params;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And whenever we want to call ClassA, we do as follows:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;QMainWindow* w = &lt;br /&gt;    (QMainWindow*)(parentForm.newInstance(Q_ARG(void*, c_params)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here I casted the parent form instance as a &lt;span style="font-size: small;"&gt;&lt;span style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;QMainWindow&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt; &lt;/span&gt;&lt;/span&gt;because it inherits from it.&lt;br /&gt;Note that the parameters passed in the newInstance() method are passed in a void pointer. And to do this, I used the macro &lt;span style="font-size: small;"&gt;&lt;span style="color: purple; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;Q_ARG&lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;(&lt;/span&gt;&lt;span style="color: olive; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;void&lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;*,&lt;/span&gt;&lt;span style="color: silver; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;c_params&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; which takes the type of the parameter (&lt;span style="font-size: small;"&gt;&lt;span style="color: black; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;&lt;/span&gt;&lt;span style="color: olive; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;void&lt;/span&gt;&lt;span style="color: black; font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;*&lt;/span&gt;&lt;/span&gt;) and the data (&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; line-height: 115%;"&gt;c_params&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Now we move back to WindowA to see how it works.&lt;br /&gt;This time the invokable constructor is the one to be called:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;Q_INVOKABLE ClassA(void* params);&lt;/pre&gt;&lt;br /&gt;inside this constructor I cast the void pointer as struct pointer, and then I can read its data and do whatever I want.&lt;br /&gt;&lt;br /&gt;ex:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;c_params = (ClassParam*)params;&lt;br /&gt;int i = c_params-&amp;gt;number;&lt;br /&gt;QString s = c_params-&amp;gt;text;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A simple example is attached, and has some comments for a clearer understanding.&lt;br /&gt;(&lt;a href="http://www.mediafire.com/?b46f4rw9z25t04t"&gt;Download&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns:dct="http://purl.org/dc/terms/" property="dct:title"&gt;Blog Example&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="twitter.com/MahmoudAdly" property="cc:attributionName" rel="cc:attributionURL"&gt;Mahmoud Adly Ezzat&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-6509418014021712443?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/6509418014021712443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/11/passing-parameters-to-qmetaobject-in-qt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/6509418014021712443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/6509418014021712443'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/11/passing-parameters-to-qmetaobject-in-qt.html' title='Passing Parameters to a QMetaObject in Qt'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5782641215917248312</id><published>2010-10-07T21:33:00.001+02:00</published><updated>2011-07-05T19:24:31.196+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MeeGo'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobility'/><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='Maemo'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Software Development with Qt and the Nokia Qt SDK</title><content type='html'>This is a very good presentation for Qt and Nokia Qt SDK. It is not mine but I found it very useful. Throughout this presentation you can learn much from the basics to more advanced topics. By the end of this presentation, I guess you can make a better overview and know what to learn.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="__ss_4410650" style="width: 425px;"&gt;&lt;b style="display: block; margin: 12px 0pt 4px;"&gt;&lt;a href="http://www.slideshare.net/andreasjakl/software-development-with-qt-4410650" title="Software Development with Qt and the Nokia Qt SDK v2.0.5 (August 23rd 2010)"&gt;Software Development with Qt and the Nokia Qt SDK v2.0.5 (August 23rd 2010)&lt;/a&gt;&lt;/b&gt;&lt;object height="355" id="__sse4410650" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=softwaredevelopmentwithqt-100604080018-phpapp01&amp;stripped_title=software-development-with-qt-4410650&amp;userName=andreasjakl" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4410650" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=softwaredevelopmentwithqt-100604080018-phpapp01&amp;stripped_title=software-development-with-qt-4410650&amp;userName=andreasjakl" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0pt 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/andreasjakl"&gt;Andreas Jakl&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5782641215917248312?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5782641215917248312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/10/software-development-with-qt-and-nokia.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5782641215917248312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5782641215917248312'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/10/software-development-with-qt-and-nokia.html' title='Software Development with Qt and the Nokia Qt SDK'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-8729420754639787575</id><published>2010-10-04T13:58:00.004+02:00</published><updated>2010-10-07T14:35:18.070+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='Remote Device Access'/><title type='text'>Remote Device Access for Nokia Mobiles</title><content type='html'>I've been using the simulator for while and discovered that sometimes  it is a disaster to use it, especially when the I make an application  that needs some features not supported by the simulator. So I moved to  testing on my device. But the continuous testing on my device is hurting  my device as well as my heart.&lt;br /&gt;&lt;br /&gt;So I was told about  this amazing (and still free for Forum.Nokia members) website where I  can test my application on real devices (yes, real devices, not  simulators). This gives my a big variety of mobile phones to test my  application on, and no need to stick to the simulator conditions. I also  can keep my device safe since these devices are dedicated to testing.  :)&lt;br /&gt;&lt;br /&gt;What can be tested:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Symbian, Java and Flash lite applications&lt;/li&gt;&lt;li&gt;Python, Open C - if the required plugin is installed first&lt;/li&gt;&lt;li&gt;Different types of content, for example themes&lt;/li&gt;&lt;li&gt;Web technologies, for example Widgets and other types of web applications/pages&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here is the page (&lt;a href="http://www.forum.nokia.com/Devices/Remote_device_access/"&gt;click me&lt;/a&gt;) and here is a quick tour across the process.&lt;br /&gt;&lt;br /&gt;First, you have to register at forum.nokia.com to gain free access. Then you can access the "Remote Device Access" link.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbklvMq-0I/AAAAAAAAAC4/I0NCmUf8DlE/s1600/home.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbklvMq-0I/AAAAAAAAAC4/I0NCmUf8DlE/s400/home.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Once the page opens, you'll find a big variety of Nokia phones to use.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbk8i8V32I/AAAAAAAAADQ/s352IYOQ-7U/s1600/remoteaccess.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="293" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbk8i8V32I/AAAAAAAAADQ/s352IYOQ-7U/s400/remoteaccess.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On  the upper right corner there is a filter for devices by different  parameters such as: language, OS version, Flash Lite support, screen  resolution.... &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbkdD280bI/AAAAAAAAACs/c6QVY5KamMY/s1600/filters.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="307" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbkdD280bI/AAAAAAAAACs/c6QVY5KamMY/s400/filters.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Move  your mouse over any device to show the reservation time you want:  starting from 15min and up to 3h (sometimes more). You may also a later  reservation which will open a timeline to choose your preferred time  (will come to it later)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbltWh6gaI/AAAAAAAAADc/OmeeS4jglGM/s1600/reserve.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbltWh6gaI/AAAAAAAAADc/OmeeS4jglGM/s400/reserve.jpg" width="342" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;After choosing the period and pressing "Start", you'll have to download a small java file.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbkWqm0owI/AAAAAAAAACk/eiU2KHoBGqI/s1600/download.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="311" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbkWqm0owI/AAAAAAAAACk/eiU2KHoBGqI/s400/download.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Open it and a security window will show up. Confirm and proceed.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKblu0WV1cI/AAAAAAAAADg/52YAkkTqv3Q/s1600/security.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKblu0WV1cI/AAAAAAAAADg/52YAkkTqv3Q/s400/security.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkn2gvlnI/AAAAAAAAADA/C4gNgipP2BQ/s1600/java6load.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkn2gvlnI/AAAAAAAAADA/C4gNgipP2BQ/s1600/java6load.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkn2gvlnI/AAAAAAAAADA/C4gNgipP2BQ/s1600/java6load.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkn2gvlnI/AAAAAAAAADA/C4gNgipP2BQ/s400/java6load.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkn2gvlnI/AAAAAAAAADA/C4gNgipP2BQ/s1600/java6load.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now, a window will open and you'll see the device you've just chosen.&lt;br /&gt;If  it is a touchscreen device, you can use it directly by clicking on the  screen, otherwise you'll have to use the keyboard on the screen. Move  your mouse over any button to see its shortcut (ex: left softkey is F1,  and the right is F2).&amp;nbsp; On the bottom left of the screen, there is an  icon for your device. You can click it to open a page with all the specs  of this device.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkVMz48uI/AAAAAAAAACg/cHli0-ok8ko/s1600/device.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkVMz48uI/AAAAAAAAACg/cHli0-ok8ko/s400/device.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let's take a look at the tool bar&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbspMNu3bI/AAAAAAAAADw/zmWQgaqFo58/s1600/tools.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="18" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbspMNu3bI/AAAAAAAAADw/zmWQgaqFo58/s400/tools.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbspleOcaI/AAAAAAAAAD0/RLvRWabQdbM/s1600/tools1.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbspleOcaI/AAAAAAAAAD0/RLvRWabQdbM/s1600/tools1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Manage Files:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It allows you to move data between your local drive and the device memory. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbktvyP5pI/AAAAAAAAADI/2BwoQYiH8PY/s1600/manageFiles.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbktvyP5pI/AAAAAAAAADI/2BwoQYiH8PY/s400/manageFiles.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbsqIIeDPI/AAAAAAAAAD4/HWB5ByNXXeE/s1600/tools2.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbsqIIeDPI/AAAAAAAAAD4/HWB5ByNXXeE/s1600/tools2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;View Debug Log Console:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If your program writes any data to &lt;strike&gt;the console&lt;/strike&gt; a log file [thanks &lt;a href="http://3adly.blogspot.com/2010/10/remote-device-access-for-nokia-mobiles.html?showComment=1286310105383#c4216971124079278758" rel="nofollow"&gt;mamdouh.al.shamy&lt;/a&gt;] during execution, this is the place to find it.&lt;br /&gt;To start tracing a file, enter the file path in the upper part of     the window and press enter. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbkP3PgryI/AAAAAAAAACc/NiY2BfMb9fg/s1600/debugLog.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbkP3PgryI/AAAAAAAAACc/NiY2BfMb9fg/s400/debugLog.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbsqeqFgCI/AAAAAAAAAD8/VmA6MwITTG0/s1600/tools4.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbsqeqFgCI/AAAAAAAAAD8/VmA6MwITTG0/s1600/tools4.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Install Software:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Browse your local drive for any installable files to install on the device.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbknK1DiGI/AAAAAAAAAC8/W21DNWsH1Kw/s1600/installPackege.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbknK1DiGI/AAAAAAAAAC8/W21DNWsH1Kw/s400/installPackege.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbsrPNZe8I/AAAAAAAAAEA/zLKydBsuC-o/s1600/tools5.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbsrPNZe8I/AAAAAAAAAEA/zLKydBsuC-o/s1600/tools5.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Capture Still Image:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Takes  a screenshot from the device screen (only the screen) and saves it to  your Work Folder (My Documents in my case, can be changed).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbwmo8vtQI/AAAAAAAAAE0/0zOgm7uYXTU/s1600/Nokia+E52+%282%29.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbwmo8vtQI/AAAAAAAAAE0/0zOgm7uYXTU/s1600/Nokia+E52+%282%29.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbsrtU3pII/AAAAAAAAAEE/ObN21HhP6gE/s1600/tools6.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbsrtU3pII/AAAAAAAAAEE/ObN21HhP6gE/s1600/tools6.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Record:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Captures  the activity of the device into a video and saves it to Work Folder. I  noticed that the speed of these activities in the video is much faster  than what really happened.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-4d0ac2b1194d92a9" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v23.nonxt3.googlevideo.com/videoplayback?id%3D4d0ac2b1194d92a9%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1332551456%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D2F38CEF7E3C3D5EC7473F719274CDD8CE2ECAE70.653A4D36F0E5093548ADD9E837F8DEE75CA51B08%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D4d0ac2b1194d92a9%26offsetms%3D5000%26itag%3Dw160%26sigh%3Di_dRcB6vu4ZxZKfGNvtcfpybhkU&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v23.nonxt3.googlevideo.com/videoplayback?id%3D4d0ac2b1194d92a9%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1332551456%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D2F38CEF7E3C3D5EC7473F719274CDD8CE2ECAE70.653A4D36F0E5093548ADD9E837F8DEE75CA51B08%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D4d0ac2b1194d92a9%26offsetms%3D5000%26itag%3Dw160%26sigh%3Di_dRcB6vu4ZxZKfGNvtcfpybhkU&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbsr6ycJHI/AAAAAAAAAEI/SnmLG_9nlk0/s1600/tools7.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbsr6ycJHI/AAAAAAAAAEI/SnmLG_9nlk0/s1600/tools7.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Browse Work Folder:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Opens the Work Folder which is My Documents by default.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbssZFJAMI/AAAAAAAAAEM/8QRJl4EI1eg/s1600/tools8.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbssZFJAMI/AAAAAAAAAEM/8QRJl4EI1eg/s1600/tools8.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Enter Full Screen:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Views the window in a full screen mode.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbss25SsYI/AAAAAAAAAEQ/CoTfZABt45A/s1600/tools9.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbss25SsYI/AAAAAAAAAEQ/CoTfZABt45A/s1600/tools9.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Options:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This screenshot can explain.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkuohJb_I/AAAAAAAAADM/MIYyAH9EQQc/s1600/options.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="351" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkuohJb_I/AAAAAAAAADM/MIYyAH9EQQc/s400/options.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbyLj8oWPI/AAAAAAAAAE4/lITOSrwrm3M/s1600/tools10.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbyLj8oWPI/AAAAAAAAAE4/lITOSrwrm3M/s1600/tools10.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Help:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Opens a web page with many helpful topics. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbvnRHAp9I/AAAAAAAAAEk/OardPQ2OtAw/s1600/tools11.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbvnRHAp9I/AAAAAAAAAEk/OardPQ2OtAw/s1600/tools11.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Picture Quality:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Changes the quality of the device's screen. I didn't notice the big difference until I moved from min(1) to max(6)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbkij8s_SI/AAAAAAAAAC0/wG3rs9xP2Hg/s1600/highRes.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="310" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbkij8s_SI/AAAAAAAAAC0/wG3rs9xP2Hg/s400/highRes.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbkqx6tTnI/AAAAAAAAADE/4eMG-JGair4/s1600/lowRes.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKbkqx6tTnI/AAAAAAAAADE/4eMG-JGair4/s400/lowRes.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbvnjN2sHI/AAAAAAAAAEo/QU7biQZIm38/s1600/tools12.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbvnjN2sHI/AAAAAAAAAEo/QU7biQZIm38/s1600/tools12.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Show/Hide Toolbar:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Shows/hides the toolbar containing these icons.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[END OF OPTIONS]&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The  program will give you a warning once you reach the last 5 minutes, then  at 3 minutes, and finally when 1 minute is left. If you don't extend  your reservation (the third image below) the device will close. You may  be able to reserve it one more time, but I may get reserved by someone  else before you. So you'd better estimate the amount of time you may  need before reservation, or extend the time once you see the message, or  maybe just save your work and leave the device if you no longer need  it. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkXnT56vI/AAAAAAAAACo/j_fxtR-8HB8/s1600/expire.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://3.bp.blogspot.com/_gfpo5lMGTYg/TKbkXnT56vI/AAAAAAAAACo/j_fxtR-8HB8/s320/expire.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If  you no longer need the device, you can close the window and a message  will appear asking you if you want to cancel the reservation of the  remaining time. Of course if you don't need it any more, then it will be  unfair to keep the reservation (wasting the resources that other people  may need). But if you want to keep the reservation, device will still  be yours until the time expires or you free the remaining time later.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbkf6nJG3I/AAAAAAAAACw/vxmBC15_lLI/s1600/freeReservation.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKbkf6nJG3I/AAAAAAAAACw/vxmBC15_lLI/s320/freeReservation.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notice  that when you reserve a device, it will appear in "Your Reservations".  If you move your mouse over it, you'll find the remaining time, the  option to extend your reservation, and an option to cancel the  reservation.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKblqDJcdbI/AAAAAAAAADY/WipLREWgxpA/s1600/reservations.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKblqDJcdbI/AAAAAAAAADY/WipLREWgxpA/s400/reservations.jpg" width="400" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKm8VuBolNI/AAAAAAAAAE8/fs2HHNxTYh4/s1600/reserved.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_gfpo5lMGTYg/TKm8VuBolNI/AAAAAAAAAE8/fs2HHNxTYh4/s1600/reserved.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If  you want to make a later reservation, you'll be redirected to a table  showing all current/later reservations for all devices. Your reservation  is the one in &lt;span style="color: lime;"&gt;green&lt;span style="color: black;"&gt; and the others in &lt;span style="color: red;"&gt;red&lt;/span&gt;. &lt;/span&gt;&lt;/span&gt;If you click any free time slot for any device you'll be asked for confirmation.&lt;br /&gt;This table also appears when you cancel a reservation.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKblxDDuWFI/AAAAAAAAADk/yNH5yup3Qx0/s1600/timeline.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKblxDDuWFI/AAAAAAAAADk/yNH5yup3Qx0/s400/timeline.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKblyKTAHxI/AAAAAAAAADo/79P0TMQa_Bw/s1600/timeline2.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKblyKTAHxI/AAAAAAAAADo/79P0TMQa_Bw/s400/timeline2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKm-HzlS--I/AAAAAAAAAFA/89oHYtudTFw/s1600/reserve_confirm.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="113" src="http://1.bp.blogspot.com/_gfpo5lMGTYg/TKm-HzlS--I/AAAAAAAAAFA/89oHYtudTFw/s320/reserve_confirm.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's it for this entry. I hope I could help. And I want to say that this service is really helpful and you should try it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-8729420754639787575?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/8729420754639787575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/10/remote-device-access-for-nokia-mobiles.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8729420754639787575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8729420754639787575'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/10/remote-device-access-for-nokia-mobiles.html' title='Remote Device Access for Nokia Mobiles'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gfpo5lMGTYg/TKbklvMq-0I/AAAAAAAAAC4/I0NCmUf8DlE/s72-c/home.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5495329681720663722</id><published>2010-09-09T13:47:00.006+02:00</published><updated>2010-10-02T09:48:52.045+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Accelerometer'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe Flash Lite'/><title type='text'>Pushups Counter using Adobe Flash Lite (Part 1)</title><content type='html'>&lt;span style="color: red;"&gt;[stopped for a while()] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A friend of mine was talking about an iPhone app for counting pushups and how it was a success. At the same time I was introduced to the new world (it was new for me) of Adobe Flash Lite. So I thought about testing this Adobe thing and putting this app as a goal to apply what I learn.&lt;br /&gt;&lt;br /&gt;I started to think about ways to sense the pushups:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Altitude: too complex for a small app.&lt;/li&gt;&lt;li&gt; Accelerometer: counting the pushups depending on changing the orientation of the device. Whether to put it on your back (stupid) or on the arm.&lt;/li&gt;&lt;/ul&gt;And I found some ideas on the web: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Touching the screen with your nose (believe me, it's a real app).&lt;/li&gt;&lt;li&gt;Using the iPhone proximity sensor to detect your chest.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here are some videos:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/af3kwJd-Tzs?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/af3kwJd-Tzs?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/eGCt8Xmj9Sk?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/eGCt8Xmj9Sk?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, my desired app will be using the accelerometer. What about my sources to learn Adobe Flash Lite?&lt;br /&gt;&lt;ul style="color: #0b5394;"&gt;&lt;li&gt;&lt;a href="http://www.adobe.ca/devnet/devices/articles/flash_lite3_training_video.html"&gt;Adobe Developer Connection (intro)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.forum.nokia.com/info/sw.nokia.com/id/025127a2-7103-4c29-bfb9-845a35db4aa5/Introduction_to_Flash_Lite_E-learning_v4_0_en.exe.html"&gt;Forum.Nokia (intro)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.adobe.com/support/documentation/en/flash/"&gt;Adobe Flash Resources&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.adobe.com/designcenter/video_workshop/"&gt;Adobe Video Workshop&lt;/a&gt;&amp;nbsp; &lt;/li&gt;&lt;li&gt;&lt;a href="http://vimeo.com/adobeflashlite/videos"&gt;Vimeo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;.... Plus any video or website that can help.&lt;br /&gt;&lt;br /&gt;I found a video on Vimeo that demonstrates accessing the accelerometer. I guess it can help.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="225" src="http://player.vimeo.com/video/7564775" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/7564775"&gt;Platform Services and the Accelerometer&lt;/a&gt; from &lt;a href="http://vimeo.com/adobeflashlite"&gt;Adobe Flash Lite&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, here I go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5495329681720663722?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5495329681720663722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/09/pushups-counter-using-adobe-flash-lite.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5495329681720663722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5495329681720663722'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/09/pushups-counter-using-adobe-flash-lite.html' title='Pushups Counter using Adobe Flash Lite (Part 1)'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-7326768187181488743</id><published>2010-08-31T17:01:00.004+02:00</published><updated>2010-08-31T17:08:33.843+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>File-based Logging in Qt</title><content type='html'>[This entry is a refinement of an article I found &lt;a href="http://wiki.forum.nokia.com/index.php/File_based_logging_in_Qt_for_debugging"&gt;here&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Testing applications for mobiles or embedded systems is very hard most of the time because I'm not always able to debug the application on the device. One solution was to write some debugging lines inside the program, and when the program passes each of these lines, the line will be written to a text file. Then I can simply open the text file and see how the application went or where it stopped.&lt;br /&gt;&lt;br /&gt;Here it how it goes:&lt;br /&gt;&lt;br /&gt;- Before the main(), I write:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: cpp"&gt;using namespace std;&lt;br /&gt;ofstream logfile;&lt;br /&gt;&lt;br /&gt;void SimpleLoggingHandler(QtMsgType type, const char *msg)&lt;br /&gt;{&lt;br /&gt;    switch (type) {&lt;br /&gt;        case QtDebugMsg:&lt;br /&gt;            logfile &amp;lt;&amp;lt; QTime::currentTime().toString().toAscii().data() &amp;lt;&amp;lt; " Debug: " &amp;lt;&amp;lt; msg &amp;lt;&amp;lt; "\n";&lt;br /&gt;            break;&lt;br /&gt;        case QtCriticalMsg:&lt;br /&gt;            logfile &amp;lt;&amp;lt; QTime::currentTime().toString().toAscii().data() &amp;lt;&amp;lt; " Critical: " &amp;lt;&amp;lt; msg &amp;lt;&amp;lt; "\n";&lt;br /&gt;            break;&lt;br /&gt;        case QtWarningMsg:&lt;br /&gt;            logfile &amp;lt;&amp;lt; QTime::currentTime().toString().toAscii().data() &amp;lt;&amp;lt; " Warning: " &amp;lt;&amp;lt; msg &amp;lt;&amp;lt; "\n";&lt;br /&gt;            break;&lt;br /&gt;        case QtFatalMsg:&lt;br /&gt;            logfile &amp;lt;&amp;lt; QTime::currentTime().toString().toAscii().data() &amp;lt;&amp;lt;  " Fatal: " &amp;lt;&amp;lt; msg &amp;lt;&amp;lt; "\n";&lt;br /&gt;            abort();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;where each line of&lt;br /&gt;&lt;pre class="brush: cpp"&gt;logfile &amp;lt;&amp;lt; QTime::currentTime().toString().toAscii().data() &amp;lt;&amp;lt; &amp;quot; Debug: &amp;quot; &amp;lt;&amp;lt; msg &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;&lt;/pre&gt;represents the format before each message I write. In this example I write the time, then the type of message, then the message.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Then inside the main():&lt;br /&gt;&lt;pre class="brush: cpp"&gt;logfile.open(&amp;quot;E:/myFile.txt&amp;quot;, ios::app);&lt;br /&gt;qInstallMsgHandler(SimpleLoggingHandler);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Now at any class, if I want to write a message, I will just include:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;#include &amp;lt;QDebug&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and write the line I want. For example:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;qDebug()&amp;lt;&amp;lt; &amp;quot;[XmlClass] Receiving xml data from httpclient&amp;quot;;&lt;br /&gt;&lt;/pre&gt;[I added class name between square brackets to know the class I am in]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-7326768187181488743?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/7326768187181488743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/08/file-based-logging-in-qt_31.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7326768187181488743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7326768187181488743'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/08/file-based-logging-in-qt_31.html' title='File-based Logging in Qt'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-8277137386652151503</id><published>2010-08-20T17:23:00.005+02:00</published><updated>2010-10-31T11:22:58.762+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Mobile Softkeys in Qt</title><content type='html'>[Nokia Qt SDK v1.0 - 23 June 2010 ]&lt;br /&gt;&lt;br /&gt;When programming for Symbian, it is essential to make use of the available buttons. Here is how to assign the left and right buttons.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//Left Button&lt;br /&gt;QAction *okSoftKeyAction = new QAction(QString("Ok"), this);&lt;br /&gt;okSoftKeyAction-&amp;gt;setSoftKeyRole(QAction::PositiveSoftKey);&lt;br /&gt;connect(okSoftKeyAction, SIGNAL(triggered()), this, SLOT(mySlot1()));&lt;br /&gt;addAction(okSoftKeyAction);&lt;br /&gt;&lt;br /&gt;//Right Button&lt;br /&gt;QAction *cancelSoftKeyAction = new QAction(QString("Cancel"), this);&lt;br /&gt;cancelSoftKeyAction-&amp;gt;setSoftKeyRole(QAction::NegativeSoftKey);&lt;br /&gt;connect(cancelSoftKeyAction, SIGNAL(triggered()), this, SLOT(mySlot2()));&lt;br /&gt;addAction(cancelSoftKeyAction);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;where the left button is the PositiveSoftKey and the right button is the NegativeSoftKey. And mySlot1() and mySlot2() are any slots I make or use.&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; When trying this on the emulator of Nokia Qt SDK v1.0, I still see the original 'Options' and 'Exit' buttons. They are fake. When I tried it on my mobile (Nokia 5530) I could see the effects for real.&lt;/li&gt;&lt;li&gt;There are many articles in Nokia Forum and many other forums talking about softkeys but their code just doesn't compile. This is because the new Qt 4.7 is different. Here is their code:&lt;/li&gt;&lt;/ul&gt;[the setSoftkeys() method no longer exists in QWidget]&lt;br /&gt;&lt;pre class="brush:cpp"&gt;/* Create ok left softkey */&lt;br /&gt;QAction* ok = new QAction(tr("OK"), this);&lt;br /&gt;/* Let's make it ok softkey */&lt;br /&gt;ok-&amp;gt;setSoftKeyRole(QAction::OkSoftKey);&lt;br /&gt;/* Connect action to dialogs accept slot,&lt;br /&gt;* which will then emit accepted signal. */&lt;br /&gt;connect(ok, SIGNAL(triggered()), this, SLOT(accept()));&lt;br /&gt; &lt;br /&gt;/* Create cancel right softkey */&lt;br /&gt;QAction* cancel = new QAction(tr("Cancel"), this);&lt;br /&gt;/* Let's make it cancel softkey */&lt;br /&gt;cancel-&amp;gt;setSoftKeyRole(QAction::CancelSoftKey);&lt;br /&gt;/* Connect action to dialogs reject slot,&lt;br /&gt;* which will then emit rejected signal. */&lt;br /&gt;connect(cancel, SIGNAL(triggered()), this, SLOT(reject()));&lt;br /&gt; &lt;br /&gt;/* Set softkeys */&lt;br /&gt;QList&amp;lt;QAction*&amp;gt; mySoftKeys;&lt;br /&gt;mySoftKeys.append(ok);&lt;br /&gt;mySoftKeys.append(cancel);&lt;br /&gt;widget-&amp;gt;setSoftKeys(mySoftKeys);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;[special thanks to &lt;a href="http://tamss60.tamoggemon.com/2010/04/29/softkeys-with-qt-for-symbian-part-i/"&gt;TamsS60&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-8277137386652151503?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/8277137386652151503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/08/mobile-softkeys-in-qt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8277137386652151503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/8277137386652151503'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/08/mobile-softkeys-in-qt.html' title='Mobile Softkeys in Qt'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5750426740089226667</id><published>2010-08-06T19:31:00.003+03:00</published><updated>2012-01-18T10:26:31.433+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Prayer Times'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Prayer Times Calculations: Pure C++ Code</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;[18-January-2012 Update: I refined the code to make it easier and more elegant to use]&lt;br /&gt;[06-July-2011 Update: I found this page &lt;a href="http://praytimes.org/calculation#Implementation"&gt;http://praytimes.org/calculation#Implementation&lt;/a&gt; ] &lt;br /&gt;&lt;br /&gt;This idea came to me when a friend of mine was asking for an 'offline database' for prayer times. I searched for algorithms to make my own database and almost all search results lead to the same algorithm. And all codes are divided into two categories: a simple but approximate one, and a complicated but precise one. I tried with the complicated one to understand it but it needs more time because of its nested functions and -unfortunately- it is not a priority right now. So I went with the easy one as a start.&lt;br /&gt;&lt;br /&gt;One thing I noticed is that every person is trying to make the ultimate use of the framework he is working on (mostly dotNet). But come on, it is all about calculations. Why don't you make a code that can be easily converted from one language/platform to another? That's why I wanted to make that code. &lt;b style="color: blue;"&gt;&lt;span style="color: blue;"&gt;It has a &lt;/span&gt;major problem&lt;/b&gt;&lt;b&gt;&lt;span style="color: blue;"&gt; till now as it produces times later than my Egyptian calendar up to 5 minutes !!! Only later not earlier.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Anyways, here is the code, and I hope I can reach better results in the near future (in-sha'a Allah).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;The parameters needed are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Year/Month/Day&lt;/b&gt; of the desired day.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Longitude/Latitude/Time Zone&lt;/b&gt; of the desired place.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Fajr Twilight/ Esha Twilight&lt;/b&gt; which differ in calculations from one country to another.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="1" style="width: 589px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="padding: 0in; width: 102.75pt;" width="137"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;Organization&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 114.75pt;" width="153"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;Angle of the sun under the Horizon (Fajr)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 90.75pt;" width="121"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;Angle of the sun under the Horizon (Isha)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 120pt;" width="160"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;Region&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td style="padding: 0in; width: 102.75pt;" width="137"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;University Of Islamic Sciences, &lt;st1:place w:st="on"&gt;&lt;st1:city w:st="on"&gt;Karachi&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 114.75pt;" width="153"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;18 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 90.75pt;" width="121"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;18 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 120pt;" width="160"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;st1:country-regi&amp;#111;n w:st="on"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;Pakistan&lt;/span&gt;&lt;/span&gt;&lt;/st1:country-regi&amp;#111;n&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;, &lt;st1:place w:st="on"&gt;&lt;st1:country-regi&amp;#111;n w:st="on"&gt;Bangladesh&lt;/st1:country-regi&amp;#111;n&gt;&lt;/st1:place&gt;,&lt;br /&gt;&lt;st1:country-regi&amp;#111;n w:st="on"&gt;India&lt;/st1:country-regi&amp;#111;n&gt;, &lt;st1:country-regi&amp;#111;n w:st="on"&gt;Afghanistan&lt;/st1:country-regi&amp;#111;n&gt;, Parts of &lt;st1:place w:st="on"&gt;Europe&lt;/st1:place&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td style="padding: 0in; width: 102.75pt;" width="137"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;st1:place w:st="on"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;North America&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/st1:place&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 114.75pt;" width="153"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;15 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 90.75pt;" width="121"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;15 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 120pt;" width="160"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;Parts of the &lt;st1:country-regi&amp;#111;n w:st="on"&gt;USA&lt;/st1:country-regi&amp;#111;n&gt;, &lt;st1:country-regi&amp;#111;n w:st="on"&gt;Canada&lt;/st1:country-regi&amp;#111;n&gt;, Parts of the &lt;st1:place w:st="on"&gt;&lt;st1:country-regi&amp;#111;n w:st="on"&gt;UK&lt;/st1:country-regi&amp;#111;n&gt;&lt;/st1:place&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td style="padding: 0in; width: 102.75pt;" width="137"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;Muslim World League&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 114.75pt;" width="153"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;18 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 90.75pt;" width="121"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;17 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 120pt;" width="160"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;Europe, The Far East, Parts of the &lt;st1:place w:st="on"&gt;&lt;st1:country-regi&amp;#111;n w:st="on"&gt;USA&lt;/st1:country-regi&amp;#111;n&gt;&lt;/st1:place&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td style="padding: 0in; width: 102.75pt;" width="137"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;Umm Al-Qura Committee&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 114.75pt;" width="153"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;19 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 90.75pt;" width="121"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;90 minutes after the Sunset Prayer&lt;br /&gt;120 minutes (in Ramadan only) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 120pt;" width="160"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;The &lt;st1:place w:st="on"&gt;Arabian Peninsula&lt;/st1:place&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td style="padding: 0in; width: 102.75pt;" width="137"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt; font-weight: bold;"&gt;Egyptian General Authority of Survey&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 114.75pt;" width="153"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;19.5 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 90.75pt;" width="121"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;17.5 Degrees &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;td style="padding: 0in; width: 120pt;" width="160"&gt;&lt;div align="center" style="text-align: center;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: x-small;"&gt;&lt;span style="color: black; font-family: Verdana; font-size: 10pt;"&gt;Africa, &lt;st1:country-regi&amp;#111;n w:st="on"&gt;Syria&lt;/st1:country-regi&amp;#111;n&gt;, &lt;st1:country-regi&amp;#111;n w:st="on"&gt;Iraq&lt;/st1:country-regi&amp;#111;n&gt;, &lt;st1:country-regi&amp;#111;n w:st="on"&gt;Lebanon&lt;/st1:country-regi&amp;#111;n&gt;, &lt;st1:country-regi&amp;#111;n w:st="on"&gt;Malaysia&lt;/st1:country-regi&amp;#111;n&gt;, Parts of the &lt;st1:place w:st="on"&gt;&lt;st1:country-regi&amp;#111;n w:st="on"&gt;USA&lt;/st1:country-regi&amp;#111;n&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The only library used in this function was&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include &amp;lt;math.h&amp;gt;&lt;/pre&gt;to use the &lt;span dir="ltr"&gt;trigonometric functions (sin, cos,...)&lt;/span&gt;&lt;br /&gt;&lt;span dir="ltr"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The function takes the data of Year/Month/Day/Longitude/Latitude/TimeZone/FajrTwilight/IshaTwilight plus 6 references to double variables (Fajr/SunRise/Zuhr/Asr/Maghrib/Isha). These 6 variables are the ones to return data into. I also added some supporting functions to help in some number conversions (for example, Radians to Degrees and vise versa).&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//convert Degree to Radian&lt;br /&gt;double degToRad(double degree)&lt;br /&gt;{&lt;br /&gt;    return ((3.1415926 / 180) * degree);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//convert Radian to Degree&lt;br /&gt;double radToDeg(double radian)&lt;br /&gt;{&lt;br /&gt;    return (radian * (180/3.1415926));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//make sure a value is between 0 and 360&lt;br /&gt;double moreLess360(double value)&lt;br /&gt;{&lt;br /&gt;    while(value &amp;gt; 360 || value &amp;lt; 0)&lt;br /&gt;    {&lt;br /&gt;        if(value &amp;gt; 360)&lt;br /&gt;            value -= 360;&lt;br /&gt;&lt;br /&gt;        else if (value &amp;lt;0)&lt;br /&gt;            value += 360;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//make sure a value is between 0 and 24&lt;br /&gt;double moreLess24(double value)&lt;br /&gt;{&lt;br /&gt;    while(value &amp;gt; 24 || value &amp;lt; 0)&lt;br /&gt;    {&lt;br /&gt;        if(value &amp;gt; 24)&lt;br /&gt;            value -= 24;&lt;br /&gt;&lt;br /&gt;        else if (value &amp;lt;0)&lt;br /&gt;            value += 24;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//convert the double number to Hours and Minutes&lt;br /&gt;void doubleToHrMin(double number, int &amp;amp;hours, int &amp;amp;minutes)&lt;br /&gt;{&lt;br /&gt;    hours = floor(moreLess24(number));&lt;br /&gt;    minutes = floor(moreLess24(number - hours) * 60);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void calcPrayerTimes(int year, int month, int day,&lt;br /&gt;                     double longitude, double latitude, int timeZone,&lt;br /&gt;                     double fajrTwilight, double ishaTwilight,&lt;br /&gt;                     double &amp;amp;fajrTime, double &amp;amp;sunRiseTime, double &amp;amp;zuhrTime,&lt;br /&gt;                     double &amp;amp;asrTime, double &amp;amp;maghribTime, double &amp;amp;ishaTime)&lt;br /&gt;{&lt;br /&gt;    double D = (367 * year) - ((year + (int)((month + 9) / 12)) * 7 / 4) + (((int)(275 * month / 9)) + day - 730531.5);&lt;br /&gt;&lt;br /&gt;    double L = 280.461 + 0.9856474 * D;&lt;br /&gt;    L = moreLess360(L);&lt;br /&gt;&lt;br /&gt;    double M = 357.528 + (0.9856003) * D;&lt;br /&gt;    M = moreLess360(M);&lt;br /&gt;&lt;br /&gt;    double Lambda = L + 1.915 * sin(degToRad(M)) + 0.02 * sin(degToRad(2 * M));&lt;br /&gt;    Lambda = moreLess360(Lambda);&lt;br /&gt;&lt;br /&gt;    double Obliquity = 23.439 - 0.0000004 * D;&lt;br /&gt;    double Alpha = radToDeg(atan((cos(degToRad(Obliquity)) * tan(degToRad(Lambda)))));&lt;br /&gt;    Alpha = moreLess360(Alpha);&lt;br /&gt;&lt;br /&gt;    Alpha = Alpha - (360 * (int)(Alpha / 360));&lt;br /&gt;    Alpha = Alpha + 90 * (floor(Lambda / 90) - floor(Alpha / 90));&lt;br /&gt;&lt;br /&gt;    double ST = 100.46 + 0.985647352 * D;&lt;br /&gt;    double Dec = radToDeg(asin(sin(degToRad(Obliquity)) * sin(degToRad(Lambda))));&lt;br /&gt;    double Durinal_Arc = radToDeg(acos((sin(degToRad(-0.8333)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))));&lt;br /&gt;&lt;br /&gt;    double Noon = Alpha - ST;&lt;br /&gt;    Noon = moreLess360(Noon);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    double UT_Noon = Noon - longitude;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    ////////////////////////////////////////////&lt;br /&gt;    // Calculating Prayer Times Arcs &amp;amp; Times //&lt;br /&gt;    //////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;    // 2) Zuhr Time [Local noon]&lt;br /&gt;    zuhrTime = UT_Noon / 15 + timeZone;&lt;br /&gt;&lt;br /&gt;    // Asr Hanafi&lt;br /&gt;    //double Asr_Alt =radToDeg(atan(2+tan(degToRad(latitude - Dec))));&lt;br /&gt;&lt;br /&gt;    // Asr Shafii&lt;br /&gt;    double Asr_Alt = radToDeg(atan(1 + tan(degToRad(latitude - Dec))));&lt;br /&gt;    double Asr_Arc = radToDeg(acos((sin(degToRad(90 - Asr_Alt)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))));&lt;br /&gt;    Asr_Arc = Asr_Arc / 15;&lt;br /&gt;    // 3) Asr Time&lt;br /&gt;    asrTime = zuhrTime + Asr_Arc;&lt;br /&gt;&lt;br /&gt;    // 1) Shorouq Time&lt;br /&gt;    sunRiseTime = zuhrTime - (Durinal_Arc / 15);&lt;br /&gt;&lt;br /&gt;    // 4) Maghrib Time&lt;br /&gt;    maghribTime = zuhrTime + (Durinal_Arc / 15);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    double Esha_Arc = radToDeg(acos((sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))));&lt;br /&gt;    // 5) Isha Time&lt;br /&gt;    ishaTime = zuhrTime + (Esha_Arc / 15);&lt;br /&gt;&lt;br /&gt;    // 0) Fajr Time&lt;br /&gt;    double Fajr_Arc = radToDeg(acos((sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))));&lt;br /&gt;    fajrTime = zuhrTime - (Fajr_Arc / 15);&lt;br /&gt;&lt;br /&gt;    return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, if I take &lt;b&gt;Cairo &lt;/b&gt;as an example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Date:&lt;/b&gt;&amp;nbsp;18-1-2012&lt;/li&gt;&lt;li&gt;&lt;b&gt;Longitude:&lt;/b&gt; 30.2&lt;/li&gt;&lt;li&gt;&lt;b&gt;Latitude:&lt;/b&gt; 30&lt;/li&gt;&lt;li&gt;&lt;b&gt;Time Zone:&lt;/b&gt; +2&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Fajr Twilight:&lt;/b&gt; -19.5&lt;/li&gt;&lt;li&gt;&lt;b&gt;Esha Twilight:&lt;/b&gt; -17.5&lt;/li&gt;&lt;/ul&gt;the function will be used like this:&lt;br /&gt;&lt;pre class="brush:cpp"&gt;double fajr, sunRise, zuhr, asr, maghrib, isha;&lt;br /&gt;calcPrayerTimes(2012,1,18, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note that these prayer times are still "double" and should be converted to a time format. I made the &lt;i&gt;doubleToHrMin&lt;/i&gt;&amp;nbsp;function (you can find it before the &lt;i&gt;calcPrayerTimes&lt;/i&gt; fnction) which splits the number into Hours and Minutes. It takes the double and two references to &lt;i&gt;int&lt;/i&gt; variables. Here is how to use it:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;int hours, minutes;&lt;br /&gt;doubleToHrMin(fajr, hours, minutes);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now you have the prayer time as Hour/Minute to use it however you want.&lt;br /&gt;&lt;br /&gt;So, in brief:&lt;br /&gt;- I first add the above code block to my code, then use it whenever I want like this example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;double fajr, sunRise, zuhr, asr, maghrib, isha;&lt;br /&gt;calcPrayerTimes(2012,1,18, 30.2, 30, 2, -19.5, -17.5,&lt;br /&gt;                fajr, sunRise, zuhr, asr, maghrib, isha);&lt;br /&gt;&lt;br /&gt;int hours, minutes;&lt;br /&gt;&lt;br /&gt;doubleToHrMin(fajr, hours, minutes);&lt;br /&gt;std::cout &amp;lt;&amp;lt; "Fajr: " &amp;lt;&amp;lt; hours &amp;lt;&amp;lt; ":" &amp;lt;&amp;lt; minutes &amp;lt;&amp;lt; std::endl;&lt;br /&gt;&lt;br /&gt;doubleToHrMin(sunRise, hours, minutes);&lt;br /&gt;std::cout &amp;lt;&amp;lt; "Sunrise: " &amp;lt;&amp;lt; hours &amp;lt;&amp;lt; ":" &amp;lt;&amp;lt; minutes &amp;lt;&amp;lt; std::endl;&lt;br /&gt;&lt;br /&gt;doubleToHrMin(zuhr, hours, minutes);&lt;br /&gt;std::cout &amp;lt;&amp;lt; "Zuhr: " &amp;lt;&amp;lt; hours &amp;lt;&amp;lt; ":" &amp;lt;&amp;lt; minutes &amp;lt;&amp;lt; std::endl;&lt;br /&gt;&lt;br /&gt;doubleToHrMin(asr, hours, minutes);&lt;br /&gt;std::cout &amp;lt;&amp;lt; "Asr: " &amp;lt;&amp;lt; hours &amp;lt;&amp;lt; ":" &amp;lt;&amp;lt; minutes &amp;lt;&amp;lt; std::endl;&lt;br /&gt;&lt;br /&gt;doubleToHrMin(maghrib, hours, minutes);&lt;br /&gt;std::cout &amp;lt;&amp;lt; "Maghrib: " &amp;lt;&amp;lt; hours &amp;lt;&amp;lt; ":" &amp;lt;&amp;lt; minutes &amp;lt;&amp;lt; std::endl;&lt;br /&gt;&lt;br /&gt;doubleToHrMin(isha, hours, minutes);&lt;br /&gt;std::cout &amp;lt;&amp;lt; "Isha: " &amp;lt;&amp;lt; hours &amp;lt;&amp;lt; ":" &amp;lt;&amp;lt; minutes &amp;lt;&amp;lt; std::endl;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I hope it is useful to someone looking for the pure algorithm with no framework dependencies, and I hope I come back to it one more time to see the problem of these extra resulting minutes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resources:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://qasweb.org/qasforum/index.php?s=f34bdd164a108c4c53299e4d52f7b1bb&amp;amp;showtopic=177"&gt;جمعية الفلك بالقطيف&lt;/a&gt;&lt;br /&gt;&lt;a href="http://forums.mpadc.com/showthread.php?5714-C-Prayer-Times-Calculation"&gt;Muslim Programmers &amp;amp; Designers Community&lt;/a&gt;&lt;br /&gt;Tanzil.info (&lt;a href="http://www.tanzil.info/praytime/doc/calculation/"&gt;1&lt;/a&gt;),(&lt;a href="http://tanzil.info/praytime/doc/manual/"&gt;2&lt;/a&gt;)&lt;br /&gt;&lt;a href="http://praytime.info/document.html"&gt;PrayTime.info&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.islamicity.com/forum/forum_posts.asp?TID=13090"&gt;IslamCity.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.islamware.com/"&gt;IslamWare.com&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5750426740089226667?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5750426740089226667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/07/prayer-times-calculations-pure-c-code.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5750426740089226667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5750426740089226667'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/07/prayer-times-calculations-pure-c-code.html' title='Prayer Times Calculations: Pure C++ Code'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-836068398588425353</id><published>2010-07-24T12:13:00.006+03:00</published><updated>2010-12-04T17:18:47.058+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>SQLite: 3.Qt and SQLite</title><content type='html'>&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;"&gt;I mentioned before that SQLite is a C library. To use this library in C++ applications, you can use many &lt;a href="http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers"&gt;wrappers&lt;/a&gt;. But since I'm going in the direction of Qt, I want to use the &lt;b&gt;QtSql module&lt;/b&gt;. QtSql module uses some &lt;a href="http://doc.trolltech.com/4.6/sql-driver.html"&gt;drivers&lt;/a&gt; to communicate with databases like SQLite, MySQL, Oracle ...&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TEquFbUmyEI/AAAAAAAAABo/zjBY2m_qRKI/s1600/check.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TEquFbUmyEI/AAAAAAAAABo/zjBY2m_qRKI/s320/check.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;"&gt;Or add&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//in the *.pro file&lt;br /&gt;QT += sql&lt;br /&gt;&lt;/pre&gt;and include&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//in any class&lt;br /&gt;#include &amp;lt;QtSql&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The process is very easy: Create a database object. Open it. Then execute some queries.&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;For this entry, I created a project to explain the basic features of QtSql. I will try to explain some parts of it, and you can download it and try to understand the complete code.&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;Viewing Table Contents:&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;To view table contents, you need a &lt;a href="http://doc.trolltech.com/4.6/qsqltablemodel.html"&gt;QSqlTableModel&lt;/a&gt; object. QSqlTableModel is a high-level interface for reading and writing database records from a single table.&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;A simple way to use it is like this:&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;After creating a database object, I create a QSqlTableModel object and connect it to my database. Then I name the table I want this object to represent.&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;pre class="brush:cpp"&gt;QSqlDatabase *database = new QSqlDatabase();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//set database driver to QSQLITE&lt;br /&gt;*database = QSqlDatabase::addDatabase("QSQLITE");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;database-&amp;gt;setDatabaseName("./phonebook.db");&lt;br /&gt;&lt;br /&gt;QSqlTableModel *all_model = new QSqlTableModel(this, *database);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;all_model-&amp;gt;setTable("Contacts");&lt;br /&gt;&lt;br /&gt;all_model-&amp;gt;select();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;Then I can use this model to preview the contents of this table in some 'item views' available in the GUI designers (List View, Tree View, Table View, Column View)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TEquR0VICgI/AAAAAAAAABw/x9QnMZSXTtQ/s1600/views.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TEquR0VICgI/AAAAAAAAABw/x9QnMZSXTtQ/s320/views.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;pre class="brush:cpp"&gt;ui-&amp;gt;contacts_tableView-&amp;gt;setModel(all_model);&lt;/pre&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;QSqlTableModel has some other methods like: sorting, filtering, editing a record...etc. For example, searching a database and viewing results can be implemented by filtering the current model:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//search database for a certain name&lt;br /&gt;search_model-&amp;gt;setFilter("Name = \'"+ui-&amp;gt;search_lineEdit-&amp;gt;text()+"\'");&lt;/pre&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;Queries:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://doc.trolltech.com/4.6/qsqlquery.html"&gt;QSqlQuery&lt;/a&gt; is a class that provides a means of executing and manipulating SQL statements. Its simplest statement looks like this:&lt;br /&gt;&lt;pre class="brush:cpp"&gt;QSqlQuery query("delete from Contacts where Mobile = 1234");&lt;br /&gt;query.exec();&lt;/pre&gt;&lt;br /&gt;The exec() method returns 'true' if query is successful, and 'false' if it fails.&lt;br /&gt;&lt;br /&gt;To make a query containing some variables, you can do this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;QSqlQuery query ("insert into Contacts (Name, Mobile, City) values (:name, :mobile, :city)");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.bindValue(0, ui-&amp;gt;add_name_lineEdit-&amp;gt;text());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.bindValue(1, ui-&amp;gt;add_mobile_lineEdit-&amp;gt;text());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.bindValue(2, ui-&amp;gt;add_city_lineEdit-&amp;gt;text());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!query.exec())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QMessageBox::warning(0,"Error", "Please check your entered data.");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;where 0, 1, and 2 are the positions of the variables &lt;b&gt;:name&lt;/b&gt;, &lt;b&gt;:mobile&lt;/b&gt;, and &lt;b&gt;:city&lt;/b&gt;. You can also replace the positions by the variable names:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.bindValue(":name", ui-&amp;gt;add_name_lineEdit-&amp;gt;text());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.bindValue(":mobile", ui-&amp;gt;add_mobile_lineEdit-&amp;gt;text());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.bindValue(":address", ui-&amp;gt;add_city_lineEdit-&amp;gt;text();&lt;/pre&gt;&lt;br /&gt;Note: sometimes i needed to change the query depending on a certain condition. One way to do this is using the prepare() method:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QSqlQuery query;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(ui-&amp;gt;remove_name_radioButton-&amp;gt;isChecked())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.prepare("delete from Contacts where Name = \'" + ui-&amp;gt;remove_lineEdit-&amp;gt;text()+"\'");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.prepare("delete from Contacts where Mobile = \'" + ui-&amp;gt;remove_lineEdit-&amp;gt;text()+"\'");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!query.exec())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QMessageBox::warning(0,"Error", "Please check your entered data.");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;The Complete Example:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, here is the complete example for Qt with SQLite. It is a phonebook application that views all the contacts (using QSqlTableModel and a Table View), searches for a specific contact (using the filter() method of QSqlTableModel), and adds or removes a contact (using the queries).&lt;br /&gt;&lt;br /&gt;Test it and read the code carefully. You can ask me anything you want.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_gfpo5lMGTYg/TEqtmWSWCwI/AAAAAAAAABg/Ey1n2rbB1xo/s1600/Phonebook.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://4.bp.blogspot.com/_gfpo5lMGTYg/TEqtmWSWCwI/AAAAAAAAABg/Ey1n2rbB1xo/s400/Phonebook.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?k1zb3vnzf0ehqod"&gt;&lt;b&gt;Download&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns:dct="http://purl.org/dc/terms/" property="dct:title"&gt;Blog Example&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="twitter.com/MahmoudAdly" property="cc:attributionName" rel="cc:attributionURL"&gt;Mahmoud Adly Ezzat&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-836068398588425353?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/836068398588425353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/07/sqlite-3qt-and-sqlite.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/836068398588425353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/836068398588425353'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/07/sqlite-3qt-and-sqlite.html' title='SQLite: 3.Qt and SQLite'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_gfpo5lMGTYg/TEquFbUmyEI/AAAAAAAAABo/zjBY2m_qRKI/s72-c/check.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-7837999278876770598</id><published>2010-07-12T12:23:00.004+03:00</published><updated>2010-07-24T14:09:53.253+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lita'/><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>SQLite: 2.Administration Tool</title><content type='html'>&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;After making some operations on a SQLite database &lt;a href="http://3adly.blogspot.com/2010/07/sqlite-part-1.html"&gt;using terminal&lt;/a&gt;, it would be better to have an easier and a more convenient tool. I wanted a free and easy-to-use program and i found Lita.&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.dehats.com/drupal/?q=node/58" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.dehats.com/drupal/files/icon_128_2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;a href="http://www.dehats.com/drupal/?q=node/58"&gt;Lita&lt;/a&gt; is a free SQLite database administration tool for Windows, MacOSX  and Linux. Using Lita, you can:&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;/div&gt;&lt;ul dir="ltr" style="text-align: left;"&gt;&lt;li&gt;Open, create, compact, manage SQLite databases&lt;/li&gt;&lt;li&gt;Create, rename, delete, and empty tables&lt;/li&gt;&lt;li&gt;Create, rename and delete columns&lt;/li&gt;&lt;li&gt;Create, modify and delete records&lt;/li&gt;&lt;li&gt;Encrypt or re-encrypt your databases&lt;/li&gt;&lt;li&gt;Run, import and export your custom SQL statements&lt;/li&gt;&lt;li&gt;Create and delete indices&lt;/li&gt;&lt;/ul&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="432" src="http://www.dehats.com/drupal/files/orignal.png" width="640" /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;Once I opened this program, I didn't need any tutorial to start using it. You should try it yourself.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-7837999278876770598?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/7837999278876770598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/07/sqlite-2-administration-tool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7837999278876770598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7837999278876770598'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/07/sqlite-2-administration-tool.html' title='SQLite: 2.Administration Tool'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-7603689222977552549</id><published>2010-07-08T22:53:00.005+03:00</published><updated>2010-07-24T14:09:59.480+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>SQLite: 1.Terminal Commands Tutorial</title><content type='html'>&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.sqlite.org/index.html" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="94" src="http://www.sqlite.org/images/SQLite.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;a href="http://www.sqlite.org/index.html"&gt;&lt;b&gt;SQLite&lt;/b&gt; &lt;/a&gt;is a C library that implements a database engine. It is a perfect choice for embedded systems because of its small size and big capabilities. It may have some missing features (&lt;a href="http://www.sqlite.org/omitted.html"&gt;click me&lt;/a&gt;) but it is still a good choice (&lt;a href="http://www.sqlite.org/features.html"&gt;click me&lt;/a&gt;).&amp;nbsp;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&amp;nbsp;I want to start with a nice tutorial that uses only a command-line program for accessing and modifying SQLite databases (&lt;a href="http://www.sqlite.org/sqlite-3_6_23_1.zip"&gt;sqlite-3_6_23_1.zip&lt;/a&gt;). This tutorial does not require any previous knowledge of SQL databases. And even if you know, I guess you will not get bored because these are short and divided videos, so you can jump through them or have a quick overlook.&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NYlCVoj4peg&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/NYlCVoj4peg&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QKagcH5yW64&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/QKagcH5yW64&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NcrZoHselPk&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/NcrZoHselPk&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/j56XJYmX2B0&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/j56XJYmX2B0&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xo_JrFU3XWc&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/xo_JrFU3XWc&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/agCqVr-m68A&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/agCqVr-m68A&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tDaB9swAPtM&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/tDaB9swAPtM&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xCs5OzgFw90&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/xCs5OzgFw90&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nSlf4xKcY-U&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/nSlf4xKcY-U&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-7603689222977552549?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/7603689222977552549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/07/sqlite-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7603689222977552549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7603689222977552549'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/07/sqlite-part-1.html' title='SQLite: 1.Terminal Commands Tutorial'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-7368750976844378799</id><published>2010-07-04T14:17:00.063+03:00</published><updated>2010-08-31T16:45:43.490+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Static Building for Qt Apps on Windows</title><content type='html'>&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;br /&gt;I have talked before about dynamic building (&lt;a href="http://3adly.blogspot.com/2010/06/building-qt-applications.html" style="color: blue;"&gt;click me&lt;/a&gt;) and now is the time for the static building. This is a long process that has many steps but I have to share my knowledge for those who are interested because I didn’t find a page that goes throw the entire process in details. &lt;br /&gt;The main reason for static building is collecting all the needed DLLs that you need in a single executable file (*.exe), so the target computer does not need to install any packages or programs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The steps are as follows:&lt;/b&gt;&lt;br /&gt;1-&amp;nbsp;&amp;nbsp;&amp;nbsp; Configuring Qt Creator for static building, and compiling it.&lt;br /&gt;2-&amp;nbsp;&amp;nbsp;&amp;nbsp; Building your application project statically using the configured Qt Creator.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;1-&amp;nbsp;&amp;nbsp;&amp;nbsp; Configuring Qt Creator for static building:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Unfortunately, the normal Qt Creator that you install is only configured for static building. So you have to do one of the following:&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;b&gt;1.1-&amp;nbsp;&amp;nbsp;&amp;nbsp; Download the Qt-Everywhere project and build your own customized Qt Creator:&lt;/b&gt;&lt;br /&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; This is done by downloading the (&lt;a href="http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.6.3.zip" style="color: blue;"&gt;qt-everywhere-opensource-src-4.6.3.zip&lt;/a&gt;)&lt;br /&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; Uncompress the file in a directory like C:\Qt\4.6.3&lt;br /&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; Use Visual Studio Command Prompt to browse to this folder (is should be containing a ‘configure’ file).&lt;br /&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; Assuming you have Visual Studio 2005 or 2008, configure this project for windows with a command like this from Visual Studio Command Prompt (not tested):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;configure -platform win32-msvc2008 –static –release -nomake demos -nomake examples –opensource -confirm-license -no-exceptions&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;for more configure options: type&lt;br /&gt;&lt;pre class="brush: cpp"&gt;configure –help&lt;/pre&gt;or download &lt;a href="http://www.mediafire.com/?eommmodommd" style="color: blue;"&gt;this file&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This may take about 30 minutes, and when done you can type &lt;br /&gt;&lt;pre class="brush: cpp"&gt;nmake sub-src&lt;/pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; then just relax and find something to do in the next two hours (give or take an hour)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.2-&amp;nbsp;&amp;nbsp;&amp;nbsp; If you have already installed Qt Creator on your PC:&lt;/b&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;You can reconfigure it to build statically by writing the following command in the ‘Qt Command Prompt’ (I prefer taking a copy and configuring it, so I use the original for developing and debuggingm, and the new one for the final build):&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;pre class="brush: cpp"&gt;configure -static -release -no-exceptions -nomake demos -nomake examples –opensource -confirm-license&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;then when done after about 30 minutes or less, type&lt;br /&gt;&lt;pre class="brush: cpp"&gt;mingw32-make sub-src&lt;/pre&gt;&lt;br /&gt;then just relax and find something to do in the next two hours (give or take an hour)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now you have a Qt Creator configured for static building.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;2-&amp;nbsp;&amp;nbsp;&amp;nbsp; Building your application project statically using the configured Qt Creator:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.1 Create any Qt project you want, than add the following lines in the project (*.pro) file:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: cpp"&gt;win32 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QMAKE_LFLAGS += -static-libgcc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;2.2 Now go to the Qt Command Prompt and browse to the folder of your application and type&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: cpp"&gt;C:\Qt\Qt-2010.01-static\qt\bin\qmake helloworld.pro&lt;/pre&gt;&lt;br /&gt;Where:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;helloworld.pro&lt;/span&gt; is the project file of my Qt application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;qmake &lt;/span&gt;is the file used to create the Makefile.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;C:\Qt\Qt-2010.01-static\qt\bin\&lt;/span&gt; is the directory of qmake in the newly compiled Qt Creator.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.3 Now write&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: cpp"&gt;mingw32-make&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;2.4 The statically built application can be found in the ‘Release’ folder in your project.&lt;/b&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;b&gt;Some Comments:&lt;/b&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;1-&amp;nbsp;&amp;nbsp;&amp;nbsp; Why bothering myself and doing all these steps? For me, nothing is wrong with adding the needed DLLs in the same folder with the dynamically built application.&lt;br /&gt;2-&amp;nbsp;&amp;nbsp;&amp;nbsp; There is this lovely warning that appears while configuring Qt: &lt;br /&gt;WARNING: Using static linking will disable the use of plugins. Make sure you compile ALL needed modules into the library.&lt;br /&gt;So I have to make sure that all the plugins that I may use in the future are available. (&lt;a href="http://www.formortals.com/how-to-statically-link-qt-4/" style="color: #38761d;"&gt;Click here for more:step3&lt;/a&gt;)&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Example: &lt;/b&gt;&lt;b&gt;Simple Map&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: #38761d;"&gt;&lt;a href="http://www.mediafire.com/?yaz0zyttnmi"&gt;Dynamically Built&lt;/a&gt;&lt;/div&gt;&lt;div style="color: #38761d;"&gt;&lt;/div&gt;&lt;div style="color: #38761d;"&gt;&lt;a href="http://www.mediafire.com/?mwtkznoyug3"&gt;Statically Built&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sources:&lt;/b&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;a href="http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/" style="color: #38761d;"&gt;Building Qt Static (and Dynamic) and Making it Small with GCC, Microsoft Visual Studio, and the Intel Compiler&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.formortals.com/how-to-statically-link-qt-4/" style="color: #38761d;"&gt;How to statically link Qt 4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jpz-log.info/archives/2007/02/20/qt-static-linking-and-removing-the-mingw-dll-dependency/" style="color: #38761d;"&gt;Qt static linking and removing the mingw-dll Dependency&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.qtcentre.org/threads/29489-Removing-dependencies-for-mingwm10.dll-and-libgcc_s_dw2-1.dll-static-linking" style="color: #38761d;"&gt;Removing dependencies for mingwm10.dll and libgcc_s_dw2-1.dll,static linking?&lt;/a&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;a href="http://www.formortals.com/how-to-statically-link-qt-4/" style="color: #38761d;"&gt;Make your entire Qt application work entirely from a single file&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-7368750976844378799?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/7368750976844378799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/07/static-building-for-qt-apps-on-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7368750976844378799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7368750976844378799'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/07/static-building-for-qt-apps-on-windows.html' title='Static Building for Qt Apps on Windows'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-7602566619222185132</id><published>2010-06-30T21:54:00.011+03:00</published><updated>2010-10-21T10:02:07.870+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Dynamic Building for Qt Apps on Windows</title><content type='html'>&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;قبل التحدث عن كيفية بناء مشروع &lt;/span&gt;&lt;span dir="LTR"&gt;Qt&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; &lt;span lang="AR-EG"&gt;, أريد أن أوضح الفرق بين شيئين: &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;Debug &amp;amp; Release&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Debug Version&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;b&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; :&lt;/b&gt; يحتوي البرنامج الناتج على بعض الإضافات التي تساعد في عملية الـ&lt;/span&gt;&lt;span dir="LTR"&gt;debugging&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; مثل مراقبة المتغيرات داخل البرنامج و معرفة أي خطوة داخل البرنامج يتم تنفيذها الآن.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Release Version&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;b&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; :&lt;/b&gt; يحدث شيء مختلف هنا و هو &lt;/span&gt;&lt;span dir="LTR"&gt;Code Optimization&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;. أي قد تتم بعض التعديلات على الكود الخاص بك للزيادة من سرعة البرنامج أو توفيرا للذاكرة المستخدمة أو..... (&lt;a href="http://en.wikipedia.org/wiki/Compiler_optimization"&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;للمزيد&lt;/span&gt;&lt;/a&gt;) . نتيجة لذلك يكون البرنامج أكثر سرعة من الـ&lt;/span&gt;&lt;span dir="LTR"&gt;Debug Version&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; و أقل حجما و لكن قد تلاحظ &amp;nbsp;بعض المشكلات نتيجة لعملية الـ&lt;/span&gt;&lt;span dir="LTR"&gt;optimization&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; &lt;span lang="AR-EG"&gt;فيجب التأكد من ذلك بإعادة تجربة البرنامج بعد بنائه كـ &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;release version&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; .&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;b&gt;طريقة البناء في &lt;/b&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Qt&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;b&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; :&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;1-&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;قم باختيار &amp;nbsp;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Build -&amp;gt; Set Build Configuration -&amp;gt; Release&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;(أو &lt;b&gt;Build -&amp;gt; Open Build/Run Target Selector -&amp;gt; Desktop -&amp;gt; Release&lt;/b&gt; في إصدارة Nokia Qt SDK 1.0.1 )&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;&lt;/span&gt;2-&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;قم بالبناء من خلال&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Build -&amp;gt; Build Project&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;&lt;/span&gt;3-&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;الآن تجد البرنامج الناتج في مجلد &lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Release&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;b&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; &lt;/b&gt;داخل مجلد المشروع. و لكنه لن يعمل بعد&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;4-&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;الآن هناك بعض الـ&lt;/span&gt;&lt;span dir="LTR"&gt;DLLs&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; التي يجب وضعها بجانب البرنامج كي يعمل. سوف نأخذ نسخة منها من مجلد &lt;/span&gt;&lt;span dir="LTR"&gt;Qt&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; . على سبيل المثال: المجلد الذي سآخذ منه هو&amp;nbsp;&lt;/span&gt;&lt;b&gt;C:\Qt\2010.01\qt\bin&lt;/b&gt; (قد يختلف قليلا حسب الإصدار أو مكان تثبيت Qt )&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;الملفات التي سآخذها أولا هي:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;&lt;b&gt;libgcc_s_dw2-1.dll&lt;/b&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;&lt;b&gt;mingwm10.dll&lt;/b&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;&lt;b&gt;QtCore4.dll&lt;/b&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;هناك بعض الملفات الإضافية التي آخذها حسب الـ&lt;/span&gt;&lt;span dir="LTR"&gt;Modules&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt; التي اخترتها عند إنشائي للمشروع. فمثلا إذا كان مشروعي قد استخدم &lt;/span&gt;&lt;span dir="LTR"&gt;GUI Module&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt; فسأحتاج لـ&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;QtGui4.dll&lt;/b&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;, و إذا استخدمت &lt;/span&gt;&lt;span dir="LTR"&gt;XML Module&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt; فسأحتاج إلى&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;QtXml4.dll&lt;/b&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt; .... و هكذا. لابد من ملاحظة شيء مهم وهو أن هناك ملفات باسم مشابه و لكن مضاف إليها حرف &lt;/span&gt;&lt;span dir="LTR"&gt;“&lt;b&gt;d&lt;/b&gt;”&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt; مثل &lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;QtCored4.dll&lt;/b&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt; و &lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;QtGuid4.dll&lt;/b&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt; .. و هي خاصة بالـ&lt;/span&gt;&lt;span dir="LTR"&gt;debug version&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt; فلا يجب أن نخلط بينهم (الملفات الخاصة بالـDebug أكبر في الحجم من الـRelease عدة مرات).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;كل هذه الملفات أضعها بجانب البرنامج في نفس المجلد لأضمن عمله على أي جهاز.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;هناك طريقة أخرى لجمع هذه الملفات بداخل البرنامج تسمى &lt;/span&gt;&lt;span dir="LTR"&gt;&lt;b&gt;Static Building&lt;/b&gt;&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;, و سأتحدث عنها لاحقا إن شاء الله.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-7602566619222185132?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/7602566619222185132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/06/building-qt-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7602566619222185132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7602566619222185132'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/06/building-qt-applications.html' title='Dynamic Building for Qt Apps on Windows'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-7034620117296961645</id><published>2010-06-29T15:04:00.005+03:00</published><updated>2010-07-03T11:31:34.160+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C++ for Beginners: 2/2</title><content type='html'>&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;هذا هو الجزء الثاني من &lt;/span&gt;&lt;span dir="LTR"&gt;C++ for Beginners&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; و هدفه الأساسي التعريف ببعض الـ &lt;/span&gt;&lt;span dir="LTR"&gt;IDEs&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; المستخدمة لإنشاء برامج &lt;/span&gt;&lt;span dir="LTR"&gt;C++&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; ذات واجهة رسومية &lt;/span&gt;&lt;span dir="LTR"&gt;GUI&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;. لقد استخدمت اثنين بشكل أساسي و هما&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;Visual Studio&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span dir="LTR"&gt;Qt&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;بالإضافة لمن رشّحوا استخدام &lt;/span&gt;&lt;span dir="LTR"&gt;NetBeans&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; و &lt;/span&gt;&lt;span dir="LTR"&gt;Eclipse&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&amp;nbsp; و لكن لم أستخدمهم بعد. لذلك سأكتفي بالمقارنة بين ما استخدمته.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;b&gt;Platform:&lt;/b&gt;&lt;span dir="RTL" lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;Visual Studio&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span dir="RTL" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span dir="LTR"&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;/span&gt;: Works only on Windows&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;Qt: Works on Windows, Linux, Mac, Symbian … You just recompile your project on that platform to make a copy for it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;But if you only develop on Windows, this piece of info is not important.&lt;span dir="RTL" lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left; unicode-bidi: embed;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;b&gt;GUI Design:&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;I liked the GUI in Qt much more than Visual Studio, because it has many useful elements, a variety of 3&lt;sup&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;rd&lt;/span&gt;&lt;/sup&gt; party classes, and a very very &amp;nbsp;important feature called ‘Layout’. It means that if you change the size of program window, the design will still fit inside it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;b&gt;Debugging:&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;The debugging in Visual Studio is easier when debugging very big programs. But for normal programs, both Visual Studio and Qt are fine.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;b&gt;IntelliSense &amp;nbsp;(auto complete):&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;Both are fine, but Visual Studio has a more fancy one.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;b&gt;Event Handling:&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;Qt uses something called ‘Signals and Slots’ which makes event handling a lot easier than Visual Studio.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;b&gt;Documentation and Help:&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;Visual Studio is very popular, so there are a lot of forums that can help you. There are also lots of forums for Qt but not as much as Visual Studio.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;For documentation, I found the documentation of Qt &amp;nbsp;more helpful than the MSDN of Visual Studio&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="Apple-style-span" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal" dir="RTL" style="direction: rtl; text-align: right; unicode-bidi: embed;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial,sans-serif;"&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;بالنسبة لي فأنا أفضّل &lt;/span&gt;&lt;span dir="LTR"&gt;Qt&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; أكثر من &lt;/span&gt;&lt;span dir="LTR"&gt;Visual Studio&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;... و لكن يمكنكم أن تختبروهما و أي &lt;/span&gt;&lt;span dir="LTR"&gt;IDE&lt;/span&gt;&lt;span dir="RTL"&gt;&lt;/span&gt;&lt;span lang="AR-EG" style="font-family: Arial,sans-serif;"&gt;&lt;span dir="RTL"&gt;&lt;/span&gt; آخر&amp;nbsp; تختارونه. ففي النهاية كل شخص يختار بناء على خبرات أو نقاط ذات اهتمام أكثر من الأخرى.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial,sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;b&gt;Websites to help:&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;a href="http://qt.nokia.com/"&gt;Qt&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;a href="http://www.blogger.com/goog_868083323"&gt;Visual Studio&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;a href="http://www.blogger.com/goog_868083329"&gt;Eclipse&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;a href="http://netbeans.org/"&gt;NetBeans&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Qt Free Reference:&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" dir="ltr" style="text-align: left;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span class="link-external"&gt;&lt;a href="http://www.qtrac.eu/C++-GUI-Programming-with-Qt-4-1st-ed.zip"&gt;C++ GUI Programming with Qt 4, 1st Edition&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-7034620117296961645?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/7034620117296961645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/06/c-for-beginners-22.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7034620117296961645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/7034620117296961645'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/06/c-for-beginners-22.html' title='C++ for Beginners: 2/2'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-5605436999720814000</id><published>2010-06-25T01:34:00.009+03:00</published><updated>2010-06-29T14:47:23.122+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C++ for Beginners: 1/2</title><content type='html'>&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="Apple-style-span"&gt;لغة C++ هي واحدة من أقوى لغات البرمجة التي يمكنك تعلّمها دون مجهود كبير. فأساسيات اللغة ليست بالكثيرة و بالتالي سريعة الفهم و التعلّم. برامجها تمتاز بالسرعة. لا تعتمد على نظام تشغيل محدد فيمكن استخدامها على Windows, Linux, Mac.. بدون اختلافات. كما أنها لا تزال تتطوّر منذ ظهورها و بالتالي فهي تنافس لغات البرمجة الأخرى. &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;هذه بعض المصادر التي أنصح باستخدامها لتعلّم أساسيات C++ , و هي أساسيات يمكن تعلّمها في أبسط أشكال البرامج: &lt;/span&gt;&lt;/b&gt;&lt;a href="http://en.wikipedia.org/wiki/Console_application"&gt;&lt;b&gt;&lt;i&gt;Console Applications&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;  (أي برامج تتعامل فقط من خلال نصوص تظهر للمستخدم أو يدخلها المستخدم)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;a href="http://www.cplusplus.com/doc/tutorial/"&gt;&lt;span class="Apple-style-span"&gt;cplusplus.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;مصدر مثالي لتعلّم C++ من الصفر. يتكون من حوالي 140 صفحة تشمل الأساسيات التي يجب تعلّمها و تحتوي على بعض الأمثلة الصغيرة للتوضيح. هي غير كافية للتمكن من اللغة و لكنها تشكّل صورة كاملة عن اللغة يمكن البناء عليها من مصادر أكبر.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;a href="http://www.cprogramming.com/tutorial.html"&gt;cprogramming.com&lt;/a&gt;&lt;br /&gt;هذا المصدر أيضا يبدأ من الصفر و لكنه يحتوى على العديد من المواضيع المتقدمة التي يمكن الدخول فيها بعد التمكن من الأساسيات. و هو أيضا يشرح باستخدام أمثلة بسيطة لتوضيح كل نقطة.&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;a href="http://c-faq.com/"&gt;&lt;span class="Apple-style-span"&gt;C Frequently Asked Questions&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;أنصح بتصفحه و لكن بعد تعلّم أساسيات C++ , لأنه يناقش بعض الأخطاء التي قد نقع فيها أثناء البرمجة. أجده مفيدا للتأكد من مدى فهمي لبعض النقاط في C++&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="Apple-style-span"&gt;ثم المصدر المفضّل لدي:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.deitel.com/Books/CPlusPlus/CPlusPlusHowtoProgram7e/tabid/3472/Default.aspx"&gt;&lt;span class="Apple-style-span"&gt;C++ How to Program&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;هذا الكتاب رغم كثرة صفحاتة و طول الشرح في كل نقطة في C++ و كثرة الأمثلة التي قد تبدو مملة (على الأقل بالنسبة لي), إلا أنه مثالي في الشرح. فهو لا يعرّفني على إحدى النقاط و لكنه يشرحها بالفصيل و باحتمالاتها المختلفة, بل أيضا أفضل ممارسات البرمجة لكل نقطة من حيث تجنّب الأخطاء و زيادة السرعة. و مع الكتاب تأتي اسطوانة بها جميع الأمثلة المذكورة بالمتاب لتوفير وقت إعادة كتابتها. كما أن النسخة الجديدة من الكتاب بها مواضيع مهمة تخص تطوير C++ و أسباب بقاء C++ قوية و مستخدمة بكثرة حتى الآن.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;span class="Apple-style-span"&gt;أي من المصادر السابقة أجده كافيا لتعلّم C++ (مع اختلاف درجات الإتقان و تغطية المواضيع الجديدة). و بمعرفة هذه الأساسيات, نكون مستعدين للإنشاء البرامج ذات&lt;/span&gt;&lt;i&gt; &lt;/i&gt;&lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;&lt;i&gt;الواجهة الرسومية&lt;/i&gt;&lt;/a&gt;&lt;span class="Apple-style-span"&gt; التي نستخدمها في كل برامجنا, و التي سأتحدث عنها في المرة القادمة.&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;بعض البرامج التي يمكن استخدامها:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;في هذه المرحلة من تعلّم C++ , لا داعى لاستخدام أي من البرامج الكبيرة مثل&lt;/span&gt;&lt;a href="http://www.microsoft.com/express/Downloads/#2010-Visual-CPP"&gt;&lt;span class="Apple-style-span"&gt; Visual C++&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"&gt;, و لكن تكفينا برامج بسيطة مثل:&lt;/span&gt;&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;a href="http://www.bloodshed.net/dev/devcpp.html"&gt;&lt;span class="Apple-style-span"&gt;Dev-C++&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;a href="http://edn.embarcadero.com/article/20633"&gt;&lt;span class="Apple-style-span"&gt;Borland C++&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;a href="http://www.codeblocks.org/"&gt;&lt;span class="Apple-style-span"&gt;Code:Blocks&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-5605436999720814000?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/5605436999720814000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/06/c-for-beginners-12.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5605436999720814000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/5605436999720814000'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/06/c-for-beginners-12.html' title='C++ for Beginners: 1/2'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-308361232795615929.post-4675466093437415473</id><published>2010-06-18T19:51:00.007+03:00</published><updated>2011-04-24T19:24:35.323+02:00</updated><title type='text'>المقدمة Introduction</title><content type='html'>&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;السلام عليكم و رحمة الله و بركاته&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;هذه هي أول مدونة لي في مجال تخصصي – و هو مجال الحاسبات و النظم - , السبب في إنشائها كان مشاركة ما أعرفه من علم و إن كان قليلا بالإضافة لتسجيل المستوى الذي أنا عليه كل فترة لأعرف مدى تقدمي و تكون سببا في دفعى للتقدم أكثر. هناك بعض الخطوط التي أحاول الالتزام بها, و منها:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt; ما أكتبه يجب أن أتأكد منه بنفسي, و بخاصة الأكواد.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;المهم في العلم ليس مجرد التلقي , و إنما معرفة كيفية الوصول لهذا العلم و تطبيقه. و هذا هو الأسلوب الذي أحاول اتباعه في تعلّمي.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt; لا فائدة من إعادة كتابة بعض المواضيع التي أجدها, و لكن يمكنني تلخيص الموضوع أو خلاصة ما بحثت عنه مع وضع المصادر التي استخدمتها.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt; يمكنكم استخدام و توزيع ما أنشره - طالما لم أذكر غير ذلك - فمن حق الجميع أن يتعلّم.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt; التعليق على ما أكتبه يكون محل ترحيب شديد. لأنه أسلوب جيد لمعرفة أخطائي و تطوير أسلوبي.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt; &lt;br /&gt;&lt;br /&gt;أتمنى أن أكود مصدر إفادة من خلال هذه المدونة و في انتظار أرائكم ...... تابعونا :)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;This is my first technical blog in my speciality, Computers and Systems. The reason for making it was sharing what I know, even if it was a little, in addition to leaving a record of my current level to observe my development and find a way to push me forward. There are some guidelines I'm trying to stick to:&lt;/span&gt;&lt;/div&gt;&lt;ul dir="ltr" style="text-align: left;"&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;I make sure of what I write, especially the codes.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;Learning is not about materials or sources, but how to learn and apply. And this is the way I'm trying to apply in my learning.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;There is no use of rewriting the topics I find, but I can summarize the topic or a summary of my search, aside with the resources I used.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;You are free to use or distribute what I publish, unless I mention anything else. It is the right of everyone to learn.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;Commenting on my posts is more than welcomed. Because it is a good way of knowing my mistakes and developing my style.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;span style="font-size: 100%; font-weight: bold;"&gt;I hope I be useful through this blog, and waiting for your opinions ... stay tuned :)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/308361232795615929-4675466093437415473?l=3adly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3adly.blogspot.com/feeds/4675466093437415473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://3adly.blogspot.com/2010/06/introduction.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/4675466093437415473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/308361232795615929/posts/default/4675466093437415473'/><link rel='alternate' type='text/html' href='http://3adly.blogspot.com/2010/06/introduction.html' title='المقدمة Introduction'/><author><name>Mahmoud Adly Ezzat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-SURWxL70-00/TtPAtcbveEI/AAAAAAAAAXo/mf_5qV-vyzw/s220/5275950.jpg'/></author><thr:total>0</thr:total></entry></feed>
