<?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-8699384813664411939</id><updated>2012-02-16T11:58:00.068-08:00</updated><category term='Dev'/><category term='media'/><category term='system'/><category term='AntiVirus'/><category term='pocket PC'/><category term='App'/><category term='Crack'/><category term='Hack'/><category term='Project:WM-upgrade'/><category term='Game'/><category term='dav'/><category term='security'/><category term='webSites'/><category term='iPhone 3GS'/><category term='freewarepocketpc.net'/><category term='language'/><category term='communication'/><category term='enhancement'/><category term='JailBreaking'/><category term='tests'/><category term='iPhone'/><category term='Coding_PPC'/><category term='iPod_touch'/><category term='Mix'/><category term='n00b'/><category term='internet'/><category term='PPL Tutorials'/><category term='article'/><category term='RingTone'/><category term='warezForum'/><category term='Torrents'/><category term='Health'/><category term='backup'/><category term='Pack'/><category term='utilities'/><title type='text'>iPhoneOS</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default?start-index=101&amp;max-results=100'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>191</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-8002459486553585077</id><published>2011-09-03T13:56:00.000-07:00</published><updated>2011-09-03T13:56:22.136-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='n00b'/><title type='text'>This Post is Copy of [http://catb.org/esr/faqs/smart-questions.html]</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title"&gt;How To Ask Questions The Smart Way&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="author"&gt;&lt;h3 class="author"&gt;&lt;span class="firstname"&gt;Eric&lt;/span&gt; &lt;span class="othername"&gt;Steven&lt;/span&gt; &lt;span class="surname"&gt;Raymond&lt;/span&gt;&lt;/h3&gt;&lt;div class="affiliation"&gt;&lt;span class="orgname"&gt;&lt;a class="ulink" href="http://www.catb.org/~esr/" target="_top"&gt;     Thyrsus Enterprises&lt;/a&gt;&lt;/span&gt;&lt;div class="address"&gt;&lt;br /&gt;Â&amp;nbsp;Â&amp;nbsp;Â&amp;nbsp;Â&amp;nbsp;&lt;code class="email"&gt;&amp;lt;&lt;a class="email" href="mailto:esr@thyrsus.com"&gt;esr@thyrsus.com&lt;/a&gt;&amp;gt;&lt;/code&gt;&lt;br /&gt;Â&amp;nbsp;Â&amp;nbsp;Â&amp;nbsp;Â&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="author"&gt;&lt;h3 class="author"&gt;&lt;span class="firstname"&gt;Rick&lt;/span&gt; &lt;span class="surname"&gt;Moen&lt;/span&gt;&lt;/h3&gt;&lt;div class="affiliation"&gt;&lt;div class="address"&gt;&lt;br /&gt;Â&amp;nbsp;Â&amp;nbsp;Â&amp;nbsp;Â&amp;nbsp;&lt;code class="email"&gt;&amp;lt;&lt;a class="email" href="mailto:respond-auto@linuxmafia.com"&gt;respond-auto@linuxmafia.com&lt;/a&gt;&amp;gt;&lt;/code&gt;&lt;br /&gt;Â&amp;nbsp;Â&amp;nbsp;Â&amp;nbsp;Â&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="copyright"&gt;Copyright Â© 2001,2006 Eric S. Raymond, Rick Moen&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="revhistory"&gt;&lt;table border="1" summary="Revision history"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th align="left" colspan="3" valign="top"&gt;&lt;b&gt;Revision History&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.7&lt;/td&gt;&lt;td align="left"&gt;06 Dec 2010&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	Helpful hints for ESL speakers.       &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.7&lt;/td&gt;&lt;td align="left"&gt;02 Nov 2010&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	Several translations have disappeared.       &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.6&lt;/td&gt;&lt;td align="left"&gt;19 Mar 2008&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	Minor update and new links.       &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.5&lt;/td&gt;&lt;td align="left"&gt;2 Jan 2008&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	Typo fix and some translation links.       &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.4&lt;/td&gt;&lt;td align="left"&gt;24 Mar 2007&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	New section, "When asking about code".       &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.3&lt;/td&gt;&lt;td align="left"&gt;29 Sep 2006&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	Folded in a good suggestion from Kai Niggemann.       &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.2&lt;/td&gt;&lt;td align="left"&gt;10 Jan 2006&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	Folded in edits from Rick Moen.       &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.1&lt;/td&gt;&lt;td align="left"&gt;28 Oct 2004&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	Document 'Google is your friend!'       &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;Revision 3.0&lt;/td&gt;&lt;td align="left"&gt;2 Feb 2004&lt;/td&gt;&lt;td align="left"&gt;esr&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" colspan="3"&gt; 	Major addition of stuff about proper etiquette on Web forums.       &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;div class="toc"&gt;&lt;b&gt;Table of Contents&lt;/b&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#translations"&gt;Translations&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#disclaimer"&gt;Disclaimer&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#intro"&gt;Introduction&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#before"&gt;Before You Ask&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#asking"&gt;When You Ask&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#forum"&gt;Choose your forum carefully&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#usefora"&gt;Web and IRC forums directed towards newbies often give the quickest response&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#uselists"&gt;As a second step, use project mailing lists&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#bespecific"&gt;Use meaningful, specific subject headers&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#easyreply"&gt;Make it easy to reply&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#writewell"&gt;Write in clear, grammatical, correctly-spelled language&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#formats"&gt;Send questions in accessible, standard formats&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#beprecise"&gt;Be precise and informative about your problem&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#volume"&gt;Volume is not precision&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#id478549"&gt;Don't rush to claim that you have found a bug&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#id478703"&gt;Grovelling is not a substitute for doing your homework&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#symptoms"&gt;Describe the problem's symptoms, not your guesses&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#chronology"&gt;Describe your problem's symptoms in chronological order&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#goal"&gt;Describe the goal, not the step&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#noprivate"&gt;Don't ask people to reply by private e-mail&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#explicit"&gt;Be explicit about your question&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#code"&gt;When asking about code&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#homework"&gt;Don't post homework questions&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#prune"&gt;Prune pointless queries&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#urgent"&gt;Don't flag your question as &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Urgent&lt;/span&gt;â€&lt;/span&gt;, even if it is for you&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#courtesy"&gt;Courtesy never hurts, and sometimes helps&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#followup"&gt;Follow up with a brief note on the solution&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#answers"&gt;How To Interpret Answers&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#rtfm"&gt;RTFM and STFW: How To Tell You've Seriously Screwed Up&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#lesser"&gt;If you don't understand...&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dt&gt;&lt;span class="sect2"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#keepcool"&gt;Dealing with rudeness&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#not_losing"&gt;On Not Reacting Like A Loser&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#classic"&gt;Questions Not To Ask&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#examples"&gt;Good and Bad Questions&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479876"&gt;If You Can't Get An Answer&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479916"&gt;How To Answer Questions in a Helpful Way&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479985"&gt;Related Resources&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;&lt;span class="sect1"&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html#id480012"&gt;Acknowledgements&lt;/a&gt;&lt;/span&gt;&lt;/dt&gt;&lt;br /&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div class="sect1" title="Translations"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="translations"&gt;&lt;/a&gt;Translations&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Translations: &lt;a class="ulink" href="http://bulsara.host.sk/index.php?p=2005" target="_top"&gt;Bahasa Indonesian&lt;/a&gt; &lt;a class="ulink" href="http://www.fatcow.com/edu/smart-questions-by" target="_top"&gt;Belorussian&lt;/a&gt; &lt;a class="ulink" href="http://www.istf.com.br/perguntas/" target="_top"&gt;Brazilo-Portuguese&lt;/a&gt; &lt;a class="ulink" href="http://www.lat30n.cn/doc/oss/smart-questions.html" target="_top"&gt;Chinese&lt;/a&gt; &lt;a class="ulink" href="http://docs.jaspervries.nl/smart-questions/" target="_top"&gt;Dutch&lt;/a&gt; &lt;a class="ulink" href="http://www.gnurou.org/documents/smart-questions-fr.html" target="_top"&gt;French&lt;/a&gt; &lt;a class="ulink" href="http://maxo127.narod.ru/Geo/Articles/smart-questions_ge.html" target="_top"&gt;Georgian&lt;/a&gt; &lt;a class="ulink" href="http://www.tty1.net/smart-questions_de.html" target="_top"&gt;German&lt;/a&gt; &lt;a class="ulink" href="http://www.dionyziz.com/howto-smart-questions-gr/" target="_top"&gt;Greek&lt;/a&gt; &lt;a class="ulink" href="http://www.penguin.org.il/essays/smart-questions-he.html" target="_top"&gt;Hebrew&lt;/a&gt; &lt;a class="ulink" href="http://www.ranvis.com/articles/smart-questions.ja.html" target="_top"&gt;Japanese&lt;/a&gt; &lt;a class="ulink" href="http://rtfm.killfile.pl/" target="_top"&gt;Polish&lt;/a&gt; &lt;a class="ulink" href="http://www.celiojunior.com.br/comofazerperguntas.htm" target="_top"&gt;Portuguese&lt;/a&gt; &lt;a class="ulink" href="http://wiki.lug.ro/mediawiki/index.php/Cum_se_pun_%C3%AEntreb%C4%83ri_%C3%AEn_mod_inteligent" target="_top"&gt;Romanian&lt;/a&gt; &lt;a class="ulink" href="http://maddog.sitengine.ru/smart-question-ru.html" target="_top"&gt;Russian&lt;/a&gt; &lt;a class="ulink" href="http://www.sindominio.net/ayuda/preguntas-inteligentes.html" target="_top"&gt;Spanish&lt;/a&gt; &lt;a class="ulink" href="http://wiki.opentle.org/Smart-questions" target="_top"&gt;Thai&lt;/a&gt; &lt;a class="ulink" href="http://belgeler.org/howto/smart-questions.html" target="_top"&gt;Turkish&lt;/a&gt;. If you want to copy, mirror, translate, or excerpt this document, please see my &lt;a class="ulink" href="http://www.catb.org/~esr/copying.html" target="_top"&gt;copying policy&lt;/a&gt;.&lt;/div&gt;&lt;div class="sect1" title="Disclaimer"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="disclaimer"&gt;&lt;/a&gt;Disclaimer&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Many project websites link to this document in their sections on how to get help.  That's fine, it's the use we intended â€” but if you are a webmaster creating such a link for your project page, please display prominently near the link notice that &lt;span class="emphasis"&gt;&lt;em&gt;we are not a help desk for your project!&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;We have learned the hard way that without such a notice, we will repeatedly be pestered by idiots who think having published this document makes it our job to solve all the world's technical problems.&lt;br /&gt;If you're reading this document because you need help, and you walk away with the impression you can get it directly from the authors of this document, &lt;span class="emphasis"&gt;&lt;em&gt;you&lt;/em&gt;&lt;/span&gt; are one of the idiots we are talking about.  Don't ask &lt;span class="emphasis"&gt;&lt;em&gt;us&lt;/em&gt;&lt;/span&gt; questions.  We'll just ignore you.  We are here to show you how to get help from people who actually know about the software or hardware you're dealing with, but 99.9% of the time that will not be us.  Unless you know for &lt;span class="emphasis"&gt;&lt;em&gt;certain&lt;/em&gt;&lt;/span&gt; that one of the authors is an expert on what you're dealing with, leave us alone and everybody will be happier.&lt;/div&gt;&lt;div class="sect1" title="Introduction"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="intro"&gt;&lt;/a&gt;Introduction&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;In the world of &lt;a class="ulink" href="http://www.catb.org/~esr/faqs/hacker-howto.html" target="_top"&gt;hackers&lt;/a&gt;, the kind of answers you get to your technical questions depends as much on the way you ask the questions as on the difficulty of developing the answer. This guide will teach you how to ask questions in a way more likely to get you a satisfactory answer.&lt;br /&gt;Now that use of open source has become widespread, you can often get as good answers from other, more experienced users as from hackers. This is a Good Thing; users tend to be just a little bit more tolerant of the kind of failures newbies often have. Still, treating experienced users like hackers in the ways we recommend here will generally be the most effective way to get useful answers out of them, too.&lt;br /&gt;The first thing to understand is that hackers actually like hard problems and good, thought-provoking questions about them.  If we didn't, we wouldn't be here.  If you give us an interesting question to chew on we'll be grateful to you; good questions are a stimulus and a gift.  Good questions help us develop our understanding, and often reveal problems we might not have noticed or thought about otherwise. Among hackers, &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Good question!&lt;/span&gt;â€&lt;/span&gt; is a strong and sincere compliment.&lt;br /&gt;Despite this, hackers have a reputation for meeting simple questions with what looks like hostility or arrogance.  It sometimes looks like we're reflexively rude to newbies and the ignorant.  But this isn't really true.&lt;br /&gt;What we are, unapologetically, is hostile to people who seem to be unwilling to think or to do their own homework before asking questions.  People like that are time sinks â€” they take without giving back, and they waste time we could have spent on another question more interesting and another person more worthy of an answer.  We call people like this &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;losers&lt;/span&gt;â€&lt;/span&gt; (and for historical reasons we sometimes spell it &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;lusers&lt;/span&gt;â€&lt;/span&gt;).&lt;br /&gt;We realize that there are many people who just want to use the software we write, and who have no interest in learning technical details. For most people, a computer is merely a tool, a means to an end; they have more important things to do and lives to live.  We acknowledge that, and don't expect everyone to take an interest in the technical matters that fascinate us.  Nevertheless, our style of answering questions is tuned for people who &lt;span class="emphasis"&gt;&lt;em&gt;do&lt;/em&gt;&lt;/span&gt; take such an interest and are willing to be active participants in problem-solving.  That's not going to change.  Nor should it; if it did, we would become less effective at the things we do best.&lt;br /&gt;We're (largely) volunteers.  We take time out of busy lives to answer questions, and at times we're overwhelmed with them.  So we filter ruthlessly.  In particular, we throw away questions from people who appear to be losers in order to spend our question-answering time more efficiently, on winners.&lt;br /&gt;If you find this attitude obnoxious, condescending, or arrogant, check your assumptions.  We're not asking you to genuflect to us â€” in fact, most of us would love nothing more than to deal with you as an equal and welcome you into our culture, if you put in the effort required to make that possible.  But it's simply not efficient for us to try to help people who are not willing to help themselves.  It's OK to be ignorant; it's not OK to play stupid.&lt;br /&gt;So, while it isn't necessary to already be technically competent to get attention from us, it &lt;span class="emphasis"&gt;&lt;em&gt;is&lt;/em&gt;&lt;/span&gt; necessary to demonstrate the kind of attitude that leads to competence â€” alert, thoughtful, observant, willing to be an active partner in developing a solution.  If you can't live with this sort of discrimination, we suggest you pay somebody for a commercial support contract instead of asking hackers to personally donate help to you.&lt;br /&gt;If you decide to come to us for help, you don't want to be one of the losers.  You don't want to seem like one, either.  The best way to get a rapid and responsive answer is to ask it like a person with smarts, confidence, and clues who just happens to need help on one particular problem.&lt;br /&gt;(Improvements to this guide are welcome.  You can mail suggestions to &lt;a class="ulink" href="mailto:esr@thyrsus.com" target="_top"&gt;esr@thyrsus.com&lt;/a&gt; or &lt;a class="ulink" href="http://catb.org/esr/faqs/respond-auto@linuxmafia.com" target="_top"&gt;respond-auto@linuxmafia.com&lt;/a&gt;. Note however that this document is not intended to be a general guide to &lt;a class="ulink" href="http://www.dtcc.edu/cs/rfc1855.html" target="_top"&gt;netiquette&lt;/a&gt;, and we will generally reject suggestions that are not specifically related to eliciting useful answers in a technical forum.)&lt;/div&gt;&lt;div class="sect1" title="Before You Ask"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="before"&gt;&lt;/a&gt;Before You Ask&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Before asking a technical question by e-mail, or in a newsgroup, or on a website chat board, do the following:&lt;br /&gt;&lt;div class="procedure"&gt;&lt;ol class="procedure" type="1"&gt;&lt;li class="step" title="Step 1"&gt;Try to find an answer by searching the archives of the forum you plan to post to.&lt;/li&gt;&lt;li class="step" title="Step 2"&gt;Try to find an answer by searching the Web.&lt;/li&gt;&lt;li class="step" title="Step 3"&gt;Try to find an answer by reading the manual.&lt;/li&gt;&lt;li class="step" title="Step 4"&gt;Try to find an answer by reading a FAQ.&lt;/li&gt;&lt;li class="step" title="Step 5"&gt;Try to find an answer by inspection or experimentation.&lt;/li&gt;&lt;li class="step" title="Step 6"&gt;Try to find an answer by asking a skilled friend.&lt;/li&gt;&lt;li class="step" title="Step 7"&gt;If you're a programmer, try to find an answer by reading the source code.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;When you ask your question, display the fact that you have done these things first; this will help establish that you're not being a lazy sponge and wasting people's time.  Better yet, display what you have &lt;span class="emphasis"&gt;&lt;em&gt;learned&lt;/em&gt;&lt;/span&gt; from doing these things.  We like answering questions for people who have demonstrated they can learn from the answers.&lt;br /&gt;Use tactics like doing a Google search on the text of whatever error message you get (searching &lt;a class="ulink" href="http://groups.google.com/" target="_top"&gt;Google groups&lt;/a&gt; as well as Web pages).  This might well take you straight to fix documentation or a mailing list thread answering your question.  Even if it doesn't, saying &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;I googled on the following phrase but didn't get anything that looked promising&lt;/span&gt;â€&lt;/span&gt; is a good thing to do in e-mail or news postings requesting help, if only because it records what searches won't help.  It will also help to direct other people with similar problems to your thread by linking the search terms to what will hopefully be your problem and resolution thread.&lt;br /&gt;Take your time. Do not expect to be able to solve a complicated problem with a few seconds of Googling. Read and understand the FAQs, sit back, relax and give the problem some thought before approaching experts. Trust us, they will be able to tell from your questions how much reading and thinking you did, and will be more willing to help if you come prepared. Don't instantly fire your whole arsenal of questions just because your first search turned up no answers (or too many).&lt;br /&gt;Prepare your question.  Think it through.  Hasty-sounding questions get hasty answers, or none at all.  The more you do to  demonstrate that having put thought and effort into solving your problem before seeking help, the more likely you are to actually get help.&lt;br /&gt;Beware of asking the wrong question.  If you ask one that is based on faulty assumptions, J. Random Hacker is quite likely to reply with a uselessly literal answer while thinking &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Stupid question...&lt;/span&gt;â€&lt;/span&gt;, and hoping the experience of getting what you asked for rather than what you needed will teach you a lesson.&lt;br /&gt;Never assume you are &lt;span class="emphasis"&gt;&lt;em&gt;entitled&lt;/em&gt;&lt;/span&gt; to an answer. You are not; you aren't, after all, paying for the service.  You will earn an answer, if you earn it, by asking a substantial, interesting, and thought-provoking question â€” one that implicitly contributes to the experience of the community rather than merely passively demanding knowledge from others.&lt;br /&gt;On the other hand, making it clear that you are able and willing to help in the process of developing the solution is a very good start. &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Would someone provide a pointer?&lt;/span&gt;â€&lt;/span&gt;, &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;What is my example missing?&lt;/span&gt;â€&lt;/span&gt;, and &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;What site should I have checked?&lt;/span&gt;â€&lt;/span&gt; are more likely to get answered than &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Please post the exact procedure I should use.&lt;/span&gt;â€&lt;/span&gt;  because you're making it clear that you're truly willing to complete the process if someone can just point you in the right direction.&lt;/div&gt;&lt;div class="sect1" title="When You Ask"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="asking"&gt;&lt;/a&gt;When You Ask&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="sect2" title="Choose your forum carefully"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="forum"&gt;&lt;/a&gt;Choose your forum carefully&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Be sensitive in choosing where you ask your question.  You are likely to be ignored, or written off as a loser, if you:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt;post your question to a forum where it's off topic&lt;/li&gt;&lt;li class="listitem"&gt;post a very elementary question to a forum where advanced technical questions are expected, or vice-versa&lt;/li&gt;&lt;li class="listitem"&gt;cross-post to too many different newsgroups&lt;/li&gt;&lt;li class="listitem"&gt;post a personal e-mail to somebody who is neither an acquaintance of yours nor personally responsible for solving your problem&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;Hackers blow off questions that are inappropriately targeted in order to try to protect their communications channels from being drowned in irrelevance.  You don't want this to happen to you.&lt;br /&gt;The first step, therefore, is to find the right forum. Again, Google and other Web-searching methods are your friend. Use them to find the project webpage most closely associated with the hardware or software giving you difficulties. Usually it will have links to a FAQ (Frequently Asked Questions) list, and to project mailing lists and their archives. These mailing lists are the final places to go for help, if your own efforts (including &lt;span class="emphasis"&gt;&lt;em&gt;reading&lt;/em&gt;&lt;/span&gt; those FAQs you found) do not find you a solution.  The project page may also describe a bug-reporting procedure, or have a link to one; if so, follow it.&lt;br /&gt;Shooting off an e-mail to a person or forum which you are not familiar with is risky at best. For example, do not assume that the author of an informative webpage wants to be your free consultant. Do not make optimistic guesses about whether your question will be welcome â€” if you're unsure, send it elsewhere, or refrain from sending it at all.&lt;br /&gt;When selecting a Web forum, newsgroup or mailing list, don't trust the name by itself too far; look for a FAQ or charter to verify your question is on-topic.  Read some of the back traffic before posting so you'll get a feel for how things are done there. In fact, it's a very good idea to do a keyword search for words relating to your problem on the newsgroup or mailing list archives before you post.  It may find you an answer, and if not it will help you formulate a better question.&lt;br /&gt;Don't shotgun-blast all the available help channels at once, that's like yelling and irritates people.  Step through them softly.&lt;br /&gt;Know what your topic is!  One of the classic mistakes is asking questions about the Unix or Windows programming interface in a forum devoted to a language or library or tool portable across both. If you don't understand why this is a blunder, you'd be best off not asking any questions at all until you get it.&lt;br /&gt;In general, questions to a well-selected public forum are more likely to get useful answers than equivalent questions to a private one.  There are multiple reasons for this. One is simply the size of the pool of potential respondents.  Another is the size of the audience; hackers would rather answer questions that educate many people than questions serving only a few.&lt;br /&gt;Understandably, skilled hackers and authors of popular software are already receiving more than their fair share of mis-targeted messages. By adding to the flood, you could in extreme cases even be the straw that breaks the camel's back â€” quite a few times, contributors to popular projects have withdrawn their support because collateral damage in the form of useless e-mail traffic to their personal accounts became unbearable.&lt;/div&gt;&lt;div class="sect2" title="Web and IRC forums directed towards newbies often give the quickest response"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="usefora"&gt;&lt;/a&gt;Web and IRC forums directed towards newbies often give the quickest response&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Your local user group, or your Linux distribution, may advertise a Web forum or IRC channel where newbies can get help.  (In non-English-speaking countries newbie forums are still more likely to be mailing lists.) These are good first places to ask, especially if you think you may have tripped over a relatively simple or common problem. An advertised IRC channel is an open invitation to ask questions there and often get answers in real time.&lt;br /&gt;In fact, if you got the program that is giving you problems from a Linux distribution (as is common today), it may be better to ask in the distro's forum/list before trying the program's project forum/list. The project's hackers may just say, &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;use &lt;span class="emphasis"&gt;&lt;em&gt;our&lt;/em&gt;&lt;/span&gt; build&lt;/span&gt;â€&lt;/span&gt;.&lt;br /&gt;Before posting to any Web forum, check if it has a Search feature. If it does, try a couple of keyword searches for something like your problem; it just might help. If you did a general Web search before (as you should have), search the forum anyway; your Web-wide search engine might not have all of this forum indexed recently.&lt;br /&gt;There is an increasing tendency for projects to do user support over a Web forum or IRC channel, with e-mail reserved more for development traffic. So look for those channels first when seeking project-specific help.&lt;/div&gt;&lt;div class="sect2" title="As a second step, use project mailing lists"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="uselists"&gt;&lt;/a&gt;As a second step, use project mailing lists&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;When a project has a development mailing list, write to the mailing list, not to individual developers, even if you believe you know who can best answer your question.  Check the documentation of the project and its homepage for the address of a project mailing list, and use it.  There are several good reasons for this policy:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt;Any question good enough to be asked of one developer will also be of value to the whole group.  Contrariwise, if you suspect your question is too dumb for a mailing list, it's not an excuse to harass individual developers.&lt;/li&gt;&lt;li class="listitem"&gt;Asking questions on the list distributes load among developers.  The individual developer (especially if he's the project leader) may be too busy to answer your questions.&lt;/li&gt;&lt;li class="listitem"&gt;Most mailing lists are archived and the archives are indexed by search engines.  If you ask your question on-list and it is answered, a future querent could find your question and the answer on the Web instead of asking it again.&lt;/li&gt;&lt;li class="listitem"&gt;If certain questions are seen to be asked often, developers can use that information to improve the documentation or the software itself to be less confusing.  But if those questions are asked in private, nobody has the complete picture of what questions are asked most often.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;If a project has both a &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;user&lt;/span&gt;â€&lt;/span&gt; and a &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;developer&lt;/span&gt;â€&lt;/span&gt; (or &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;hacker&lt;/span&gt;â€&lt;/span&gt;) mailing list or Web forum, and you are not hacking on the code, ask in the &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;user&lt;/span&gt;â€&lt;/span&gt; list/forum. Do not assume that you will be welcome on the developer list, where they're likely to experience your question as noise disrupting their developer traffic.&lt;br /&gt;However, if you are &lt;span class="emphasis"&gt;&lt;em&gt;sure&lt;/em&gt;&lt;/span&gt; your question is non-trivial, and you get no answer in the &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;user&lt;/span&gt;â€&lt;/span&gt; list/forum for several days, try the &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;developer&lt;/span&gt;â€&lt;/span&gt; one. You would be well advised to lurk there for a few days before posting to learn the local folkways (actually this is good advice on any private or semi-private list).&lt;br /&gt;If you cannot find a project's mailing list address, but only see the address of the maintainer of the project, go ahead and write to the maintainer.  But even in that case, don't assume that the mailing list doesn't exist.  Mention in your e-mail that you tried and could not find the appropriate mailing list.  Also mention that you don't object to having your message forwarded to other people.  (Many people believe that private e-mail should remain private, even if there is nothing secret in it.  By allowing your message to be forwarded you give your correspondent a choice about how to handle your e-mail.)&lt;/div&gt;&lt;div class="sect2" title="Use meaningful, specific subject headers"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="bespecific"&gt;&lt;/a&gt;Use meaningful, specific subject headers&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;On mailing lists, newsgroups or Web forums, the subject header is your golden opportunity to attract qualified experts' attention in around 50 characters or fewer.  Don't waste it on babble like &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Please help me&lt;/span&gt;â€&lt;/span&gt; (let alone &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;PLEASE HELP ME!!!!&lt;/span&gt;â€&lt;/span&gt;; messages with subjects like that get discarded by reflex).  Don't try to impress us with the depth of your anguish; use the space for a super-concise problem description instead.&lt;br /&gt;One good convention for subject headers, used by many tech support organizations, is &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;object - deviation&lt;/span&gt;â€&lt;/span&gt;. The &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;object&lt;/span&gt;â€&lt;/span&gt; part specifies what thing or group of things is having a problem, and the &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;deviation&lt;/span&gt;â€&lt;/span&gt; part describes the deviation from expected behavior.&lt;br /&gt;&lt;div class="variablelist"&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Stupid:&lt;/strong&gt;&lt;/span&gt; &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;HELP!  Video doesn't work properly on my laptop!&lt;/dd&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Smart:&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;X.org 6.8.1 misshapen mouse cursor, Fooware MV1005 vid. chipset&lt;/dd&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Smarter:&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt; X.org 6.8.1 mouse cursor on Fooware MV1005 vid. chipset - is misshapen&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;The process of writing an &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;object-deviation&lt;/span&gt;â€&lt;/span&gt; description will help you organize your thinking about the problem in more detail. What is affected?  Just the mouse cursor or other graphics too?  Is this specific to the X.org version of X? To version 6.8.1?  Is this specific to Fooware video chipsets? To model MV1005?  A hacker who sees the result can immediately understand what it is that you are having a problem with &lt;span class="emphasis"&gt;&lt;em&gt;and&lt;/em&gt;&lt;/span&gt; the problem you are having, at a glance.&lt;br /&gt;More generally, imagine looking at the index of an archive of questions, with just the subject lines showing.  Make your subject line reflect your question well enough that the next guy searching the archive with a question similar to yours will be able to follow the thread to an answer rather than posting the question again.&lt;br /&gt;If you ask a question in a reply, be sure to change the subject line to indicate that you're asking a question.  A Subject line that looks like &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Re: test&lt;/span&gt;â€&lt;/span&gt; or &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Re: new bug&lt;/span&gt;â€&lt;/span&gt; is less likely to attract useful amounts of attention.  Also, pare quotation of previous messages to the minimum consistent with cluing in new readers.&lt;br /&gt;Do not simply hit reply to a list message in order to start an entirely new thread. This will limit your audience. Some mail readers, like mutt, allow the user to sort by thread and then hide messages in a thread by folding the thread. Folks who do that will never see your message.&lt;br /&gt;Changing the subject is not sufficient.  Mutt, and probably other mail readers, looks at other information in the e-mail's headers to assign it to a thread, not the subject line. Instead start an entirely new e-mail.&lt;br /&gt;On Web forums the rules of good practice are slightly different, because messages are usually much more tightly bound to specific discussion threads and often invisible outside those threads. Changing the subject when asking a question in reply is not essential. Not all forums even allow separate subject lines on replies, and nearly nobody reads them when they do. However, asking a question in a reply is a dubious practice in itself, because it will only be seen by those who are watching this thread. So, unless you are sure you &lt;span class="emphasis"&gt;&lt;em&gt;want&lt;/em&gt;&lt;/span&gt; to ask only the people currently active in the thread, start a new one.&lt;/div&gt;&lt;div class="sect2" title="Make it easy to reply"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="easyreply"&gt;&lt;/a&gt;Make it easy to reply&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Finishing your query with &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Please send your reply to... &lt;/span&gt;â€&lt;/span&gt; makes it quite unlikely you will get an answer.  If you can't be bothered to take even the few seconds required to set up a correct Reply-To header in your mail agent, we can't be bothered to take even a few seconds to think about your problem.  If your mail program doesn't permit this, &lt;a class="ulink" href="http://linuxmafia.com/faq/Mail/muas.html" target="_top"&gt;get a better mail program&lt;/a&gt;.  If your operating system doesn't support any e-mail programs that permit this, get a better operating system.&lt;br /&gt;In Web forums, asking for a reply by e-mail is outright rude, unless you believe the information may be sensitive (and somebody will, for some unknown reason, let you but not the whole forum know it). If you want an e-mail copy when somebody replies in the thread, request that the Web forum  send it; this feature is supported almost everywhere under options like &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;watch this thread&lt;/span&gt;â€&lt;/span&gt;, &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;send e-mail on answers&lt;/span&gt;â€&lt;/span&gt;, etc.&lt;/div&gt;&lt;div class="sect2" title="Write in clear, grammatical, correctly-spelled language"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="writewell"&gt;&lt;/a&gt;Write in clear, grammatical, correctly-spelled language&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;We've found by experience that people who are careless and sloppy writers are usually also careless and sloppy at thinking and coding (often enough to bet on, anyway). Answering questions for careless and sloppy thinkers is not rewarding; we'd rather spend our time elsewhere.&lt;br /&gt;So expressing your question clearly and well is important.  If you can't be bothered to do that, we can't be bothered to pay attention.  Spend the extra effort to polish your language.  It doesn't have to be stiff or formal â€” in fact, hacker culture values informal, slangy and humorous language used with precision. But it has to &lt;span class="emphasis"&gt;&lt;em&gt;be&lt;/em&gt;&lt;/span&gt; precise; there has to be some indication that you're thinking and paying attention.&lt;br /&gt;Spell, punctuate, and capitalize correctly.  Don't confuse &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;its&lt;/span&gt;â€&lt;/span&gt; with &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;it's&lt;/span&gt;â€&lt;/span&gt;, &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;loose&lt;/span&gt;â€&lt;/span&gt; with &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;lose&lt;/span&gt;â€&lt;/span&gt;, or &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;discrete&lt;/span&gt;â€&lt;/span&gt; with &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;discreet&lt;/span&gt;â€&lt;/span&gt;.  Don't TYPE IN ALL CAPS; this is read as shouting and considered rude. (All-smalls is only slightly less annoying, as it's difficult to read.  Alan Cox can get away with it, but you can't.)&lt;br /&gt;More generally, if you write like a semi-literate boob you will very likely be ignored.  So don't use instant-messaging shortcuts. Spelling "you" as "u" makes you look like a semi-literate boob to save two entire keystrokes.  Worse: writing like a l33t script kiddie hax0r is the absolute kiss of death and guarantees you will receive nothing but stony silence (or, at best, a heaping helping of scorn and sarcasm) in return.&lt;br /&gt;If you are asking questions in a forum that does not use your native language, you will get a limited amount of slack for spelling and grammar errors â€” but no extra slack at all for laziness (and yes, we can usually spot that difference).  Also, unless you know what your respondent's languages are, write in English.  Busy hackers tend to simply flush questions in languages they don't understand, and English is the working language of the Internet.  By writing in English you minimize your chances that your question will be discarded unread.&lt;br /&gt;If you are writing in English but it is a second language for you, it is good form to alert potential respondants to potential language difficulties and options for getting around them. Examples:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt; English is not my native language; please excuse typing errors. &lt;/li&gt;&lt;li class="listitem"&gt; If you speak $LANGUAGE, please email/PM me; I may need assistance translating my question. &lt;/li&gt;&lt;li class="listitem"&gt; I am familiar with the technical terms, but some slang expressions and idioms are difficult for me. &lt;/li&gt;&lt;li class="listitem"&gt; I've posted my question in $LANGUAGE and English. I'll be glad to translate responses, if you only use one or the other. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="sect2" title="Send questions in accessible, standard formats"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="formats"&gt;&lt;/a&gt;Send questions in accessible, standard formats&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;If you make your question artificially hard to read, it is more likely to be passed over in favor of one that isn't.  So:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt;Send plain text mail, not HTML.  (It's not hard to &lt;a class="ulink" href="http://www.birdhouse.org/etc/evilmail.html" target="_top"&gt;turn  off HTML&lt;/a&gt;.)  Further discussion of why this is good practice can be found &lt;a class="ulink" href="http://www1.american.edu/cas/econ/htmlmail.htm" target="_top"&gt;here&lt;/a&gt; and &lt;a class="ulink" href="http://home.earthlink.net/~bobbau/email/avoiding-html" target="_top"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li class="listitem"&gt;MIME attachments are usually OK, but only if they are real content (such as an attached source file or patch), and not merely boilerplate generated by your mail client (such as another copy of your message).&lt;/li&gt;&lt;li class="listitem"&gt; Don't send e-mail in which entire paragraphs are single multiply-wrapped lines.  (This makes it too difficult to reply to  just part of the message.)  Assume that your respondents will be reading mail on 80-character-wide text displays and set your  line wrap accordingly, to something less than 80.&lt;/li&gt;&lt;li class="listitem"&gt; However, do &lt;span class="emphasis"&gt;&lt;em&gt;not&lt;/em&gt;&lt;/span&gt; wrap data (such as log file dumps or session transcripts) at any fixed column width. Data should be included as-is, so respondents can have confidence that they are seeing what you saw.&lt;/li&gt;&lt;li class="listitem"&gt;Don't send MIME Quoted-Printable encoding to an English-language forum.  This encoding can be necessary when you're posting in a language ASCII doesn't cover, but many e-mail agents don't support it.  When they break, all those =20 glyphs scattered through the text are ugly and distracting â€” or may actively sabotage the semantics of your text.&lt;/li&gt;&lt;li class="listitem"&gt; Never, &lt;span class="emphasis"&gt;&lt;em&gt;ever&lt;/em&gt;&lt;/span&gt; expect hackers to be able to read closed proprietary document formats like Microsoft Word or Excel.  Most hackers react to these about as well as you would to having a pile of steaming pig manure dumped on your doorstep.  Even when they can cope, they resent having to do so.&lt;/li&gt;&lt;li class="listitem"&gt;If you're sending e-mail from a Windows machine, turn off Microsoft's problematic &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Smart Quotes&lt;/span&gt;â€&lt;/span&gt; feature (From Tools &amp;gt; AutoCorrect Options, clear the smart quotes checkbox under AutoFormat As You Type.).  This is so you'll avoid sprinkling garbage characters through your mail.  &lt;/li&gt;&lt;li class="listitem"&gt;In Web forums, do not abuse &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;smiley&lt;/span&gt;â€&lt;/span&gt; and &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;HTML&lt;/span&gt;â€&lt;/span&gt; features (when they are present). A smiley or two is usually OK, but colored fancy text tends to make people think you are lame.  Seriously overusing smileys and color and fonts will make you come off like a giggly teenage girl, which is not generally a good idea unless you are more interested in sex than answers.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;If you're using a graphical-user-interface mail client such as Netscape Messenger, MS Outlook, or their ilk, beware that it may violate these rules when used with its default settings.  Most such clients have a menu-based &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;View Source&lt;/span&gt;â€&lt;/span&gt; command.  Use this on something in your sent-mail folder, verifying sending of plain text without unnecessary attached crud.&lt;/div&gt;&lt;div class="sect2" title="Be precise and informative about your problem"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="beprecise"&gt;&lt;/a&gt;Be precise and informative about your problem&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt; Describe the symptoms of your problem or bug carefully and clearly. &lt;/li&gt;&lt;li class="listitem"&gt; Describe the environment in which it occurs (machine, OS, application, whatever).  Provide your vendor's distribution and release level (e.g.: &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Fedora Core 7&lt;/span&gt;â€&lt;/span&gt;, &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Slackware 9.1&lt;/span&gt;â€&lt;/span&gt;, etc.).  &lt;/li&gt;&lt;li class="listitem"&gt; Describe the research you did to try and understand the problem  before you asked the question. &lt;/li&gt;&lt;li class="listitem"&gt; Describe the diagnostic steps you took to try and pin down the problem yourself before you asked the question. &lt;/li&gt;&lt;li class="listitem"&gt; Describe any possibly relevant recent changes in your computer or software configuration. &lt;/li&gt;&lt;li class="listitem"&gt; If at all possible, provide a way to &lt;span class="emphasis"&gt;&lt;em&gt;reproduce the problem in a controlled environment&lt;/em&gt;&lt;/span&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;Do the best you can to anticipate the questions a hacker will ask, and answer them in advance in your request for help.&lt;br /&gt;Giving hackers the ability to reproduce the problem in a controlled environment is especially important if you are reporting something you think is a bug in code. When you do this, your odds of getting a useful answer and the speed with which you are likely to get that answer both improve tremendously.&lt;br /&gt;Simon Tatham has written an excellent essay entitled &lt;a class="ulink" href="http://www.chiark.greenend.org.uk/~sgtatham/bugs.html" target="_top"&gt;How to Report Bugs Effectively&lt;/a&gt;. I strongly recommend that you read it.&lt;/div&gt;&lt;div class="sect2" title="Volume is not precision"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="volume"&gt;&lt;/a&gt;Volume is not precision&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;You need to be precise and informative.  This end is not served by simply dumping huge volumes of code or data into a help request. If you have a large, complicated test case that is breaking a program, try to trim it and make it as small as possible.&lt;br /&gt;This is useful for at least three reasons.  One: being seen to invest effort in simplifying the question makes it more likely  you'll get an answer, Two: simplifying the question makes it more likely you'll get a &lt;span class="emphasis"&gt;&lt;em&gt;useful&lt;/em&gt;&lt;/span&gt; answer.  Three: In the process of refining your bug report, you may develop a fix  or workaround yourself.&lt;/div&gt;&lt;div class="sect2" title="Don't rush to claim that you have found a bug"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="id478549"&gt;&lt;/a&gt;Don't rush to claim that you have found a bug&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;When you are having problems with a piece of software, don't claim you have found a bug unless you are very, &lt;span class="emphasis"&gt;&lt;em&gt;very&lt;/em&gt;&lt;/span&gt; sure of your ground.  Hint: unless you can provide a source-code patch that fixes the problem, or a regression test against a previous version that demonstrates incorrect behavior, you are probably not sure enough.  This applies to webpages and documentation, too; if you have found a documentation &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;bug&lt;/span&gt;â€&lt;/span&gt;, you should supply replacement text and which pages it should go on.&lt;br /&gt;Remember, there are many other users that are not experiencing your problem. Otherwise you would have learned about it while reading the documentation and searching the Web (you did do that before complaining, &lt;a class="link" href="http://catb.org/esr/faqs/smart-questions.html#before" title="Before You Ask"&gt;didn't you&lt;/a&gt;?). This means that very probably it is you who are doing something wrong, not the software.&lt;br /&gt;The people who wrote the software work very hard to make it work as well as possible. If you claim you have found a bug, you'll be impugning their competence, which may offend some of them even if you are correct.  It's especially undiplomatic to yell &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;bug&lt;/span&gt;â€&lt;/span&gt; in the Subject line.&lt;br /&gt;When asking your question, it is best to write as though you assume &lt;span class="emphasis"&gt;&lt;em&gt;you&lt;/em&gt;&lt;/span&gt; are doing something wrong, even if you are privately pretty sure you have found an actual bug.  If there really is a bug, you will hear about it in the answer.  Play it so the maintainers will want to apologize to you if the bug is real, rather than so that you will owe them an apology if you have messed up.&lt;/div&gt;&lt;div class="sect2" title="Grovelling is not a substitute for doing your homework"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="id478703"&gt;&lt;/a&gt;Grovelling is not a substitute for doing your homework&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Some people who get that they shouldn't behave rudely or arrogantly, demanding an answer, retreat to the opposite extreme of grovelling.  &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;I know I'm just a pathetic newbie loser, but...&lt;/span&gt;â€&lt;/span&gt;.  This is distracting and unhelpful.  It's especially annoying when it's coupled with vagueness about the actual problem.&lt;br /&gt;Don't waste your time, or ours, on crude primate politics. Instead, present the background facts and your question as clearly as you can.  That is a better way to position yourself than by grovelling.&lt;br /&gt;Sometimes Web forums have separate places for newbie questions. If you feel you do have a newbie question, just go there.  But don't grovel there either.&lt;/div&gt;&lt;div class="sect2" title="Describe the problem's symptoms, not your guesses"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="symptoms"&gt;&lt;/a&gt;Describe the problem's symptoms, not your guesses&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;It's not useful to tell hackers what you think is causing your problem.  (If your diagnostic theories were such hot stuff, would you be consulting others for help?)  So, make sure you're telling them the raw symptoms of what goes wrong, rather than your interpretations and theories.  Let them do the interpretation and diagnosis. If you feel it's important to state your guess, clearly label it as such and describe why that answer isn't working for you.&lt;br /&gt;&lt;div class="variablelist"&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Stupid:&lt;/strong&gt;&lt;/span&gt; &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;I'm getting back-to-back SIG11 errors on kernel compiles, and suspect a hairline crack on one of the motherboard traces.  What's the best way to check for those?&lt;/dd&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Smart:&lt;/strong&gt;&lt;/span&gt; &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;My home-built K6/233 on an FIC-PA2007 motherboard (VIA Apollo VP2 chipset) with 256MB Corsair PC133 SDRAM starts getting frequent SIG11 errors about 20 minutes after power-on during the course of kernel compiles, but never in the first 20 minutes.  Rebooting doesn't restart the clock, but powering down overnight does.  Swapping out all RAM didn't help.  The relevant part of a typical compile session log follows.&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;Since the preceding point seems to be a tough one for many people to grasp, here's a phrase to remind you: "All diagnosticians are from Missouri." That US state's official motto is "Show me" (earned in 1899, when Congressman Willard D. Vandiver said "I come from a country that raises corn and cotton and cockleburs and Democrats, and frothy eloquence neither convinces nor satisfies me. I'm from Missouri. You've got to show me.") In diagnosticians' case, it's not a matter of skepticism, but rather a literal, functional need to see whatever is as close as possible to the same raw evidence that you see, rather than your surmises and summaries. Show us.&lt;/div&gt;&lt;div class="sect2" title="Describe your problem's symptoms in chronological order"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="chronology"&gt;&lt;/a&gt;Describe your problem's symptoms in chronological order&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;The clues most useful in figuring out something that went wrong often lie in the events immediately prior.  So, your account should describe precisely what you did, and what the machine and software did, leading up to the blowup.  In the case of command-line processes, having a session log (e.g., using the script utility) and quoting the relevant twenty or so lines is very useful.&lt;br /&gt;If the program that blew up on you has diagnostic options (such as -v for verbose), try to select options that will add useful debugging information to the transcript.  Remember that more is not necessarily better; try to choose a debug level that will inform rather than drowning the reader in junk.&lt;br /&gt;If your account ends up being long (more than about four paragraphs), it might be useful to succinctly state the problem up top, then follow with the chronological tale.  That way, hackers will know what to watch for in reading your account.&lt;/div&gt;&lt;div class="sect2" title="Describe the goal, not the step"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="goal"&gt;&lt;/a&gt;Describe the goal, not the step&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;If you are trying to find out how to do something (as opposed to reporting a bug), begin by describing the goal.  Only then describe the particular step towards it that you are blocked on.&lt;br /&gt;Often, people who need technical help have a high-level goal in mind and get stuck on what they think is one particular path towards the goal.  They come for help with the step, but don't realize that the path is wrong.  It can take substantial effort to get past this.&lt;br /&gt;&lt;div class="variablelist"&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Stupid:&lt;/strong&gt;&lt;/span&gt; &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;How do I get the color-picker on the FooDraw program to take a hexadecimal RGB value?&lt;/dd&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Smart:&lt;/strong&gt;&lt;/span&gt; &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;I'm trying to replace the color table on an image with values of my choosing.  Right now the only way I can see to do this is by editing each table slot, but I can't get FooDraw's color picker  to take a hexadecimal RGB value.&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;The second version of the question is smart.  It allows an answer that suggests a tool better suited to the task.&lt;/div&gt;&lt;div class="sect2" title="Don't ask people to reply by private e-mail"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="noprivate"&gt;&lt;/a&gt;Don't ask people to reply by private e-mail&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Hackers believe solving problems should be a public, transparent process during which a first try at an answer can and should be corrected if someone more knowledgeable notices that it is incomplete or incorrect.  Also, helpers get some of their reward for being respondents from being seen to be competent and knowledgeable by their peers.&lt;br /&gt;When you ask for a private reply, you are disrupting both the process and the reward.  Don't do this.  It's the &lt;span class="emphasis"&gt;&lt;em&gt;respondent's&lt;/em&gt;&lt;/span&gt; choice whether to reply privately  â€” and if he does, it's usually because he thinks the question is too ill-formed or obvious to be interesting to others.&lt;br /&gt;There is one limited exception to this rule.  If you think the question is such that you are likely to get many answers that are all closely similar, then the magic words are &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;e-mail me and I'll summarize the answers for the group&lt;/span&gt;â€&lt;/span&gt;.  It is courteous to try and save  the mailing list or newsgroup a flood of substantially identical postings â€” but you have to keep the promise to summarize.&lt;/div&gt;&lt;div class="sect2" title="Be explicit about your question"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="explicit"&gt;&lt;/a&gt;Be explicit about your question&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Open-ended questions tend to be perceived as open-ended time sinks.  Those people most likely to be able to give you a useful answer are also the busiest people (if only because they take on the most work themselves).  People like that are allergic to open-ended time sinks, thus they tend to be allergic to open-ended questions.&lt;br /&gt;You are more likely to get a useful response if you are explicit about what you want respondents to do (provide pointers, send code, check your patch, whatever).  This will focus their  effort and implicitly put an upper bound on the time and energy  a respondent must allocate to helping you.  This is good.&lt;br /&gt;To understand the world the experts live in, think of expertise as an abundant resource and time to respond as a scarce one.  The less of a time commitment you implicitly ask for, the more likely you are to get an answer from someone really good and really busy.&lt;br /&gt;So it is useful to frame your question to minimize the time commitment required for an expert to field it â€” but this is often not the same thing as simplifying the question.  Thus, for example, &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Would you give me a pointer to a good explanation of X?&lt;/span&gt;â€&lt;/span&gt; is usually a smarter question than &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Would you explain X, please?&lt;/span&gt;â€&lt;/span&gt;.  If you have some malfunctioning code, it is usually smarter to ask for someone to explain what's wrong with it than it is to ask someone to fix it.&lt;/div&gt;&lt;div class="sect2" title="When asking about code"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="code"&gt;&lt;/a&gt;When asking about code&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Don't ask others to debug your broken code without giving a hint what sort of problem they should be searching for.  Posting a few hundred lines of code, saying "it doesn't work", will get you ignored. Posting a dozen lines of code, saying "after line 7 I was expecting to see &lt;x&gt;, but &lt;y&gt; occurred instead" is much more likely to get you a response.&lt;/y&gt;&lt;/x&gt;&lt;br /&gt;The most effective way to be precise about a code problem is to provide a minimal bug-demonstrating test case.  What's a minimal test case?  It's an illustration of the problem; just enough code to exhibit the undesirable behavior and no more.  How do you make a minimal test case?  If you know what line or section of code is producing the problematic behavior, make a copy of it and add just enough supporting code to produce a complete example (i.e. enough that the source is acceptable to the compiler/interpreter/whatever application processes it).  If you can't narrow it down to a particular section, make a copy of the source and start removing chunks that don't affect the problematic behavior. The smaller your minimal test case is, the better (see &lt;a class="xref" href="http://catb.org/esr/faqs/smart-questions.html#volume" title="Volume is not precision"&gt;the section called â€œVolume is not precisionâ€&lt;/a&gt;).&lt;br /&gt;Generating a really small minimal test case will not always be possible, but trying to is good discipline.  It may help you learn what you need to solve the problem on your own â€” and even when it doesn't, hackers like to see that you have tried.  It will make them more cooperative.&lt;br /&gt;If you simply want a code review, say as much up front, and be sure to mention what areas you think might particularly need review and why.&lt;/div&gt;&lt;div class="sect2" title="Don't post homework questions"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="homework"&gt;&lt;/a&gt;Don't post homework questions&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Hackers are good at spotting homework questions; most of us have done them ourselves.  Those questions are for &lt;span class="emphasis"&gt;&lt;em&gt;you&lt;/em&gt;&lt;/span&gt;  to work out, so that you will learn from the experience.  It is OK to ask for hints, but not for entire solutions.&lt;br /&gt;If you suspect you have been passed a homework question, but can't solve it anyway, try asking in a user group forum or (as a last resort) in a &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;user&lt;/span&gt;â€&lt;/span&gt; list/forum of a project. While the hackers &lt;span class="emphasis"&gt;&lt;em&gt;will&lt;/em&gt;&lt;/span&gt; spot it, some of the advanced users may at least give you a hint.&lt;/div&gt;&lt;div class="sect2" title="Prune pointless queries"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="prune"&gt;&lt;/a&gt;Prune pointless queries&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Resist the temptation to close your request for help with semantically-null questions like &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Can anyone help me?&lt;/span&gt;â€&lt;/span&gt; or &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Is there an answer?&lt;/span&gt;â€&lt;/span&gt; First: if you've written your problem description halfway competently, such tacked-on questions are at best superfluous.  Second: because they are superfluous, hackers find them annoying â€” and are likely to return logically impeccable but dismissive answers like &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Yes, you can be helped&lt;/span&gt;â€&lt;/span&gt; and &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;No, there is no help for you.&lt;/span&gt;â€&lt;/span&gt;&lt;br /&gt;In general, asking yes-or-no questions is a good thing to avoid unless you want a &lt;a class="ulink" href="http://homepages.tesco.net/~J.deBoynePollard/FGA/questions-with-yes-or-no-answers.html" target="_top"&gt;yes-or-no answer&lt;/a&gt;.&lt;/div&gt;&lt;div class="sect2" title="Don't flag your question as â€œUrgentâ€, even if it is for you"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="urgent"&gt;&lt;/a&gt;Don't flag your question as &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Urgent&lt;/span&gt;â€&lt;/span&gt;, even if it is for you&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;That's your problem, not ours. Claiming urgency is very likely to be counter-productive: most hackers will simply delete such messages as rude and selfish attempts to elicit immediate and special attention.&lt;br /&gt;There is one semi-exception.  It can be worth mentioning if you're using the program in some high-profile place, one that the hackers will get excited about; in such a case, if you're under time pressure, and you say so politely, people may get interested enough to answer faster.&lt;br /&gt;This is a very risky thing to do, however, because the hackers' metric for what is exciting probably differs from yours.  Posting from the International Space Station would qualify, for example, but posting on behalf of a feel-good charitable or political cause would almost certainly not.  In fact, posting &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Urgent: Help me save  the fuzzy baby seals!&lt;/span&gt;â€&lt;/span&gt; will reliably get you shunned or flamed even by hackers who think fuzzy baby seals are important.&lt;br /&gt;If you find this mysterious, re-read the rest of this how-to repeatedly until you understand it before posting anything at all.&lt;/div&gt;&lt;div class="sect2" title="Courtesy never hurts, and sometimes helps"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="courtesy"&gt;&lt;/a&gt;Courtesy never hurts, and sometimes helps&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Be courteous. Use &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Please&lt;/span&gt;â€&lt;/span&gt; and &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Thanks for your attention&lt;/span&gt;â€&lt;/span&gt; or &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Thanks for your consideration&lt;/span&gt;â€&lt;/span&gt;. Make it clear you appreciate the time people spend helping you for free.&lt;br /&gt;To be honest, this isn't as important as (and cannot substitute for) being grammatical, clear, precise and descriptive, avoiding proprietary formats etc.; hackers in general would rather get somewhat brusque but technically sharp bug reports than polite vagueness.  (If this puzzles you, remember that we value a question by what it teaches us.)&lt;br /&gt;However, if you've got your technical ducks in a row, politeness does increase your chances of getting a useful answer.&lt;br /&gt;(We must note that the only serious objection we've received from veteran hackers to this HOWTO is with respect to our previous recommendation to use &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Thanks in advance&lt;/span&gt;â€&lt;/span&gt;.  Some hackers feel this connotes an intention not to thank anybody afterwards. Our recommendation is to either say &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Thanks in advance&lt;/span&gt;â€&lt;/span&gt; first &lt;span class="emphasis"&gt;&lt;em&gt;and&lt;/em&gt;&lt;/span&gt; thank respondents afterwards, or express courtesy in a different way, such as by saying &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Thanks for your attention&lt;/span&gt;â€&lt;/span&gt; or &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Thanks for your consideration&lt;/span&gt;â€&lt;/span&gt;.)&lt;/div&gt;&lt;div class="sect2" title="Follow up with a brief note on the solution"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="followup"&gt;&lt;/a&gt;Follow up with a brief note on the solution&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Send a note after the problem has been solved to all who helped you; let them know how it came out and thank them again for their help. If the problem attracted general interest in a mailing list or newsgroup, it's appropriate to post the followup there.&lt;br /&gt;Optimally, the reply should be to the thread started by the original question posting, and should have â€˜FIXEDâ€™, â€˜RESOLVEDâ€™ or an equally obvious tag in the subject line. On mailing lists with fast turnaround, a potential respondent who sees a thread about &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Problem X&lt;/span&gt;â€&lt;/span&gt; ending with &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Problem X - FIXED&lt;/span&gt;â€&lt;/span&gt; knows not to waste his/her time even reading the thread (unless (s)he) personally finds Problem X interesting) and can therefore use that time solving a different problem.&lt;br /&gt;Your followup doesn't have to be long and involved; a simple &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Howdy â€” it was a failed network cable! Thanks, everyone. - Bill&lt;/span&gt;â€&lt;/span&gt; would be better than nothing.  In fact, a short and sweet summary is better than a long dissertation unless the solution has real technical depth.  Say what action solved the problem, but you need not replay the whole troubleshooting sequence.&lt;br /&gt;For problems with some depth, it is appropriate to post a summary of the troubleshooting history. Describe your final problem statement.  Describe what worked as a solution, and indicate avoidable blind alleys &lt;span class="emphasis"&gt;&lt;em&gt;after that&lt;/em&gt;&lt;/span&gt;. The blind alleys should come after the correct solution and other summary material, rather than turning the follow-up into a detective story. Name the names of people who helped you; you'll make friends that way.&lt;br /&gt;Besides being courteous and informative, this sort of followup will help others searching the archive of the mailing-list/newsgroup/forum to know exactly which solution helped you and thus may also help them.&lt;br /&gt;Last, and not least, this sort of followup helps everybody who assisted feel a satisfying sense of closure about the problem.  If you are not a techie or hacker yourself, trust us that this feeling is very important to the gurus and experts you tapped for help. Problem narratives that trail off into unresolved nothingness are frustrating things; hackers itch to see them resolved.  The goodwill that scratching that itch earns you will be very, very helpful to you next time you need to pose a question. &lt;br /&gt;Consider how you might be able to prevent others from having the same problem in the future.  Ask yourself if a documentation or FAQ patch would help, and if the answer is yes send that patch to the maintainer.&lt;br /&gt;Among hackers, this sort of good followup behavior is actually more important than conventional politeness.  It's how you get a reputation for playing well with others, which can be a very valuable asset.&lt;/div&gt;&lt;/div&gt;&lt;div class="sect1" title="How To Interpret Answers"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="answers"&gt;&lt;/a&gt;How To Interpret Answers&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="sect2" title="RTFM and STFW: How To Tell You've Seriously Screwed Up"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="rtfm"&gt;&lt;/a&gt;RTFM and STFW: How To Tell You've Seriously Screwed Up&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;There is an ancient and hallowed tradition: if you get a reply that reads &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;RTFM&lt;/span&gt;â€&lt;/span&gt;, the person who sent it thinks you should have Read The Fucking Manual.  He or she is almost certainly right. Go read it.&lt;br /&gt;RTFM has a younger relative.  If you get a reply that reads &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;STFW&lt;/span&gt;â€&lt;/span&gt;, the person who sent it thinks you should have Searched The Fucking Web.  He or she is almost certainly right.  Go search it. (The milder version of this is when you are told &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Google is your friend!&lt;/span&gt;â€&lt;/span&gt;)&lt;br /&gt;In Web forums, you may also be told to search the forum archives. In fact, someone may even be so kind as to provide a pointer to the previous thread where this problem was solved. But do not rely on this consideration; do your archive-searching before asking.&lt;br /&gt;Often, the person telling you to do a search has the manual or the web page with the information you need open, and is looking at it as he or she types. These replies mean that he thinks (a) the information you need is easy to find, and (b) you will learn more if you seek out the information than if you have it spoon-fed to you.&lt;br /&gt;You shouldn't be offended by this; by hacker standards, your respondent is showing you a rough kind of respect simply by not ignoring you.  You should instead be thankful for this grandmotherly kindness.&lt;/div&gt;&lt;div class="sect2" title="If you don't understand..."&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="lesser"&gt;&lt;/a&gt;If you don't understand...&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;If you don't understand the answer, do not immediately bounce back a demand for clarification.  Use the same tools that you used to try and answer your original question (manuals, FAQs, the Web, skilled friends) to understand the answer.  Then, if you still need to ask for clarification, exhibit what you have learned.&lt;br /&gt;For example, suppose I tell you: &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;It sounds like you've got a stuck zentry; you'll need to clear it.&lt;/span&gt;â€&lt;/span&gt; Then: here's a &lt;span class="emphasis"&gt;&lt;em&gt;bad&lt;/em&gt;&lt;/span&gt; followup question: &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;What's a zentry?&lt;/span&gt;â€&lt;/span&gt; Here's a &lt;span class="emphasis"&gt;&lt;em&gt;good&lt;/em&gt;&lt;/span&gt; followup question: &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;OK, I read the man page and zentries are only mentioned under the -z and -p switches.  Neither of them says anything about clearing zentries.  Is it one of these or am I missing something here?&lt;/span&gt;â€&lt;/span&gt;&lt;/div&gt;&lt;div class="sect2" title="Dealing with rudeness"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a href="" id="keepcool"&gt;&lt;/a&gt;Dealing with rudeness&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Much of what looks like rudeness in hacker circles is not intended to give offense.  Rather, it's the product of the direct, cut-through-the-bullshit communications style that is natural to people who are more concerned about solving problems than making others feel warm and fuzzy.&lt;br /&gt;When you perceive rudeness, try to react calmly.  If someone is really acting out, it is very likely a senior person on the list or newsgroup or forum will call him or her on it.  If that  &lt;span class="emphasis"&gt;&lt;em&gt;doesn't&lt;/em&gt;&lt;/span&gt; happen and you lose your temper, it is likely that the person you lose it at was behaving within the hacker community's norms and &lt;span class="emphasis"&gt;&lt;em&gt;you&lt;/em&gt;&lt;/span&gt; will be considered at fault.  This will hurt your chances of getting the information or help you want.&lt;br /&gt;On the other hand, you will occasionally run across rudeness and posturing that is quite gratuitous.  The flip-side of the above is that it is acceptable form to slam real offenders quite hard, dissecting their misbehavior with a sharp verbal scalpel.  Be very, very sure of your ground before you try this, however.  The line between correcting an incivility and starting a pointless flamewar is thin enough that hackers themselves not infrequently blunder across it; if you are a newbie or an outsider, your chances of avoiding such a blunder are low.  If you're after information rather than entertainment, it's better to keep your fingers off the keyboard than to risk this.&lt;br /&gt;(Some people assert that many hackers have a mild form of autism or Asperger's Syndrome, and are actually missing some of the brain circuitry that lubricates &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;normal&lt;/span&gt;â€&lt;/span&gt; human social interaction.  This may or may not be true.  If you are not a hacker yourself, it may help you cope with our eccentricities if you think of us as being brain-damaged.  Go right ahead.  We won't care; we &lt;span class="emphasis"&gt;&lt;em&gt;like&lt;/em&gt;&lt;/span&gt; being whatever it is we are, and generally have a healthy skepticism about clinical labels.)&lt;br /&gt;In the next section, we'll talk about a different issue;  the kind of &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;rudeness&lt;/span&gt;â€&lt;/span&gt; you'll see when &lt;span class="emphasis"&gt;&lt;em&gt;you&lt;/em&gt;&lt;/span&gt;  misbehave.&lt;/div&gt;&lt;/div&gt;&lt;div class="sect1" title="On Not Reacting Like A Loser"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="not_losing"&gt;&lt;/a&gt;On Not Reacting Like A Loser&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Odds are you'll screw up a few times on hacker community forums â€” in ways detailed in this article, or similar.  And you'll be told exactly how you screwed up, possibly with colourful asides.  In public.&lt;br /&gt;When this happens, the worst thing you can do is whine about the experience, claim to have been verbally assaulted, demand apologies, scream, hold your breath, threaten lawsuits, complain to people's employers, leave the toilet seat up, etc.  Instead, here's what you do:&lt;br /&gt;Get over it.  It's normal.  In fact, it's healthy and appropriate.&lt;br /&gt;Community standards do not maintain themselves: They're maintained by people actively applying them, visibly, &lt;span class="emphasis"&gt;&lt;em&gt;in public&lt;/em&gt;&lt;/span&gt;.  Don't whine that all criticism should have been conveyed via private e-mail: That's not how it works.  Nor is it useful to insist you've been personally insulted when someone comments that one of your claims was wrong, or that his views differ.  Those are loser attitudes.&lt;br /&gt;There have been hacker forums where, out of some misguided sense of hyper-courtesy, participants are banned from posting any fault-finding with another's posts, and told &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Don't say anything if you're unwilling to help the user.&lt;/span&gt;â€&lt;/span&gt;  The resulting departure of clueful participants to elsewhere causes them to descend into meaningless babble and become useless as technical forums.&lt;br /&gt;Exaggeratedly &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;friendly&lt;/span&gt;â€&lt;/span&gt; (in that fashion) or useful:  Pick one.&lt;br /&gt;Remember:  When that hacker tells you that you've screwed up, and (no matter how gruffly) tells you not to do it again, he's acting out of concern for (1) you and (2) his community.  It would be much easier for him to ignore you and filter you out of his life.  If you can't manage to be grateful, at least have a little dignity, don't whine, and don't expect to be treated like a fragile doll just because you're a newcomer with a theatrically hypersensitive soul and delusions of entitlement.&lt;br /&gt;Sometimes people will attack you personally, flame without an apparent reason, etc., even if you don't screw up (or have only screwed up in their imagination). In this case, complaining is the way to &lt;span class="emphasis"&gt;&lt;em&gt;really&lt;/em&gt;&lt;/span&gt; screw up.&lt;br /&gt;These flamers are either lamers who don't have a clue but believe themselves to be experts, or would-be psychologists testing whether you'll screw up. The other readers either ignore them, or find ways to deal with them on their own. The flamers' behavior creates problems for themselves, which don't have to concern you.&lt;br /&gt;Don't let yourself be drawn into a flamewar, either. Most flames are best ignored â€” after you've checked whether they are really flames, not pointers to the ways in which you have screwed up, and not cleverly ciphered answers to your real question (this happens as well).&lt;/div&gt;&lt;div class="sect1" title="Questions Not To Ask"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="classic"&gt;&lt;/a&gt;Questions Not To Ask&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Here are some classic stupid questions, and what hackers are thinking when they don't answer them.&lt;br /&gt;&lt;div class="qandaset" title="Frequently Asked Questions"&gt;&lt;a href="" id="id479466"&gt;&lt;/a&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479470"&gt;Where can I find program or resource X?&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479492"&gt;How can I use X to do Y?&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479512"&gt;How can I configure my shell prompt?&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479534"&gt;Can I convert an AcmeCorp document into a TeX file using the Bass-o-matic file converter?&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479555"&gt;My {program, configuration, SQL statement} doesn't work&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479589"&gt;I'm having problems with my Windows machine. Can you help?&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479615"&gt;My program doesn't work.  I think system facility X is broken.&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479635"&gt;I'm having problems installing Linux or X. Can you help?&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;Q: &lt;a href="http://catb.org/esr/faqs/smart-questions.html#id479671"&gt;How can I crack root/steal channel-ops privileges/read someone's e-mail?&lt;/a&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;table border="0" summary="Q and A Set"&gt;&lt;colgroup&gt;&lt;col align="left" width="1%"&gt;&lt;/col&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479470"&gt;&lt;/a&gt;&lt;a href="" id="id479472"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;Where can I find program or resource X?&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;The same place I'd find it, fool â€” at the other end of a web search.  Ghod, doesn't everybody know how to use  &lt;a class="ulink" href="http://www.google.com/" target="_top"&gt;Google&lt;/a&gt; yet?&lt;/td&gt;&lt;/tr&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479492"&gt;&lt;/a&gt;&lt;a href="" id="id479494"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;How can I use X to do Y?&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;If what you want is to do Y, you should ask that question without pre-supposing the use of a method that may not be appropriate. Questions of this form often indicate a person who is not merely ignorant about X, but confused about what problem Y they are solving and too fixated on the details of their particular situation.  It is generally best to ignore such people until they define their problem better.&lt;/td&gt;&lt;/tr&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479512"&gt;&lt;/a&gt;&lt;a href="" id="id479514"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;How can I configure my shell prompt?&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;If you're smart enough to ask this question, you're smart enough to &lt;a class="link" href="http://catb.org/esr/faqs/smart-questions.html#rtfm" title="RTFM and STFW: How To Tell You've Seriously Screwed Up"&gt;RTFM&lt;/a&gt; and find out yourself.&lt;/td&gt;&lt;/tr&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479534"&gt;&lt;/a&gt;&lt;a href="" id="id479536"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;Can I convert an AcmeCorp document into a TeX file using the Bass-o-matic file converter?&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;Try it and see.  If you did that, you'd (a) learn the answer,  and (b) stop wasting my time.&lt;/td&gt;&lt;/tr&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479555"&gt;&lt;/a&gt;&lt;a href="" id="id479557"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;My {program, configuration, SQL statement} doesn't work&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;This is not a question, and I'm not interested in playing Twenty Questions to pry your actual question out of you â€” I have better things to do.  On seeing something like this, my reaction is normally of one of the following:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt;do you have anything else to add to that?&lt;/li&gt;&lt;li class="listitem"&gt;oh, that's too bad, I hope you get it fixed.&lt;/li&gt;&lt;li class="listitem"&gt;and this has exactly what to do with me?&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479589"&gt;&lt;/a&gt;&lt;a href="" id="id479591"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;I'm having problems with my Windows machine. Can you help?&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;Yes.  Throw out that Microsoft trash and install an open-source operating system like Linux or BSD.&lt;br /&gt;Note: you &lt;span class="emphasis"&gt;&lt;em&gt;can&lt;/em&gt;&lt;/span&gt; ask questions related to Windows machines if they are about a program that does have an official Windows build, or interacts with Windows machines (i.e., Samba). Just don't be surprised by the reply that the problem is with Windows and not the program, because Windows is so broken in general that this is very often the case.&lt;/td&gt;&lt;/tr&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479615"&gt;&lt;/a&gt;&lt;a href="" id="id479617"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;My program doesn't work.  I think system facility X is broken.&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;While it is possible that you are the first person to notice an obvious deficiency in system calls and libraries heavily used by hundreds or thousands of people, it is rather more likely that you are utterly clueless. Extraordinary claims require extraordinary evidence; when you make a claim like this one, you must back it up with clear and exhaustive documentation of the failure case.&lt;/td&gt;&lt;/tr&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479635"&gt;&lt;/a&gt;&lt;a href="" id="id479637"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;I'm having problems installing Linux or X. Can you help?&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;No.  I'd need hands-on access to your machine to troubleshoot this.  Go ask your local Linux user group for hands-on help.  (You can find a list of user groups &lt;a class="ulink" href="http://www.linux.org/groups/index.html" target="_top"&gt;here&lt;/a&gt;.)&lt;br /&gt;Note: questions about installing Linux may be appropriate if you're on a forum or mailing list about a particular distribution, and the problem is with &lt;span class="emphasis"&gt;&lt;em&gt;that&lt;/em&gt;&lt;/span&gt; distro; or on local user groups forums. In this case, be sure to describe the exact details of the failure. But do careful searching first, with "linux" and &lt;span class="emphasis"&gt;&lt;em&gt;all&lt;/em&gt;&lt;/span&gt; suspicious pieces of hardware.&lt;/td&gt;&lt;/tr&gt;&lt;tr class="question" title="Q:"&gt;&lt;td align="left" valign="top"&gt;&lt;a href="" id="id479671"&gt;&lt;/a&gt;&lt;a href="" id="id479673"&gt;&lt;/a&gt;&lt;b&gt;Q:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;How can I crack root/steal channel-ops privileges/read someone's e-mail?&lt;/td&gt;&lt;/tr&gt;&lt;tr class="answer"&gt;&lt;td align="left" valign="top"&gt;&lt;b&gt;A:&lt;/b&gt;&lt;/td&gt;&lt;td align="left" valign="top"&gt;You're a lowlife for wanting to do such things and a moron for asking  a hacker to help you.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="sect1" title="Good and Bad Questions"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="examples"&gt;&lt;/a&gt;Good and Bad Questions&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Finally, I'm going to illustrate how to ask questions in a smart way by example; pairs of questions about the same problem, one asked in  a stupid way and one in a smart way.&lt;br /&gt;&lt;div class="variablelist"&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Stupid:&lt;/strong&gt;&lt;/span&gt; Where can I find out stuff about the Foonly Flurbamatic? &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;This question just begs for &lt;a class="link" href="http://catb.org/esr/faqs/smart-questions.html#rtfm" title="RTFM and STFW: How To Tell You've Seriously Screwed Up"&gt;"STFW"&lt;/a&gt; as a reply.&lt;/dd&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Smart:&lt;/strong&gt;&lt;/span&gt; I used Google to try to find &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Foonly Flurbamatic 2600&lt;/span&gt;â€&lt;/span&gt; on the Web, but I got no useful hits.  Can I get a pointer to programming information on this device? &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;This one has already STFWed, and sounds like he might have a real problem.&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div class="variablelist"&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Stupid:&lt;/strong&gt;&lt;/span&gt; I can't get the code from project foo to compile.  Why is it broken? &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;The querent assumes that somebody else screwed up.  Arrogant git...&lt;/dd&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Smart:&lt;/strong&gt;&lt;/span&gt; The code from project foo doesn't compile under Nulix version 6.2.   I've read the FAQ, but it doesn't have anything in it about Nulix-related problems.  Here's a transcript of my compilation attempt; is it something I did? &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;The querent has specified the environment, read the FAQ, is showing the error, and is not assuming his problems are someone else's fault.  This one might be worth some attention.&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div class="variablelist"&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Stupid:&lt;/strong&gt;&lt;/span&gt; I'm having problems with my motherboard.  Can anybody help? &lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;J. Random Hacker's response to this is likely to be &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Right.  Do you need burping and diapering, too?&lt;/span&gt;â€&lt;/span&gt; followed by a punch of the delete key.&lt;/dd&gt;&lt;dt&gt;&lt;span class="term"&gt;&lt;span class="strong"&gt;&lt;strong&gt;Smart:&lt;/strong&gt;&lt;/span&gt; I tried X, Y, and Z on the S2464 motherboard.  When that didn't work, I tried A, B, and C.  Note the curious symptom when I tried C. Obviously the florbish is grommicking, but the results aren't what one might expect.  What are the usual causes of grommicking on Athlon MP motherboards?  Anybody got ideas for more tests I can run to pin down the problem?&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;This person, on the other hand, seems worthy of an answer.  He/she has exhibited problem-solving intelligence rather than passively waiting for an answer to drop from on high.&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;In the last question, notice the subtle but important difference between demanding &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Give me an answer&lt;/span&gt;â€&lt;/span&gt; and &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;Please help me figure out what additional diagnostics I can run to achieve enlightenment.&lt;/span&gt;â€&lt;/span&gt;&lt;br /&gt;In fact, the form of that last question is closely based on a real incident that happened in August 2001 on the linux-kernel mailing list (lkml).  I (Eric) was the one asking the question that time.  I was seeing mysterious lockups on a Tyan S2462 motherboard.  The list members supplied the critical information I needed to solve them.&lt;br /&gt;By asking the question in the way I did, I gave people something to chew on; I made it easy and attractive for them to get involved. I demonstrated respect for my peers' ability and invited them to consult with me as a peer.  I also demonstrated respect for the value of their time by telling them the blind alleys I had already run down.&lt;br /&gt;Afterwards, when I thanked everyone and remarked how well the process had worked, an lkml member observed that he thought it had worked not because I'm a &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;name&lt;/span&gt;â€&lt;/span&gt; on that list, but because I asked the question in the proper form.&lt;br /&gt;Hackers are in some ways a very ruthless meritocracy; I'm certain he was right, and that if I &lt;span class="emphasis"&gt;&lt;em&gt;had&lt;/em&gt;&lt;/span&gt; behaved like a sponge I would have been flamed or ignored no matter who I was. His suggestion that I write up the whole incident as instruction to others led directly to the composition of this guide.&lt;/div&gt;&lt;div class="sect1" title="If You Can't Get An Answer"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="id479876"&gt;&lt;/a&gt;If You Can't Get An Answer&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;If you can't get an answer, please don't take it personally that we don't feel we can help you. Sometimes the members of the asked group may simply not know the answer.  No response is not the same as being ignored, though admittedly it's hard to spot the difference from outside.&lt;br /&gt;In general, simply re-posting your question is a bad idea.  This will be seen as pointlessly annoying.  Have patience: the person with your answer may be in a different time-zone and asleep. Or it may be that your question wasn't well-formed to begin with.&lt;br /&gt;There are other sources of help you can go to, often sources better adapted to a novice's needs.&lt;br /&gt;There are many online and local user groups who are enthusiasts about the software, even though they may never have written any software themselves. These groups often form so that people can help each other and help new users.&lt;br /&gt;There are also plenty of commercial companies you can contract with for help, both large and small (Red Hat and SpikeSource are two of the best known; there are many others). Don't be dismayed at the idea of having to pay for a bit of help! After all, if your car engine blows a head gasket, chances are you would take it to a repair shop and pay to get it fixed. Even if the software didn't cost you anything, you can't expect that support to always come for free.&lt;br /&gt;For popular software like Linux, there are at least 10,000 users per developer. It's just not possible for one person to handle the support calls from over 10,000 users. Remember that even if you have to pay for support, you are still paying much less than if you had to buy the software as well (and support for closed-source software is usually more expensive and less competent than support for open-source software).&lt;/div&gt;&lt;div class="sect1" title="How To Answer Questions in a Helpful Way"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="id479916"&gt;&lt;/a&gt;How To Answer Questions in a Helpful Way&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Be gentle.&lt;/em&gt;&lt;/span&gt; Problem-related stress can make people seem rude or stupid even when they're not.&lt;br /&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Reply to a first offender off-line.&lt;/em&gt;&lt;/span&gt; There is no need of public humiliation for someone who may have made an honest mistake. A real newbie may not know how to search archives or where the FAQ is stored or posted.&lt;br /&gt;&lt;span class="emphasis"&gt;&lt;em&gt;If you don't know for sure, say so!&lt;/em&gt;&lt;/span&gt; A wrong but authoritative-sounding answer is worse than none at all.  Don't point anyone down a wrong path simply because it's fun to sound like an expert.  Be humble and honest; set a good example for both the querent and your peers.&lt;br /&gt;&lt;span class="emphasis"&gt;&lt;em&gt;If you can't help, don't hinder.&lt;/em&gt;&lt;/span&gt; Don't make jokes about procedures that could trash the user's setup â€” the poor sap might interpret these as instructions.&lt;br /&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Ask probing questions to elicit more details.&lt;/em&gt;&lt;/span&gt; If you're good at this, the querent will learn something â€” and so might you.  Try to turn the bad question into a good one; remember we were all newbies once.&lt;br /&gt;While muttering RTFM is sometimes justified when replying to someone who is just a lazy slob, a pointer to documentation (even if it's just a suggestion to google for a key phrase) is better.&lt;br /&gt;&lt;span class="emphasis"&gt;&lt;em&gt;If you're going to answer the question at all, give good value.&lt;/em&gt;&lt;/span&gt; Don't suggest kludgy workarounds when somebody is using the wrong tool or approach.  Suggest good tools.  Reframe the question.&lt;br /&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Help your community learn from the question.&lt;/em&gt;&lt;/span&gt; When you field a good question, ask yourself &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;How would the relevant documentation or FAQ have to change so that nobody has to answer this again?&lt;/span&gt;â€&lt;/span&gt; Then send a patch to the document maintainer.&lt;br /&gt;If you did research to answer the question, &lt;span class="emphasis"&gt;&lt;em&gt;demonstrate your skills rather than writing as though you pulled the answer out of your butt.&lt;/em&gt;&lt;/span&gt; Answering one good question is like feeding a hungry person one meal, but teaching them research skills by example is showing them how to grow food for a lifetime.&lt;/div&gt;&lt;div class="sect1" title="Related Resources"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="id479985"&gt;&lt;/a&gt;Related Resources&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;If you need instruction in the basics of how personal computers, Unix, and the Internet work, see &lt;a class="ulink" href="http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/" target="_top"&gt; The Unix and Internet Fundamentals HOWTO&lt;/a&gt;. &lt;br /&gt;When you release software or write patches for software, try to follow the guidelines in the &lt;a class="ulink" href="http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html" target="_top"&gt; Software Release Practice HOWTO&lt;/a&gt;.&lt;/div&gt;&lt;div class="sect1" title="Acknowledgements"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a href="" id="id480012"&gt;&lt;/a&gt;Acknowledgements&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Evelyn Mitchell contributed some example stupid questions and inspired the &lt;span class="quote"&gt;â€œ&lt;span class="quote"&gt;How To Give A Good Answer&lt;/span&gt;â€&lt;/span&gt; section. Mikhail Ramendik contributed some particularly valuable suggestions for improvements.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-8002459486553585077?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/8002459486553585077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2011/09/this-post-is-copy-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8002459486553585077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8002459486553585077'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2011/09/this-post-is-copy-of.html' title='This Post is Copy of [http://catb.org/esr/faqs/smart-questions.html]'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5955380918129348365</id><published>2011-09-03T13:54:00.000-07:00</published><updated>2011-09-03T13:54:26.440-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='n00b'/><title type='text'>Getting Answers [Copy of http://www.mikeash.com/getting_answers.html ]</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="font-size: 300%; text-align: center;"&gt;Getting Answers&lt;/div&gt;&lt;br /&gt;I hang out in several programmer related chats and forums and I see a  lot of people having trouble getting answers. They get no answers, poor  answers, or absorb a lot of verbal abuse. As a person asking questions,  there are some simple things you can do to help your chances of getting  good answers. This guide will show you ten easy things you can do to  ensure your questions are answered quickly and well. &lt;br /&gt;If you're in a hurry, you can skip the boring introduction and go &lt;a href="http://www.mikeash.com/getting_answers.html#guide_begin"&gt;straight to the guide&lt;/a&gt;. &lt;br /&gt;Please leave your comments on this article &lt;a href="http://www.mikeash.com/blog/pivot/entry.php?id=21"&gt;in the blog post&lt;/a&gt;. &lt;br /&gt;Other people have written articles on this subject before, but they  suffer from problems. My goal is to avoid those problems and make  something that's directly useful to you, the person with problems,  rather than something that's mostly useful for the people answering the  questions. &lt;br /&gt;&lt;a href="http://catb.org/esr/faqs/smart-questions.html"&gt;How To Ask Questions The Smart Way&lt;/a&gt;  is pretty condescending, especially if you already feel insulted by  somebody telling you that you need help asking questions. If you're  pointed at a guide with a filename of &lt;tt&gt;smart-questions&lt;/tt&gt;, that means this person thinks you have stupid questions, and who needs that? &lt;br /&gt;&lt;a href="http://www.slash7.com/pages/vampires"&gt;Help Vampires: A Spotter's Guide&lt;/a&gt;  is great, but it's written from the other side. While it's great for  people who hang out and answer a lot of questions, and helps them deal  with the titular Vampires, it's not something that's very useful for a  person asking questions. &lt;br /&gt;Another guide I just discovered is &lt;a href="http://workaround.org/getting-help-on-irc"&gt;Getting help on IRC&lt;/a&gt;.  It's a handy companion to this one, although more geared towards the  nitty gritty of IRC etiquette and less towards the actual questions. &lt;br /&gt;And so I present to you &lt;i&gt;Getting Answers&lt;/i&gt;. The goal of the article  is to get answers to your questions, nothing more and nothing less. I'll  completely ignore boring stuff like the proper way to greet people or  when to read the topic. This guide will walk you through ten basic  things you can do to increase the chances of getting answers, and  increase the quality of the answers you get. Getting a reply of &lt;tt&gt;rtfm!&lt;/tt&gt;  is considered failure, no better than no reply at all, and getting  advice that solves your problem is success. All else is secondary to  that. &lt;br /&gt;You'll notice a distinct IRC and Mac flavor to the guide, but the ideas should be true for any topic in any context. &lt;br /&gt;Question Guy and Answer Man will be helping us out by illustrating the  principles in the guide. QGuy and AMan will have simulated conversations  showing the right and wrong way to get good answers quickly. The  conversations are made up, but every single one of them is taken  directly from situations I've seen.  &lt;a href="" name="guide_begin"&gt;&lt;/a&gt; &lt;br /&gt;&lt;ol&gt;&lt;li&gt; &lt;a href="" name="explain"&gt;&lt;/a&gt; &lt;b&gt;Explain what doesn't work&lt;/b&gt; &lt;br /&gt;You'd think this would be obvious, but it's not. Many people will  ask about general technique or something they feel is simpler and  related instead of just saying what is going wrong. If you think it's a  problem with general technique, then ask that too, but always tell  people what isn't working for you.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how do I compile an app on 10.4 that works on 10.3?                 &lt;br /&gt;AMan: set up the SDK like so: ...                 &lt;br /&gt;QGuy: is there any other way?                 &lt;br /&gt;AMan: I don't understand what you mean                 &lt;br /&gt;QGuy: well, my app crashes on launch on 10.3                 &lt;br /&gt;AMan: ...             &lt;/tt&gt; &lt;/blockquote&gt;Good question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: my app crashes on 10.3 but works fine on 10.4, how do I  discover the problem? is this a problem with how I set up my build?                 &lt;br /&gt;AMan: your build setup shouldn't matter, you're  probably linking against something that doesn't exist on 10.3. look at  the Console output after the crash to see what it is             &lt;/tt&gt; &lt;/blockquote&gt;What's going wrong is, "my application crashes on launch on  10.3", but this doesn't even get mentioned until several rounds into the  question/answer process, and after much time wasted on both sides.  Answer Man's explanation of SDKs was completely pointless because  Question Guy already knew about it. Question Guy lost time by turning  Answer Man onto an irrelevant path instead of stating his problem at the  start.         &lt;br /&gt;By stating exactly what is going wrong right away, Question Guy got a useful answer from Answer Man instantly.         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="provide"&gt;&lt;/a&gt; &lt;b&gt;Provide everything up-front&lt;/b&gt; &lt;br /&gt;Making people fish for information wastes your time. Give as much background information in your original question as you can.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how do I append to a string?                 &lt;br /&gt;AMan: use stringByAppendingString:                 &lt;br /&gt;QGuy: well, I don't want to create a new object                 &lt;br /&gt;AMan: then use NSMutableString and appendString:                 &lt;br /&gt;QGuy: but I'm using C, not ObjC                 &lt;br /&gt;AMan: argh, why didn't you say so? use strcat                 &lt;br /&gt;QGuy: what if I have a CFString?                 &lt;br /&gt;AMan: gah! use CFStringAppend                 &lt;br /&gt;QGuy: but that doesn't work, I need to append a char *                 &lt;br /&gt;AMan: screw this &lt;leaves&gt;             &lt;/leaves&gt;&lt;/tt&gt; &lt;/blockquote&gt;Good question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how do I append a char * to a CFString? The stuff I'm finding only works with CFMutableString                 &lt;br /&gt;AMan: that's your only choice, you'll have to make a mutable copy, then use CFStringAppendCString             &lt;/tt&gt; &lt;/blockquote&gt;Under-specifying your question doesn't save you any time (you'll  have to say it all eventually anyway) and makes people less likely to  reply to you, both now and in the future.         &lt;br /&gt;You might be afraid of saying too much. Don't be. It's far  better to be over-specific than under-specific, as it's much easier for  somebody to ignore the extra details than it is to ask you for the  missing ones. When in doubt, say, "I'm not sure if it's relevant, but  I'm doing...."         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="postcode"&gt;&lt;/a&gt; &lt;b&gt;Post your code&lt;/b&gt; &lt;br /&gt;This doesn't apply to big conceptual questions, of course, but for  everything else it's essential. Never describe your general approach to a  problem without posting the code behind it, because the code is what  counts, and translating everything through English tends to change it  beyond recognition.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: when I create an NSString from UTF-8 data it fails, why?                 &lt;br /&gt;AMan: post your code                 &lt;br /&gt;QGuy: I don't think it's a code problem                 &lt;br /&gt;AMan: screw this &lt;leaves&gt;             &lt;/leaves&gt;&lt;/tt&gt; &lt;/blockquote&gt;Bad question #2:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: if I subclass NSMatrix then nothing appears on the screen, but using a plain NSMatrix works, why?                 &lt;br /&gt;AMan: how the heck should I know?             &lt;/tt&gt; &lt;/blockquote&gt;Bad question #3:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: when I create an NSString from UTF-8 data it fails, why?                 &lt;br /&gt;AMan: post your code                 &lt;br /&gt;QGuy: I don't have the code with me, but I'm doing something like char *utf8str = ...; [utf8str stringWithUTF8String]                 &lt;br /&gt;AMan: you can't send a message to a char *, and there's no such method as stringWithUTF8String with no parameters, try ...                 &lt;br /&gt;...the next day...                 &lt;br /&gt;QGuy: I figured out the problem, I was actually using stringWithCString:                 &lt;br /&gt;AMan: aarrgghh!             &lt;/tt&gt; &lt;/blockquote&gt;Good question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: when I create an NSString from UTF-8 data using char *utf8str = ...; [NSString stringWithCString:utf8str] it fails, why?                 &lt;br /&gt;AMan: because stringWithCString: doesn't expect UTF-8, use stringWithUTF8String             &lt;/tt&gt; &lt;/blockquote&gt;Asking for code takes time and effort, and you can hasten the  answer by providing it right away. If you don't know whether it's  relevant or not, post it anyway. Never paraphrase or type from memory.  Even when done with the best of intentions, you'll introduce subtle or  blatant errors in your code, and the people you're talking to will be  solving a problem completely different from what you actually have.         &lt;br /&gt;(On IRC, don't forget to use a pastebot. Pasting your code  directly into the channel is considered rude if it's more than a line or  so.)         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="research-before"&gt;&lt;/a&gt; &lt;b&gt;Do your research beforehand&lt;/b&gt; &lt;br /&gt;While it can be a good idea to ping a friend or two about a problem  as soon as you run into it, asking strangers should be near your last  resort. Do as much as you can to research the problem and solve it on  your own before you do so. This will help you get an answer by letting  you pose a much more informed question. The more you know about the  topic, the better chance of asking what you need.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how do I create a thread?                 &lt;br /&gt;AMan: rtfm!             &lt;/tt&gt; &lt;/blockquote&gt;Good question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: I read the NSThread docs but how can make it call a method with an int parameter?                 &lt;br /&gt;AMan: make a new method that takes an NSNumber and just calls the other method with its intValue             &lt;/tt&gt; &lt;/blockquote&gt;In the first version, Question Guy didn't get a very useful  response. The second version's response was much more useful, because  Question Guy read about the topic before he asked his question.         &lt;br /&gt;Question Guy also made the smart move of detailing what he researched. You're much less likely to get the useless &lt;tt&gt;rtfm!&lt;/tt&gt; if you tell everybody which fine manuals you've already read.         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="research-during"&gt;&lt;/a&gt; &lt;b&gt;Do your research during&lt;/b&gt; &lt;br /&gt;Your work doesn't stop once you ask the first question. When  presented with an unfamiliar piece of advice, research it before you ask  about it. Even just sticking the unfamiliar term into Google can help a  lot.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how can I get a directory listing?                 &lt;br /&gt;AMan: use NSFileManager                 &lt;br /&gt;QGuy: what's NSFileManager?                 &lt;br /&gt;AMan: rtfm!             &lt;/tt&gt; &lt;/blockquote&gt;Good question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how can I get a directory listing?                 &lt;br /&gt;AMan: use NSFileManager                 &lt;br /&gt;...QGuy puts NSFileManager into Google...                 &lt;br /&gt;QGuy: ok, thanks... is there any way to make it only give me results whose names begin with "tty"?                 &lt;br /&gt;AMan: you can get all of the results, then filter them using NSPredicate by doing...             &lt;/tt&gt; &lt;/blockquote&gt;Researching your followup questions as well as your original question will get you more useful replies.         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="research-after"&gt;&lt;/a&gt; &lt;b&gt;Do your research afterwards&lt;/b&gt; &lt;br /&gt;I bet you saw this one coming. After you get advice and depart, you  should do as much research as you can, before coming back and asking  questions about the advice.         Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how can I get a directory listing?                 &lt;br /&gt;AMan: use NSFileManager                 &lt;br /&gt;...QGuy departs...later:                 &lt;br /&gt;QGuy: how do I use NSFileManager?                 &lt;br /&gt;AMan: rtfm!             &lt;/tt&gt; &lt;/blockquote&gt;&lt;br /&gt;Good question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how can I get a directory listing?                 &lt;br /&gt;AMan: use NSFileManager!                 &lt;br /&gt;...QGuy departs...the next day:                 &lt;br /&gt;QGuy: when I use NSFileManager to list the contents  of /, I get "Applications" instead of the translated name I see in the  Finder, why does it do that and how do I duplicate Finder's behavior?                 &lt;br /&gt;AMan: localized names don't exist in the filesystem, but you can use...             &lt;/tt&gt; &lt;/blockquote&gt;As before, doing your research makes for better answers.         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="no-repeats"&gt;&lt;/a&gt; &lt;b&gt;Don't post the same question repeatedly&lt;/b&gt; &lt;br /&gt;This especially applies to forums and mailing lists, but it applies  to IRC too. Unless your problem is highly complicated, many people will  be able to help you. Chances are one of those people saw your question  the first time. If nobody answers, do more research, try to produce a  small test case or at least narrow the problem down, and come back in a  day or two with more information.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: my custom NSMatrix subclass doesn't draw, help?                 &lt;br /&gt;...crickets...the next day:                 &lt;br /&gt;QGuy: my custom NSMatrix subclass doesn't draw, help?                 &lt;br /&gt;...crickets...the next day:                 &lt;br /&gt;QGuy: my custom NSMatrix subclass doesn't draw, help?             &lt;/tt&gt; &lt;/blockquote&gt;Good question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: my custom NSMatrix subclass doesn't draw, help?                 &lt;br /&gt;...crickets...the next day:                 &lt;br /&gt;QGuy: my custom NSMatrix subclass doesn't draw, I  created a simple test project that exhibits the behavior, you can  download it at http://blah, anybody know what's going on?                 &lt;br /&gt;AMan: don't override drawRect:             &lt;/tt&gt; &lt;/blockquote&gt;If nobody could answer your question the first time, they  probably can't want to answer it the second time either. Use the time  you spend waiting for an answer to work on the problem yourself. Even if  you have no hope of solving it, you can produce something and gather  information that will help others solve it.         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="followup"&gt;&lt;/a&gt; &lt;b&gt;Follow up after you get an answer&lt;/b&gt; &lt;br /&gt;You should always reply to people who give advice, even if you  understand it and it works perfectly and you don't need any more  information.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: my program crashes with an EXC_BAD_ACCESS when I do [obj release], what's going on?                 &lt;br /&gt;AMan: you're probably over-releasing, try using NSZombieEnabled                 &lt;br /&gt;...later...                 &lt;br /&gt;QGuy: my program crashes in some sort of notification callback, how can I debug that?                 &lt;br /&gt;AMan: wait, did you solve your [obj release] crash?                 &lt;br /&gt;...later...                 &lt;br /&gt;QGuy: my program gives me an error saying NSString doesn't respond to setObject:forKey:, how do I debug that?                 &lt;br /&gt;AMan: screw this &lt;leaves&gt;             &lt;/leaves&gt;&lt;/tt&gt; &lt;/blockquote&gt;Better question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: my program crashes with an EXC_BAD_ACCESS when I do [obj release], what's going on?                 &lt;br /&gt;AMan: you're probably over-releasing, try using NSZombieEnabled                 &lt;br /&gt;QGuy: ok, thanks                 &lt;br /&gt;...later...                 &lt;br /&gt;QGuy: I found my over-release problem from before, but now my program crashes in __CFXNotificationPost, how can I debug that?                 &lt;br /&gt;AMan: make sure you remove yourself as an observer from the NSNotificationCenter in your -dealloc method                 &lt;br /&gt;QGuy: oops, thanks                 &lt;br /&gt;...later...                 &lt;br /&gt;QGuy: ok, got the notification crasher fixed, but  now my program gives me an error saying "-[NSCFString  setObject:forKey:]: selector not recognized", how do I debug that?                 &lt;br /&gt;AMan: that could be due to another over-release bug,  or just a confusion of types where you're treating a string like a  dictionary                 &lt;br /&gt;QGuy: ok, I'll take a look, thanks             &lt;/tt&gt; &lt;/blockquote&gt;Unless you're paying for help (in which case you can probably  ignore this entire page, and the person you're paying will just charge  more), the people who are answering your questions are doing it for  free. Like a cute puppy who sits on command, you need to reward them  when they do what you want.         &lt;br /&gt;The second conversation is labeled "better" instead of "good"  because it probably violates rule #2. The basic answers to these  questions should exist in the conceptual documentation, which can then  be used to ask a better question and get a better answer. But I couldn't  think of a better example.         &lt;br /&gt;For more complex questions, follow up with how you finally  solved it and which advice you used. This not only provides a powerful  reward to the people who provided it, but it allows other people to  learn from your example.         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="people"&gt;&lt;/a&gt; &lt;b&gt;Treat the list like people&lt;/b&gt; &lt;br /&gt;Many conversations I see indicate a subtle, buried belief that the  list or chat is some kind of answer machine, and the key to obtaining a  good response is to hunt around until the precise required format for  the question is found.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how do I append to an NSString?                 &lt;br /&gt;AMan: read the NSString docs, search for "append"                 &lt;br /&gt;QGuy: I'm new to Cocoa and I want to append to an NSString, how do I do that?                 &lt;br /&gt;AMan: hello? read what I said above                 &lt;br /&gt;QGuy: I'm on 10.4.7 using Xcode 2.3, I don't know much about Cocoa, how do I append to an NSString?                 &lt;br /&gt;AMan: ...             &lt;/tt&gt; &lt;/blockquote&gt;Good question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how do I append to an NSString?                 &lt;br /&gt;AMan: read the NSString docs, search for "append"                 &lt;br /&gt;QGuy: doh, sorry, I forgot to mention that I want to append a C string                 &lt;br /&gt;AMan: in that case, make an NSString from the C string, then append that, or use %s with stringByAppendingFormat:             &lt;/tt&gt; &lt;/blockquote&gt;It's not a game, you're talking to real live people. Treat them  just as you would treat people you're talking to face-to-face, and  you'll get much better results.         &lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="" name="consider"&gt;&lt;/a&gt; &lt;b&gt;Always consider the answer&lt;/b&gt; &lt;br /&gt;Sometimes a real moron will reply to you, and sometimes you'll get a  smart guy who's having a bad day or who didn't correctly read your  question. However, most of the time you'll be talking to people who know  more about the subject at hand than you do (that's why you came to them  for help in the first place, remember). As such, it pays to at least  entertain the possibility that they know what they're talking about.                  Bad question:         &lt;br /&gt;&lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how can I memory-map a file using Cocoa?                 &lt;br /&gt;AMan: NSData                 &lt;br /&gt;QGuy: please read my question again, I want to memory-map a file                 &lt;br /&gt;AMan: ...             &lt;/tt&gt; &lt;/blockquote&gt;Better question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how can I memory-map a file using Cocoa?                 &lt;br /&gt;AMan: NSData                 &lt;br /&gt;QGuy: huh? how is that related to memory-mapping a file?                 &lt;br /&gt;AMan: NSData has initializers that let you create one by memory-mapping a file             &lt;/tt&gt; &lt;/blockquote&gt;Good question:         &lt;blockquote&gt; &lt;tt&gt; &lt;br /&gt;QGuy: how can I memory-map a file using Cocoa?                 &lt;br /&gt;AMan: NSData                 &lt;br /&gt;QGuy: &lt;reads docs,="" finds="" method="" nsdata="" right="" the=""&gt; got it, thanks!             &lt;/reads&gt;&lt;/tt&gt; &lt;/blockquote&gt;If the other person's answer really was correct, then you gain a  lot of time if you started with the assumption that it was. If you  assume it's wrong, you'll either have to wait for the other person to  correct you, or if you're unlucky he won't even bother and you won't  have an answer. Even if the answer is wrong, you're more likely to get a  correct answer if you're gentle when pointing out the wrongness.         &lt;br /&gt;Having your solutions get rejected by the person asking the  question is frustrating. Frustrated people are less likely to answer  your questions. Be good to them, and they'll be good to you.         &lt;br /&gt;&lt;b&gt;Note for mailing lists:&lt;/b&gt; unlike ephemeral media like IRC, mailing  lists are typically archived and searchable. When you find a solution,  post it! That way, when you forget about how you did this months later  and search the list for an answer, you can see how you actually solved  it before.     &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Questions, comments, other feedback? E-mail &lt;a href="mailto:mike@mikeash.com"&gt;the author&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/8699384813664411939-5955380918129348365?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5955380918129348365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2011/09/getting-answers-copy-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5955380918129348365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5955380918129348365'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2011/09/getting-answers-copy-of.html' title='Getting Answers [Copy of http://www.mikeash.com/getting_answers.html ]'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2850494945980670783</id><published>2010-08-29T19:33:00.001-07:00</published><updated>2010-08-29T20:54:06.746-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone 3GS'/><category scheme='http://www.blogger.com/atom/ns#' term='article'/><title type='text'>Understand iTunes Verification Server By iGuru</title><content type='html'>Understanding the iTunes verification server&lt;br /&gt;By iGuru - Version 1.1 - 26th September 2009&lt;br /&gt;Visit http://www.macdotnub.co.cc/articles/ for the latest version.&lt;br /&gt;Dedicated to: Jay Freeman (Saurik), semaphore and Apple.&lt;br /&gt;Background:&lt;br /&gt;With the introduction of the iPhone 3G[S] (3GS, not 3G) Apple introduced a new feature - restore verification.&lt;br /&gt;This process relies on specific data that is unique to each phone, including the iPhone 3G[S]’ ECID, a new ID that is unique to every phone produced.&lt;br /&gt;How the verification process works:&lt;br /&gt;Essentially, when you attempt to restore the iPhone using iTunes, a specific file called a Property List (plist - A specific XML file format that Apple Computer &amp;amp; GNUstep, formerly known as NeXT created) is generated, and a challenge/response protocol is initiated between the iPhone and Apple, during which a partial digest is sent to Apple. The server then decides if they are going to sign it, and sends back the response.&lt;br /&gt;The Request:&lt;br /&gt;This plist file contains 20 requests for specific information listed below, which is then sent to Apple’s verification server.&lt;br /&gt;- AppleLogo, BatteryCharging, BatteryCharging0, BatteryCharging1, BatteryFull, BatteryLow0, BatteryLow1, BatteryPlugin, NeedService, RecoveryMode, RestoreLogo - all of which are images in the img3 format.&lt;br /&gt;- DeviceTree (The Device Tree for your iPhone)&lt;br /&gt;- KernelCache (The Kernel Cache for your iPhone)&lt;br /&gt;- LLB (The Low Level Bootloader, this runs several setup routines, and checks the signature of iBoot before loading it)&lt;br /&gt;- RestoreDeviceTree (The Device Tree used when restoring the iPhone)&lt;br /&gt;- RestoreKernelCache (The Kernel Cache used when restoring your iPhone)&lt;br /&gt;- RestoreRamDisk (The RAM Disk used when restoring your iPhone)&lt;br /&gt;- iBEC (A stripped down version of iBoot, which is used when performing a restore from a Fake DFU mode via the LLB)&lt;br /&gt;- iBSS (A stripped down version of iBoot, missing things such as interfacing with the filesystem - used to bootstrap iBEC during a DFU restore)&lt;br /&gt;- iBoot (The iPhone Stage 2 Bootloader)&lt;br /&gt;All each of these requests are contained in the plist along with a Digest, Partial Digest and Trusted key value, along with a file path string.&lt;br /&gt;Page 2&lt;br /&gt;All files other than KernelCache, RestoreDeviceTree, RestoreKernelCache, RestoreLogo, RestoreRamDisk, iBEC, and iBBS also contain the key IsFirmwarePayload.&lt;br /&gt;The plist request also contains the following information:&lt;br /&gt;- HostIpAddress (The IP address of your computer)&lt;br /&gt;- HostPlatformInfo (darwin or windows)&lt;br /&gt;- Locality (e.g. en_GB)&lt;br /&gt;- VersionInfo (With a value of 3.8)&lt;br /&gt;- ApBoardID (The ID of the board contained in your phone)&lt;br /&gt;- ApChipID (The ID of a chip contained in your phone)&lt;br /&gt;- ApECID (A number generated from the ECID, a unique ID for each phone manufactured)&lt;br /&gt;- ApProductionMode (With a value of true or false)&lt;br /&gt;- ApSecurityDoman (With a value of 1)&lt;br /&gt;The Response:&lt;br /&gt;The iTunes verification server takes the request plist sent to it, and verifies it, if it contains a request for a version of the iPhone OS that they are currently signing, the status will be 0, a message will be sent back saying SUCCESS, and the request string will contain a plist with the data required for the restore, after which and verification will pass.&lt;br /&gt;If however, Apple is no longer signing requests for that OS version the server will return status 94, and the message “This device isn't eligible for the requested build.”, no plist response will be sent back and iTunes will then display the error message “The iPhone "iPhone" could not be restored. This device isn't eligible for the requested build.” Assuming you are trying to restore from DFU or Recovery mode.&lt;br /&gt;If the plist is returned successfully, it will contain the 20 responses to the requests listed above in a slightly different format, containing the data response blob, along with a partial digest key, and the file path.&lt;br /&gt;Conclusion:&lt;br /&gt;Apple, what can I say? You put so much effort into designing a system to stop people from downgrading the firmware with these new devices, yet it can be defeated by a simple man in the middle attack (see further reading for details).&lt;br /&gt;Further Reading:&lt;br /&gt;Caching Apple's Signature Server, by Jay Freeman (Saurik) - http://www.saurik.com/id/12&lt;br /&gt;How to setup a local iTunes restore verification server, by iGuru - http://bit.ly/JnDw2&lt;br /&gt;Credits:&lt;br /&gt;Jay Freeman (Saurik), for the first working unofficial restore verification server.&lt;br /&gt;semaphore, for the first local iTunes restore verification software (Umbrella &amp;amp; TinyTTS).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2850494945980670783?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2850494945980670783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2010/08/understand-itunes-verification-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2850494945980670783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2850494945980670783'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2010/08/understand-itunes-verification-server.html' title='Understand iTunes Verification Server By iGuru'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4307523956835997628</id><published>2010-08-29T12:34:00.001-07:00</published><updated>2010-08-29T12:34:45.434-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone 3GS'/><title type='text'>iPhone 3GS : At last I got it !!! Phase First</title><content type='html'>Hahahah&lt;br /&gt;Its good to have iPhone but if you are not a tech savvy. I personal you are not going to enjoy its real thing.&lt;br /&gt;It will teach you take mess with your device, making you brave to play with things and more ever when they are blind. That actually multiplies the fun.&lt;br /&gt;But if you can't take it all, then This device is not for you. Don't get offended by it. Its all my personal. When I was not having I was not paying attention at all.&lt;br /&gt;But iPhone only can make lots of change in you, will make you tech savvy, if you are not sitting with your computer you will start sitting. If you don't read over internet you will start reading lots of documentation.&lt;br /&gt;If you don't know how yo search differently on the google. This Device will make you learn that too.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_uUnuAveok-M/THmatNobHKI/AAAAAAAAE3I/NzQLy2dyWgo/s1600/apple-iphone-3gs-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_uUnuAveok-M/THmatNobHKI/AAAAAAAAE3I/NzQLy2dyWgo/s320/apple-iphone-3gs-2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Well com to the point, its a 3GS which have been updated to the iOS 4&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now I am on this recovery screen&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;if you are unaware here is the pic for your reference(click to enlarge) &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_uUnuAveok-M/THmdxk-SuiI/AAAAAAAAE3Q/acS9rpcWmPw/s1600/iPhoneRecovery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_uUnuAveok-M/THmdxk-SuiI/AAAAAAAAE3Q/acS9rpcWmPw/s200/iPhoneRecovery.png" width="133" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now I want my iP (iPhone) such a way I can use it anywhere in the world and easy on my pocket LOLZ, want jail break it, so that I can trial application without restriction.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Foe that I m trying to restore it with the Custom IPSW (iPhone SoftWare).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;iPhone2,1_4.0_8A293_Custom_Restore_Activated.ipsw&lt;/b&gt;&lt;/div&gt;But unfortunately this is giving the error 1604&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_uUnuAveok-M/THme3yDv2rI/AAAAAAAAE3Y/c6ZV5QdAfHg/s1600/error-1604.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_uUnuAveok-M/THme3yDv2rI/AAAAAAAAE3Y/c6ZV5QdAfHg/s320/error-1604.JPG" /&gt;&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/8699384813664411939-4307523956835997628?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4307523956835997628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2010/08/iphone-3gs-at-last-i-got-it-phase-first.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4307523956835997628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4307523956835997628'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2010/08/iphone-3gs-at-last-i-got-it-phase-first.html' title='iPhone 3GS : At last I got it !!! Phase First'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uUnuAveok-M/THmatNobHKI/AAAAAAAAE3I/NzQLy2dyWgo/s72-c/apple-iphone-3gs-2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-8499395076519671751</id><published>2009-10-15T23:56:00.001-07:00</published><updated>2009-10-15T23:58:27.191-07:00</updated><title type='text'>Project WM Upgrade: chapter 3 : Know the name</title><content type='html'>&lt;h3&gt;&lt;span style="font-size:180%;"&gt;Chapter 3 : Know the name&lt;/span&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Technical Terms and Jargon&lt;/h3&gt; &lt;h4&gt;&lt;a name="tj_rom" id="tj_rom"&gt;&lt;/a&gt;ROM&lt;/h4&gt; &lt;ul&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;IPL&lt;/b&gt;: Initial program load - usually paired with Secondary Program Load (SPL), is the boot loader of your phone, much like the BIOS is the boot loader for your PC. Note: IPL/SPL are highly hardware dependent, flashing the wrong IPL/SPL is much more serious than a flashing the wrong ROM. It may be noted that, sometimes a ROM package also contains the IPL/SPL which will be flashed into your phone. Hence be extra careful what you are flashing. Note: although a ROM may also contains the IPL/SPL, `ROM` usually refers just to the OS (eg. the Windows Mobile 5, not the IPL/SPL) and the ExtRom.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;SPL&lt;/b&gt;: Refer to `IPL`&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;ROM&lt;/b&gt;: Read Only Memory - commonly used in the form of `ROM upgrade`. The ROM is the firmware/software, which controls everything on your phone. ROM itself usually comes in a package, with IPL/SPL, OS, Radio, and ExtRom. However, in most cases, `upgrading a ROM` usually means just the OS and the ExtRom, as these are the obvious/visible part of an ROM upgrade.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;OS&lt;/b&gt;: Operating System - the platform software for your phone, much like the Windows Xp for your PC. Upgrading the OS is like, in PC terms upgrading from Windows 95 to Windows XP.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;ExtROM&lt;/b&gt;: Extended ROM - is the section of the ROM which the distributor of the phone (eg O2, T-Mobile, iMate, etc) store their customization (eg Today theme, ring tones, extra software) data. In WM5, the customization data will be automatically installed after the initial configuration (after every hardreset), just after the security section. In most cases, ExtROM can be unlocked to allow users to store/build their own customizations that will be automatically installed upon every hardreset.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;CID&lt;/b&gt;: Carrier Id - commonly used in the form `CID-Unlocking`. If you purchase your phone (example) from Qtek (Qtek is the 'carrier'), your phone will only accept Qtek ROMs (the carrier's ROMs). If you want to flash ROMs from other carrier, you'll need to CID-unlock your phone, so that your phone will accept other ROMs. Note: In general, the phrase 'unlock your phone' usually refers to SIM-unlock, not CID unlock.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;Radio&lt;/b&gt;: Also referred as GSM (see below) - commonly used in the form `upgrading the Radio/GSM` - in the field of ROM upgrading. The `Radio` is essentially a ROM that controls the phone function part (as oppose to PDA function part) of your phone. Upgrading this `Radio` software may have effect on your phone reception quality, battery life (optimized phone function), signal strength, etc.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;GSM&lt;/b&gt;: A system of mobile radio communications. Most common 2G standard. Often used on xda-developers somewhat confusingly to refer to the radio protocol stack or `Radio` in XDA devices. This is slightly misleading as 3G HTC phones use a W-CDMA stack for the 3G communications, and GSM for 2G.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;Protocol&lt;/b&gt;: Similar to `Radio`. Both terms refer to the radio protocol stack, which is the software which handles communications with the mobile network.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;SIM&lt;/b&gt;: Subscriber Identity Module - commonly used in the form `SIM unlock`. Some phones are locked to the specific telco from which you purchase your phone, eg you can't use a locked O2 phone using a Vodaphone SIM/smart card. To use SIM card from other telco, you need to SIM unlock your phone. Note: In general, the phrase 'unlock your phone' usually refers to SIM-unlock, not CID unlock.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;AKU&lt;/b&gt;: Adaptation Kit Update - Starting with Windows Mobile 5 Microsoft began a policy of updates similar to that of the desktop windows. Rather the replacing the whole OS some functionality may be added. For example AKU 2.0 introduced push mail. These updates are distributed through the OEMs and are given to the consumer in form of ROM updates. Note that OEM may choose not to create an update with the latest AKU for their devices. Getting an AKU for your phone is like getting the SP2 (Service Pack 2) for your Windows Xp.&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;&lt;a name="tj_wm5" id="tj_wm5"&gt;&lt;/a&gt;Windows Mobile 5 (WM5)&lt;/h4&gt; &lt;ul&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;Storage memory&lt;/b&gt;: The persistent memory part of WM5, where all the files and documents are kept, much like the hard disk of your PC. Data in the storage memory is unaffected by soft-reset or a flat battery. You can't adjust the ratio of Storage memory and Program memory in WM5 like WinCE2003.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;Program memory&lt;/b&gt;: The non-persistent memory part of WM5, which is used for all the temporary memory requirements, much like the RAM of your PC. A soft-reset or flat battery will erase everything from the program memory. You can't adjust the ratio of Storage memory and Program memory in WM5 like WinCE2003.&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;&lt;a name="tj_unlocking" id="tj_unlocking"&gt;&lt;/a&gt;Unlocking&lt;/h4&gt; &lt;ul&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;SIM Unlock&lt;/b&gt;: Use any carrier's SIM in the device.&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;&lt;b&gt;CID Unlock&lt;/b&gt;: Load any carrier ROM (in any language) on the device.&lt;/li&gt;&lt;li class="tightenable top"&gt;&lt;b&gt;Application Unlock&lt;/b&gt;: Most WM5 phones only allow you to load applications that have an acceptable digital signature. If you try to edit the registry or load an application it will give you an error. Application Unlocking removes this barrier and allows you to install any application or edit the registry to your liking.&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/8699384813664411939-8499395076519671751?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/8499395076519671751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/10/project-wm-upgrade-chapter-3-know-name.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8499395076519671751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8499395076519671751'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/10/project-wm-upgrade-chapter-3-know-name.html' title='Project WM Upgrade: chapter 3 : Know the name'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1637268354512587728</id><published>2009-10-13T03:05:00.001-07:00</published><updated>2009-10-13T12:14:48.886-07:00</updated><title type='text'>Project : WM upgrade  Get some Down. Load some guns</title><content type='html'>&lt;span style="font-weight: bold;font-size:180%;" &gt;Project : WM upgrade chapter 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Get some Down. Load some guns&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;h4&gt;Files you need to Dump ROM (Windows only)&lt;/h4&gt; &lt;ul&gt;&lt;li class="tightenable bottom"&gt;&lt;p class="tightenable top bottom"&gt;Various Tools&lt;/p&gt; &lt;ul&gt;&lt;li class="tightenable top bottom"&gt;If you have an Elf: &lt;b&gt;&lt;a href="http://rapidshare.de/files/40314466/ELF_TOOLS.zip.html" class="namedurl"&gt;&lt;span style="white-space: nowrap;"&gt;&lt;img src="http://wiki.xda-developers.com/themes/default/images/http.png" alt="" class="linkicon" border="0" /&gt;(Download)&lt;/span&gt;&lt;/a&gt; &lt;a href="http://www.mediafire.com/?gcx3mvxdm3t" class="namedurl"&gt;&lt;span style="white-space: nowrap;"&gt;&lt;img src="http://wiki.xda-developers.com/themes/default/images/http.png" alt="" class="linkicon" border="0" /&gt;(Alternate&lt;/span&gt; Link)&lt;/a&gt; (51MB)&lt;/b&gt;&lt;/li&gt;&lt;li class="tightenable top bottom"&gt;If you have an Elfin: &lt;b&gt;&lt;a href="http://rapidshare.de/files/40314469/ELFIN_TOOLS.zip.html" class="namedurl"&gt;&lt;span style="white-space: nowrap;"&gt;&lt;img src="http://wiki.xda-developers.com/themes/default/images/http.png" alt="" class="linkicon" border="0" /&gt;(Download)&lt;/span&gt;&lt;/a&gt; &lt;a href="http://www.mediafire.com/?bb2zum1rivj" class="namedurl"&gt;&lt;span style="white-space: nowrap;"&gt;&lt;img src="http://wiki.xda-developers.com/themes/default/images/http.png" alt="" class="linkicon" border="0" /&gt;(Alternate&lt;/span&gt; Link)&lt;/a&gt; (58MB)&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li class="tightenable top"&gt;Automatic device backup creator: &lt;b&gt;&lt;a href="http://rapidshare.de/files/40420361/run.zip.html" class="namedurl"&gt;&lt;span style="white-space: nowrap;"&gt;&lt;img src="http://wiki.xda-developers.com/themes/default/images/http.png" alt="" class="linkicon" border="0" /&gt;(Download)&lt;/span&gt;&lt;/a&gt; &lt;a href="http://www.mediafire.com/?yud0yynyzsz" class="namedurl"&gt;&lt;span style="white-space: nowrap;"&gt;&lt;img src="http://wiki.xda-developers.com/themes/default/images/http.png" alt="" class="linkicon" border="0" /&gt;(Alternate&lt;/span&gt; Link)&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;Well actually we are done and fine with the, download and the read me's ...&lt;br /&gt;But my device is on faulty side, as this problem is persisting form quite long, i didn't care about it because i was never syncing my phone with PC.&lt;br /&gt;But this time it need to stay with the PC for quite long.&lt;br /&gt;And my PC or the USB cable is not bearing that, and getting disconnected again and again.&lt;br /&gt;So for today I am not able to manage the prerequisite of flashing the My device.&lt;br /&gt;&lt;br /&gt;Chapter 2 continues ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1637268354512587728?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1637268354512587728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/10/project-wm-upgrade-get-some-down-load.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1637268354512587728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1637268354512587728'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/10/project-wm-upgrade-get-some-down-load.html' title='Project : WM upgrade  Get some Down. Load some guns'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-591196900439869535</id><published>2009-10-12T10:15:00.000-07:00</published><updated>2009-10-12T10:50:12.319-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project:WM-upgrade'/><title type='text'>Project : WM upgrade chapter 1</title><content type='html'>&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Project : WM upgrade &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;chapter 1&lt;/span&gt; : &lt;span style="font-weight: bold; font-style: italic;"&gt;Gettting Identity&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;This Chaper is all about, how to get the basic info about your device&lt;/span&gt;&lt;br /&gt;Hey after long time again I m coming back with the Project which is basically to upgrade my HTC Touch ( also known as Elf)&lt;br /&gt;from &lt;span style="font-weight: bold;"&gt;6.0 to 6.1&lt;/span&gt;&lt;br /&gt;This is again a new tech act, which will help me to learn something more in tachnical aspect.&lt;br /&gt;&lt;br /&gt;You can't do any upgrade, any flash related task until you are having some very basic information about your device like as follows&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;HTC Touch device information&lt;br /&gt; &lt;br /&gt;Touch version   : Elf&lt;br /&gt;Device ID       : ELF010000&lt;br /&gt;CID             : DOPOD001&lt;br /&gt;IPL             : 1.11.0002&lt;br /&gt;SPL             : 1.11.0000&lt;br /&gt;ROM Version     : 1.11.720.1B&lt;br /&gt;ExtROM Version  : 1.11.720.101&lt;br /&gt;Operator Version: None&lt;br /&gt;AKU Version     : 0.2.3&lt;br /&gt;Page Pool       : 8 MB&lt;br /&gt;RAM Size        : 64 MB&lt;br /&gt;ROM Size        : 128 MB&lt;br /&gt;Model No.       : ELF0101&lt;br /&gt;Part Number     : 99HDM035-00&lt;br /&gt;SIM Unlock Code : 11918830&lt;br /&gt;&lt;br /&gt;MCC+MNC:&lt;br /&gt;00101F  40410F  40492F  40440F  40431F  40490F  40498F  40449F  40445F  40494F  40495F  40402F  40496F  40497F  40554F  40470F  40493F  40551F  40403F  40552F  40453F  40556F  40416F  40555F                                             &lt;br /&gt;&lt;br /&gt;IMEI (private)         : XXXXXXXXXXXXXXXXXX*&lt;br /&gt;Serial Number (private):HT XXXXXXXXXXX*&lt;br /&gt;MAC Address (private)  : XXXXXXXXXXX*&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;* is the mask of original values&lt;/span&gt;&lt;/blockquote&gt;For the above mentioned task, you just need to download the following file, which is the pack of all tools, its in rar format(how to open, google it)&lt;br /&gt;Here is the file (Hosted on esnips.com):&lt;span style="font-weight: bold;"&gt; &lt;a href="http://www.esnips.com/doc/05bb14c4-a451-4b41-a318-ab3c611d309d/1-device_info"&gt;Click here to download&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;download and unpack the file&lt;/li&gt;&lt;li&gt;connect the your Windows Mobile to the USB port&lt;/li&gt;&lt;li&gt;let Active Sync show the status connected.&lt;/li&gt;&lt;li&gt;go to the device_info folder&lt;/li&gt;&lt;li&gt;run the &lt;span style="font-style: italic;"&gt;device_info.bat &lt;/span&gt;Batch file&lt;/li&gt;&lt;li&gt;follow the onscreen instruction.&lt;/li&gt;&lt;li&gt;when everything is done, open the device_info.txt file in the dir.&lt;/li&gt;&lt;li&gt;it is having all the info &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-591196900439869535?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/591196900439869535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/10/project-wm-upgrade-chapter-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/591196900439869535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/591196900439869535'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/10/project-wm-upgrade-chapter-1.html' title='Project : WM upgrade chapter 1'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-111066863568323222</id><published>2009-03-17T07:21:00.000-07:00</published><updated>2009-03-17T07:33:12.833-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod_touch'/><category scheme='http://www.blogger.com/atom/ns#' term='JailBreaking'/><title type='text'>At last 2.2.1 is jailBroken..</title><content type='html'>I m still amazed, that how it happened..&lt;br /&gt;Why earlier i was not able to jail break the 2.2.1(5h11).&lt;br /&gt;&lt;br /&gt;What was different when I was jail Breaking it last time.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I was on vista&lt;/li&gt;&lt;li&gt;I had installed some of the free Apps from iTunes..&lt;/li&gt;&lt;/ul&gt;So if you people are having the problem, in jail breaking, ans try to follow these two steps also&lt;br /&gt;May be you will be lucky like me.&lt;br /&gt;This jail Breaking took, my lots of study time and official time..&lt;br /&gt;It cost me more then $9.95 :)&lt;br /&gt;But anyway I had learnt   a lot&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-111066863568323222?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/111066863568323222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/03/at-last-221-is-jailbroken.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/111066863568323222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/111066863568323222'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/03/at-last-221-is-jailbroken.html' title='At last 2.2.1 is jailBroken..'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-3026557327216864680</id><published>2009-03-13T16:18:00.000-07:00</published><updated>2009-03-15T13:05:54.082-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod_touch'/><category scheme='http://www.blogger.com/atom/ns#' term='JailBreaking'/><title type='text'>have iPod 2.2.1 And Pwnage Tool</title><content type='html'>&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt; see what the best Pwnage tool can do for us &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-weight: bold; white-space: pre;font-size:18;"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="white-space: pre;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Ok So on the Mac..&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="white-space: pre;font-family:'times new roman';font-size:18;"&gt;&lt;span style="font-size:100%;"&gt;Pwnage  tool is failed. It is not at all taking,&lt;br /&gt;I m running it, then at the place where it was for the .ipsw file, and we are providing it the same&lt;br /&gt;file as we used in process of upgrade the iPod, but it is telling the wrong firmware selected.&lt;br /&gt;For which firmware it is looking for..&lt;br /&gt;this is the next question.&lt;br /&gt;&lt;br /&gt;Be sure none of the tool on the Win, was able to JB the touch 1g 2.2.1...&lt;br /&gt;there was a hope that winPwn will do it as it works like a charm, with the Firmware it supports..&lt;br /&gt;its latest beta version 2.2.5, supports 2.0,2.0.1 and 2.0.2&lt;br /&gt;I have checked its bundle and all structures but didnt get I though i will add the 2.2.1 by myself  but &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="white-space: pre;font-family:'times new roman';font-size:18;"&gt;&lt;span style="font-size:100%;"&gt;bit more study is needed to understand its structure.&lt;br /&gt;&lt;br /&gt;Anyway I got that way out but that is not with the pwnageTool, it is with QuickPwn 2.2.1 for &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="white-space: pre;font-family:'times new roman';font-size:18;"&gt;&lt;span style="font-size:100%;"&gt;windows. if you have iPod touch which of 1g, then QucikPwn2.2.1 is the best tool for you..&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-3026557327216864680?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/3026557327216864680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/03/have-ipod-221-and-pwnage-tool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/3026557327216864680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/3026557327216864680'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/03/have-ipod-221-and-pwnage-tool.html' title='have iPod 2.2.1 And Pwnage Tool'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-811386374726711472</id><published>2009-03-11T12:51:00.000-07:00</published><updated>2009-03-13T08:20:32.357-07:00</updated><title type='text'>Sarat's iPod : Upgrade from 1.1.4 to 2.2.1 and JailBreak</title><content type='html'>This was seems less tedious task, as it is &lt;div&gt;I thought putting just few hours will be enough (Frankly speaking)&lt;/div&gt;&lt;div&gt;But it does not seem like that ..&lt;/div&gt;&lt;div&gt;Competibility issues of FW(FirmWare), with the tools&lt;/div&gt;&lt;div&gt;Now, I have alomost every tools available for Mac and Windows, on  my Mac and PC desktop.&lt;/div&gt;&lt;div&gt;right now  5 to 6 restore IPSWs&lt;/div&gt;&lt;div&gt;:)&lt;/div&gt;&lt;div&gt;I have used latest version of Pwnage tool, QuickPwn(Mac) and QuickPwn(win), date is 11th March 2009.&lt;/div&gt;&lt;div&gt;Now just got QuickPwn 2.0 from my Brother, which is old and should support the FW 1.1.4.&lt;/div&gt;&lt;div&gt;Lets See ....&lt;/div&gt;&lt;div&gt;Sad as i opened the app, it was the same..&lt;/div&gt;&lt;div&gt;now looking over the the net if i see earlier version of QuickPwn :|&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using the WinPwn 2.5 Beta&lt;/div&gt;&lt;div&gt;After an hour or more after writing the above line, nothing happened, absolutely NOTHING...&lt;br /&gt;at last I m feeling that neither any restore nor any tool will, until I m upgrading to FW 2.0, TTF (Thats The F*CK) it is not available.. at least I can say no direct link, no RapidShare link, NO weblink.. I m able to find to find on the torrent only, and in the torrent also it is almost dying stage. I have added 4 diffrent torrents, one is now working good....&lt;br /&gt;SO it shows this file is critical...&lt;br /&gt;finished above para 6:00 AM 12 March 2009..&lt;br /&gt;Waiting for the FW 2.0 to get download ... Lets see That is working or not, if that is not working I will must say that One should give $9.95 to apple and purchase the update...&lt;br /&gt;If I m successfull, I will say your many many hours of work, As I m going to hit 10th hours or working on the same issue...&lt;br /&gt;&lt;br /&gt;1:12 PM 12 March 09&lt;br /&gt;Volia.... I got FW 2.0 on the ipod touch...&lt;br /&gt;aaaah at last ...ufffff&lt;br /&gt;this was the problem...&lt;br /&gt;So guys if you are on 1.1.4 FirmaWare and want to upgrade on 2.x.x or want to come to the series 2.o, you need 2.0 FW ( As it is paid ) hahhaha&lt;br /&gt;Anyways&lt;br /&gt;Now I m on FW 2.0..&lt;br /&gt;getting ready for 2.2.1 hahahhah...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4:01 PM&lt;br /&gt;ahhh but great apps are not taking 2.0&lt;/div&gt;&lt;div&gt;but that is not an issue i have offcial 2.2.1 updates i will take them&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4:37 PM 12 March 2009&lt;/div&gt;&lt;div&gt;After having the FW 2.0, I cant update with IPSW 2.2.1, reason is still unknown, but not so long.&lt;/div&gt;&lt;div&gt;The final plan is to have update through iTune.. hehehee...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3:24 AM 13 March 2009&lt;br /&gt;The myth about the iPod generation cleared completly.. I guess, Now I have all the FirmWare for iPod touch 1G,&lt;br /&gt;Again I restored iPod Touch with FW 2.0..&lt;br /&gt;Now going to upgrade to 2.0.1 Let see if that is successfull..&lt;br /&gt;Waiting for my IBM Thinkpad to reboot, I have all the FirmWare in that :)&lt;br /&gt;&lt;br /&gt;3:33 AM 13 MAR 09&lt;br /&gt;I have 2.o on my iPod very much.&lt;br /&gt;I have 2 way to upgrade it till 2.2.1, either via iTunes or manual.&lt;br /&gt;iTunes is again on network dependent as it does not store the partial downloads.&lt;br /&gt;I m again and again getting the network error.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4:30 AM Mar 09&lt;br /&gt;Updating to  FW 2.0.2,&lt;br /&gt;Lets see what is waiting for me...&lt;br /&gt;YAHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&lt;br /&gt;We did it again, hahahhahaaaa&lt;br /&gt;&lt;br /&gt;4:33 AM Mar 09&lt;br /&gt;Now Heading to update with 2.2.1 5h11 THE LATEST UPDATE ....&lt;br /&gt;Let see what is the next...&lt;br /&gt;4:36 updating now ... Clenched my teeth together...&lt;br /&gt;WOW ... revolving Gear is changed as a rounded Progress Bar...&lt;br /&gt;4:39 Verifying the updated software..&lt;br /&gt;I guess we are going to hit again...&lt;br /&gt;But still we have not got through.. :)&lt;br /&gt;oye lucky, lucky oye&lt;br /&gt;we are super duper hit, paape.. :) :D&lt;br /&gt;&lt;br /&gt;Now the Risky part comes, Pwning the iPod touch...&lt;br /&gt;&lt;br /&gt;At last iPod is jailBroken...&lt;br /&gt;It was a tedious Job any...&lt;br /&gt;It is having 2.2.1 and jailbroken, but not yet ready for Mobile installation.&lt;br /&gt;Let a mobile installation another post... ;)&lt;br /&gt;At last but not the least, many many thanks to Sarat for providing his iPod Touch...&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/8699384813664411939-811386374726711472?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/811386374726711472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/03/sarat-ipod-upgrade-from-114-to-221-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/811386374726711472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/811386374726711472'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/03/sarat-ipod-upgrade-from-114-to-221-and.html' title='Sarat&amp;#39;s iPod : Upgrade from 1.1.4 to 2.2.1 and JailBreak'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-7964566094131565373</id><published>2009-03-10T16:58:00.000-07:00</published><updated>2009-03-13T08:20:32.400-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>FIrst Attempt to JailBreak iPod touch</title><content type='html'>Here was a task to Jailbreak the iPod touch having FW 1.1.4&lt;br /&gt;The very first attempt was failed&lt;br /&gt;I need to restore the FW with the same version 1.1.4..&lt;br /&gt;Right now downloading the FW 2.2.1&lt;br /&gt;Pwnage tool was failed to jailbreak it although it was the latest version..&lt;br /&gt;Now looking for QuickPwn's latest version.&lt;br /&gt;Let see what happens..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-7964566094131565373?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/7964566094131565373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/03/first-attempt-to-jailbreak-ipod-touch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7964566094131565373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7964566094131565373'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/03/first-attempt-to-jailbreak-ipod-touch.html' title='FIrst Attempt to JailBreak iPod touch'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-3300475651587540851</id><published>2009-03-04T06:28:00.000-08:00</published><updated>2009-03-13T08:20:32.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>here is How to get cracked iPA's on iPhone/iPod Touch</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 12px; line-height: 15px; "&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red; "&gt;&lt;span style="font-size: 18px; line-height: normal; "&gt;After you have jailbroken your ipod touch 2.x what you wanna do is&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;1.Log into WinSCP (windows) or Cyberduck (Mac) &lt;br /&gt;If you don't know how to do this -&lt;table width="90%" cellspacing="1" cellpadding="3" border="0" align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="font: normal normal normal 12px/normal Verdana, Arial, Helvetica, sans-serif; "&gt;&lt;span class="genmed" style="font-size: 11px; "&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="code" style="font: normal normal normal 12px/normal Verdana, Arial, Helvetica, sans-serif; font-family: Courier, 'Courier New', Verdana, Arial; color: rgb(70, 85, 132); background-color: rgb(250, 252, 254); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; border-top-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); border-left-color: rgb(0, 0, 0); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; width: 98%; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; "&gt;http://www.youtube.com/watch?v=YtfjDHfqXWQ&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;2.Create a folder called Documents in &lt;span style="text-decoration: underline; "&gt;/var/mobile/&lt;/span&gt; and set permission to &lt;span style="text-decoration: underline; "&gt;777&lt;/span&gt;. &lt;br /&gt;3.Create a folder called Documents in the &lt;span style="text-decoration: underline; "&gt;/Applications&lt;/span&gt; folder and set permissions to &lt;span style="text-decoration: underline; "&gt;777&lt;/span&gt;. &lt;br /&gt;4.Now go to root &lt;span style="text-decoration: underline; "&gt;/System/Library/PrivateFrameworks/Mobile Installation.framework&lt;/span&gt; &lt;br /&gt;5.Replace the MobileInstallation file and set the permissions 775 for the file &lt;br /&gt;6.Reboot your iPhone/iPod Touch-IMPORTANT! &lt;br /&gt;7.Download cracked Games and Apps. &lt;br /&gt;8.Download at least one App from t he App Store(Free or Paid) &lt;br /&gt;IMPORTANT: Otherwise you will get an error! (Only need to do this once] &lt;br /&gt;9.Double click on the cracked .ipa you downloaded, and iTunes Should Open And Then Just Sync your iPhone/iPod Touch and enjoy! &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; "&gt;&lt;span style="text-decoration: underline; "&gt;&lt;span style="color: blue; "&gt;You Set Permission by right clicking and choosing properties, you wont miss it&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-size: 18px; line-height: normal; "&gt;&lt;span style="color: red; "&gt;&lt;span style="text-decoration: underline; "&gt;HERE IS THE MOBILEINSTALLATION FILE:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;table width="90%" cellspacing="1" cellpadding="3" border="0" align="center"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="font: normal normal normal 12px/normal Verdana, Arial, Helvetica, sans-serif; "&gt;&lt;span class="genmed" style="font-size: 11px; "&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="code" style="font: normal normal normal 12px/normal Verdana, Arial, Helvetica, sans-serif; font-family: Courier, 'Courier New', Verdana, Arial; color: rgb(70, 85, 132); background-color: rgb(250, 252, 254); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; border-top-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); border-left-color: rgb(0, 0, 0); padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; width: 98%; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; "&gt;http://rapidshare.com/files/148053500/MobileInstallation.rar&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Enjoy &lt;img src="http://img5.warez-bb.org/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-color: initial; " /&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-3300475651587540851?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/3300475651587540851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/03/here-is-how-to-get-cracked-ipa-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/3300475651587540851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/3300475651587540851'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/03/here-is-how-to-get-cracked-ipa-on.html' title='here is How to get cracked iPA&amp;#39;s on iPhone/iPod Touch'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2472939785780736904</id><published>2009-03-01T23:20:00.000-08:00</published><updated>2009-03-13T08:20:32.479-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>Install cracked ipa's using iTunes</title><content type='html'>Install cracked ipa's using iTunes. Change your Mobile Installation File without computer support. &lt;br /&gt;&lt;br /&gt;1. Go to your pawned iPhone, open Cydia.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Go to Manage and choose Sources&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Press the Edit Button and then the Add button&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. Add the following sources:&lt;br /&gt;&lt;br /&gt;4.1. OpenSSH:&lt;br /&gt;Code:&lt;br /&gt;http://apt.saurik.com/&lt;br /&gt;Don't need to add this one, it's already installed by default, just search for the app.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.2. Erica Utilities: www.ModMyi.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.3. Mobile Instalation File: http://iphone.org.hk/apt/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The installation has to be made the way above, leave Mobile Installation file for last. &lt;br /&gt;&lt;br /&gt;Restart the iPhone and install first a legit app, download a free app from the appstore [VERY IMPORTANT STEPS] and it's done! Now you can install any cracked ipa using iTunes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2472939785780736904?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2472939785780736904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/03/install-cracked-ipa-using-itunes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2472939785780736904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2472939785780736904'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/03/install-cracked-ipa-using-itunes.html' title='Install cracked ipa&amp;#39;s using iTunes'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5242857580418198983</id><published>2009-02-07T07:00:00.000-08:00</published><updated>2009-03-13T08:20:32.509-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Crack'/><title type='text'>CRACKULOUS v.9</title><content type='html'>SaladFork make Crackulous. People use Crackulous. Angel Take over. Crackulous good. We release Crackulous today.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CRACKULOUS v.9&lt;br /&gt;We at Hackulous have decided to open up the beta version of Crackulous for the entire community. If you haven't already heard about Crackulous, it's an amazing application dedicated to the iPhone community to cracking apps. Crackulous was first started by SaladFork, and now the application is being developed by Angel. We've decided to release Crackulous v.9 as an Open Beta, so anyone can try it out!&lt;br /&gt;&lt;br /&gt;Features:&lt;br /&gt;&lt;br /&gt;   * Full GUI version of xCrack! No Complications!&lt;br /&gt;   * Crack Applications from the App Store! Share them with the community!&lt;br /&gt;   * The ONLY Application of its kind!&lt;br /&gt;   * The most POWERFUL and EASIEST to use application!&lt;br /&gt;   * Crack multiple apps at one time!&lt;br /&gt;   * It's free! Why would we charge?&lt;br /&gt;&lt;br /&gt;Read more at: What is Crackulous?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So where do we get it? From the Hackulous Cydia Repo of course!&lt;br /&gt;http://cydia.hackulo.us&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Known Bugs (Major):&lt;br /&gt;&lt;br /&gt;   * You must have at least one legitimate app from the App Store&lt;br /&gt;   * If any of your apps begin with a #, Crackulous will crash (Bug fix on the way)&lt;br /&gt;&lt;br /&gt;If you have more bugs to share, tell us at: Crackulous Forum&lt;br /&gt;&lt;br /&gt;Issues:&lt;br /&gt;&lt;br /&gt;   * If You cannot see Crackulous in the repo, restart your cydia (or your device) and have it update it's sources&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Kyek's FAQ&lt;br /&gt;We're getting a lot of common questions in this thread -- so I posted this on page 4, but it might be better served here in the original post smile.gif&lt;br /&gt;&lt;br /&gt;Crackulous crashing on startup?&lt;br /&gt;Many people are saying that it crashes when you have an app with a number in it. It's not necessarily numbers IN apps, it's apps that START WITH a number. This is a known bug, and it's mentioned in the original post. There should be a fix soon, so don't feel the need to delete your precious apps right away ;-). There's also a rare bug report about apps with 3 or more digits in the name causing a problem with Crackulous, but so far that's not been confirmed.&lt;br /&gt;&lt;br /&gt;Make sure you address your crashing in the official Crackulous crashing topic.&lt;br /&gt;&lt;br /&gt;But how do I crack apps without buying them?&lt;br /&gt;You don't. Every single app that's ever been cracked has been legitimately purchased by the cracker. Part of the cracking method requires you to run the app on your iDevice before it's cracked, and the only way to do that is by buying it and downloading it legitimately. Makes you think twice before you start spamming the requests board, doesn't it? ;-)&lt;br /&gt;&lt;br /&gt;I cracked an app but how do I get it?&lt;br /&gt;Crackulous tells you exactly where to find the app once it's cracked -- all you need to do is log into your phone via SFTP (you need OpenSSH from Cydia for this). Don't know how to do that? This, my friends, is why we have a Tutorials section here at Hackulous ;-) Take some initiative and search for it!&lt;br /&gt;&lt;br /&gt;Where do I upload the app?!?!?!?!?!1cos(0)1&lt;br /&gt;If your goal is to get the app posted on Appulous (and it should be!) you'll need to upload it to a filehost. Actually, if you want your app to stick around for awhile, you'll want to upload to a few filehosts! The ones that work on Appulous are listed here. Then, if you don't already have one, register for an account at Appulo.us, verify your E-mail (see here if you have problems with that), log in, then use the "Submit an App" link at the top of Appulous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5242857580418198983?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5242857580418198983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/02/crackulous-v9.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5242857580418198983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5242857580418198983'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/02/crackulous-v9.html' title='CRACKULOUS v.9'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2885714653325558172</id><published>2009-02-07T06:40:00.000-08:00</published><updated>2009-03-13T08:20:32.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>How to add cracked apps to your iPhone</title><content type='html'>This tutorial will show you how to install cracked .app applications on your iPhone. Although very easy and convenient, this is not the best way to add cracked apps. Given that most cracked iPhone apps are .ipa files, I recommend you have a look at guide on &lt;a href="http://ihtc.blogspot.com/2009/02/how-to-add-ipa-files-to-your-iphone.html"&gt;how to install .ipa files &lt;/a&gt;on your iPhone instead.&lt;br /&gt;&lt;br /&gt;I assume that you’re on a jailbroken 2.X iPhone and that you have installed OpenSSH from Cydia.&lt;br /&gt;&lt;br /&gt;1. Download cracked application.&lt;br /&gt;&lt;br /&gt;2. Unzip the cracked application folder to your desktop.&lt;br /&gt;&lt;br /&gt;3. SSH into iphone.&lt;br /&gt;&lt;br /&gt;4. In WinSCP, navigate to /Applications.&lt;br /&gt;&lt;br /&gt;5. Drag the cracked application folder over the /Applications folder and drop it in there.&lt;br /&gt;&lt;br /&gt;6. Right click on the cracked application folder and change permissions to 0755 and select the box beside “set owner group and permissions recursively” (or go inside the folder, select everything, and set properties to 0755 as well), then hit ok.&lt;br /&gt;&lt;br /&gt;7. In the /Applications folder, make a new folder called “Documents”, with a capital D. Change the permissions on the “Documents” folder you just created to 0777.&lt;br /&gt;&lt;br /&gt;8. Navigate to /var/mobile/ and make a new folder called “Documents”, with a capital D. Change the permissions on the “Documents” folder you just created to 0777.&lt;br /&gt;&lt;br /&gt;9. Reboot your device&lt;br /&gt;&lt;br /&gt;Note: Some applications require you set permission to 0775. It seems to be kinda random so if 0755 doesn’t work, try 0775.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2885714653325558172?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2885714653325558172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/02/how-to-add-cracked-apps-to-your-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2885714653325558172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2885714653325558172'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/02/how-to-add-cracked-apps-to-your-iphone.html' title='How to add cracked apps to your iPhone'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1652410572318104522</id><published>2009-02-07T06:38:00.000-08:00</published><updated>2009-03-13T08:20:32.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>How to add ipa files to your iPhone</title><content type='html'>Hello to you, iPhone hacker! Hello to you too, iPod Touch hacker…&lt;br /&gt;&lt;br /&gt;So it’s not a secret anymore… many iPhone games and applications have been cracked (and still are). Basically, you can get 2 types of files. The “normal” .app file, and the cracked ipa file. We already covered the method to &lt;a href="http://ihtc.blogspot.com/2009/02/how-to-add-cracked-apps-to-your-iphone.html"&gt;install .app files on your iPhone&lt;/a&gt;. Now here is the other method, the most popular one, to install cracked .ipa files such as games and applications on your iPhone or iPod Touch.&lt;br /&gt;&lt;br /&gt;As a reminder, this is illegal! I do not encourage anyone to hack or crack iPhone games. Some developpers spend quite some time working on them and they don’t want to see their work ripped off. If you see an iPhone game or application that you like, download it legally through the App Store.&lt;br /&gt;&lt;br /&gt;This method works for all firmwares from 2.0 to the current firmware available. The only thing that changes is the MobileInstallation file that you have to install. Each device (iPhone/iPod Touch) has its own MobileInstallation file for each version of the firmware. I started tracking these MobileInstallation files from iPhone 2.1. I do not have them for older firmwares and I do not have them for iPod Touch, although they might be the same as the iPhone’s. I don’t own an iPod Touch, thus I never tried this before on one but some users reported to me it worked great.&lt;br /&gt;&lt;br /&gt;By the way, you may want to check my list of cracked iPhone games and applications.&lt;br /&gt;&lt;br /&gt;So, how to install ipa files on an iPhone or iPod Touch?&lt;br /&gt;&lt;br /&gt;1. You need to be on jailbroken iPhone with Cydia installed. For this, you may use QuickPwn, PwnageTool, or WinPwn. See my tutorials for on how to jailbreak your iPhone or iPod Touch using any of these tools.&lt;br /&gt;&lt;br /&gt;2. Install OpenSSH from Cydia on your iPhone. Click on Cydia and then click Install (Sections)&gt;Networking&gt;OpenSSH then click Install&gt;Confirm (if you get a running out of disk space error click “ok”).&lt;br /&gt;&lt;br /&gt;3. Log into WinSCP. The first time you try to login you may get a connection timeout error, click retry several times (up to 20 times!) and it should work. If you still get an error, reboot your iPod/iPhone and try again.&lt;br /&gt;&lt;br /&gt;4. Navigate to /private/var/mobile/ folder&lt;br /&gt;&lt;br /&gt;5. Set the permission of the Applications folder to 777 (make sure reclusive is checked).&lt;br /&gt;&lt;br /&gt;6. Stay in the /private/var/mobile/ folder.&lt;br /&gt;&lt;br /&gt;7. Create a folder called “Documents” in the /private/var/mobile/ folder. Make sure to spell “Documents” correctly, with a capital “D”.&lt;br /&gt;&lt;br /&gt;8. Set the permission to 777.&lt;br /&gt;&lt;br /&gt;9. Navigate to the root level and open the /Applications folder.&lt;br /&gt;&lt;br /&gt;10. Create a folder called “Documents” inside the /Applications folder and set permission to 777.&lt;br /&gt;&lt;br /&gt;———Note: You will only need to create these two Documents folders once———&lt;br /&gt;&lt;br /&gt;11. Go to &lt;root&gt; /System/Library/PrivateFrameworks/MobileInstallation.framework&lt;br /&gt;&lt;br /&gt;12. Rename the file “MobileInstallation” to “MobileInstallation.bak”&lt;br /&gt;&lt;br /&gt;13. Download this patched MobileInstallation file from HERE. Note that you have to download the patched file for the firmware you are running. ie. if you are running 2.1, you need the MobileInstallation 2.1 patched file.&lt;br /&gt;&lt;br /&gt;14. Place the patched file into the /System/Library/PrivateFrameworks/MobileInstallation.framework folder and set the permissions 775 for the patched MobileInstallation file. If there is some type of extension (ie .dylib), then you need to remove that extension.&lt;br /&gt;&lt;br /&gt;15. Reboot your iPhone/iPod Touch&lt;br /&gt;&lt;br /&gt;16. Download cracked api Games and Apps from Here.&lt;br /&gt;&lt;br /&gt;17. Download at least one App from Apple App Store (Free or Paid). What I do is I download one app from the App Store using iTunes, then I sync my iPhone and reboot it. Then I download one app from the App Store on the iPhone and reboot the phone. THIS IS VERY IMPORTANT: Otherwise you will get an error! [Only need to do this once]&lt;br /&gt;&lt;br /&gt;18. Drag and drop the .ipa file you downloaded into the iTunes Application library.&lt;br /&gt;&lt;br /&gt;19. Sync your iPhone/iPod Touch and enjoy!&lt;br /&gt;&lt;br /&gt;Errors:&lt;br /&gt;&lt;br /&gt;The application “XXXXXXX” cannot be opened&lt;br /&gt;Fix: Reboot your iPhone or iPod&lt;br /&gt;&lt;br /&gt;0xE800001 Error:&lt;br /&gt;&lt;br /&gt;FIX: Change usb port and reboot your iphone/ipod Touch.&lt;br /&gt;If this doesn’t work try going into: Control panel-&gt;System-&gt;Device Manager-&gt;Universal Serie Bus Controller-&gt;Right click Apple Mobile Device USB Driver and update driver.&lt;br /&gt;&lt;br /&gt;0xE800013 Error:&lt;br /&gt;&lt;br /&gt;You get this error when you already have the app&lt;br /&gt;FIX: Simply delete the .app folder that u have ssh’d and reboot.&lt;/root&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1652410572318104522?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1652410572318104522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/02/how-to-add-ipa-files-to-your-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1652410572318104522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1652410572318104522'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/02/how-to-add-ipa-files-to-your-iphone.html' title='How to add ipa files to your iPhone'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-9102761457468615083</id><published>2009-02-06T22:42:00.000-08:00</published><updated>2009-03-13T08:20:32.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>Term you will hear, when looking for unlocked iPhone</title><content type='html'>&lt;p&gt;&lt;b&gt;&lt;u&gt;Baseband 101&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The ‘baseband’ is the generic name given to the internal components of the iPhone that handle the phone calls and Internet access. This ‘baseband’ is a tiny and unique independent computer system that runs inside your iPhone, it is separate to the main system that handles the applications (such as email and google maps) and it talks to the main part of the phone over an internal communications network. Think of it like a cable modem or other peripheral that is attached to your home PC that needs occasional updates. When a software update is released and presented to you within iTunes the baseband is sometimes updated (to fix bugs or add new features). The 2.2.1 update for the iPhone 3G contains such an update, so running the vanilla updater straight away with iTunes will reprogram and update the baseband. This could be bad for certain people, depending on your ultimate aim.&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;u&gt;SIM Free/SP Unlocked/Factory Unlocked iPhone 3G&lt;/u&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;This applies if you bought your iPhone 3G for &lt;i&gt;$$$$$$$.&lt;/i&gt; This model of iPhone 3G doesn’t have an Service Provider lock (aka factory unlocked) and you are able to put any SIM card into the phone and get service. Your phone is already unlocked so you do not need to worry about baseband updates, simply upgrade to 2.2.1 using iTunes and then use QuickPwn to Pwn and Jailbreak. This will add Cydia and Installer too.&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;u&gt;Locked iPhone 3G - Preserve Baseband&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This applies if you have a locked iPhone 3G and you wish to update to 2.2.1 but preserve the iPhone’s current baseband software. Preserving the baseband will ensure that you can still use “yellowsn0w” the iPhone 3G unlock application. To upgrade your phone to 2.2.1 and preserve the state of the baseband you need to create a custom .ipsw with PwnageTool. This custom .ipsw will not contain the baseband update but of course will still give you any new stuff from 2.2.1&lt;br /&gt;&lt;br /&gt;There are plenty of tutorials about this process on the web, but PwnageTool contains intuitive graphics and easy to follow prompts that should have you up and running in no time at all. Please note: PwnageTool is only available for Mac OS X.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Locked iPhone 3G&lt;/u&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;If you are using your iPhone with one carrier and have no interest in the possibility of an iPhone 3G unlock in the near future then just restore or upgrade to 2.2.1 using iTunes and use QuickPwn to Jailbreak and add Cydia and Installer.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;iPhone 2G (1st Generation)&lt;/b&gt;&lt;br /&gt;&lt;/u&gt;&lt;/p&gt; &lt;p&gt;Update or Restore your iPhone 2G with iTunes then run QuickPwn to do the magic, ‘nuff said, you don’t need to worry about anything.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;u&gt;iPod Touch 1G (Original iPod Touch)&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Update to 2.2.1 with iTunes and run QuickPwn.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;u&gt;iPod Touch 2G (New iPod Touch)&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sorry, no support at this time, but Redsn0w &lt;i&gt;&lt;b&gt;is&lt;/b&gt;&lt;/i&gt; being actively researched and developed.&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;u&gt;Fixing DFU mode on 10.5.6&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;As noted previously OS X 10.5.6 introduced a bug that affected the use of DFU mode. with some Macs. There have been previously published hacks and techniques to fix this, but here is another method that can be used to temporarily restore DFU functionality in order to use QuickPwn or PwnageTool.&lt;/p&gt; &lt;ol&gt;&lt;li&gt;You will need an account with ADC (Apple Developer Connection) this is free and takes a few minutes to sign up, you should read the terms and conditions carefully and you should only sign up if you are thinking of developing applications in the future - http://&lt;a href="http://is.gd/hN26" target="_blank"&gt;developer.apple.com/mac/ &lt;/a&gt; &lt;/li&gt;&lt;li&gt;Download the disk image &lt;a href="http://is.gd/hQrP" target="_blank"&gt;“IOUSBFamily-315.4-log.dmg”  for Mac OS X &lt;b&gt;10.5.5&lt;/b&gt; Build 9F33&lt;/a&gt;” (yes, that is a “&lt;b&gt;5&lt;/b&gt;” in &lt;i&gt;10.5.5&lt;/i&gt; - this is a developer debug package of the USB kernel extension).&lt;/li&gt;&lt;li&gt;Unplug non-vital USB equipment, such as external DVD writers, USB scanners, USB mass storage devices, at the most leave a Keyboard and Mouse connected.&lt;/li&gt;&lt;li&gt;Install IOUSBFamily-315.4.1.pkg from within the disk image&lt;/li&gt;&lt;li&gt;Reboot your system!&lt;/li&gt;&lt;li&gt;Perform necessary DFU activity with QuickPwn or PwnageTool.&lt;/li&gt;&lt;li&gt;Download the disk image &lt;a href="http://is.gd/hQrP" target="_blank"&gt;“&lt;/a&gt;&lt;a href="http://is.gd/hQrP" target="_blank"&gt;IOUSBFamily-327.4.0-log.dmg” for Mac OS X 10.5.6 Build 9G55”&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Intall  IOUSBFamily-327.4.0.pkg from within the disk image&lt;/li&gt;&lt;li&gt;Reboot your system!&lt;/li&gt;&lt;li&gt;Reattach your USB peripherals. &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-9102761457468615083?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/9102761457468615083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/02/term-you-will-hear-when-looking-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/9102761457468615083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/9102761457468615083'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/02/term-you-will-hear-when-looking-for.html' title='Term you will hear, when looking for unlocked iPhone'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2804910216428644234</id><published>2009-02-06T22:36:00.000-08:00</published><updated>2009-03-13T08:20:32.615-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>Jailbreaking your iPhone for Dummies.</title><content type='html'>&lt;table border="0" cellpadding="0" cellspacing="0" width="150"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="left" background="templates/Macinscott2/images/topic_right.gif" valign="top" width="13"&gt;&lt;br /&gt;&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;    &lt;td align="left" valign="top"&gt;&lt;img name="topic_bttm_left" src="http://beta.macnbits.com/forum/templates/Macinscott2/images/topic_bttm_left.gif" alt="" border="0" height="13" width="12" /&gt;&lt;/td&gt;    &lt;td align="left" background="templates/Macinscott2/images/topic_bttm.gif" valign="top"&gt;&lt;img src="http://beta.macnbits.com/forum/templates/Macinscott2/images/spacer.gif" height="13" width="1" /&gt;&lt;/td&gt;    &lt;td align="left" valign="top"&gt;&lt;img name="topic_bttm_right" src="http://beta.macnbits.com/forum/templates/Macinscott2/images/topic_bttm_right.gif" alt="" border="0" height="13" width="13" /&gt;&lt;/td&gt;   &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;         &lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td colspan="2"&gt;&lt;br /&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;     &lt;td colspan="2"&gt;&lt;span class="postbody"&gt;&lt;br /&gt;Ok, so you see these *.ipa files on this and other trackers and want to know how to get them on your iPhone without having to be a Unix command line expert. There are tons of tutorials on YouTube, but I'd say 90% of them are poorly done and outdated with old Unix commands for setting permissions and creating directories. Bleh! &lt;img src="http://beta.macnbits.com/forum/images/smiles/icon_rolleyes.gif" alt="Rolling Eyes" border="0" /&gt; &lt;br /&gt;&lt;br /&gt;First you'll need to Jailbreak your iPhone. First worry that comes up for noobs is "Will it ruin my iPhone, void the warranty, and piss Steve Jobs off?" &lt;img src="http://beta.macnbits.com/forum/images/smiles/icon_rolleyes.gif" alt="Rolling Eyes" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;The short answer is no. You can always reformat your phone and go back to the normal firmware. When you hear the "scary" brick term, it just means some app locked up the phone and now they have to reformat it back to normal.&lt;br /&gt;&lt;br /&gt;To Jailbreak your iPhone (rather easy process), visit:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.iphone-dev.org/" target="_blank"&gt;http://blog.iphone-dev.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Get the QuickPwn software for your firmware. As of this writing it was 2.1. The app will tell you with cartoons and movies EXACTLY what to do. A complete idiot could do it in about four minutes.&lt;br /&gt;&lt;br /&gt;To put on [k]'d apps with the ipa extension, do this step (only need to do once. Also notice there there are no complicated Unix commands you have to enter.)&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;li&gt;Make sure you've installed at least one free app from iTunes.  It somehow preps the iPhone for more apps.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Run QuickPwn on your iPhone if you haven't already.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Open Cydia on your device and let it download its stuff. If this is your first time running Cydia, it will download a bunch of updates and restart a couple of times.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tap on Manage and go to Sources.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tap Edit. Tap Add. Type in "http://www.iphone.org.hk/apt/" into the text box. Tap on Add Source.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Let it do its thing and when you get back to Cydia tap on Search.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Find and install Link Identity Editor.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Find and install MobileInstallation Patch.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Restart your device. (hold the top power button down for 5 seconds) Congratulations, you can now sync unsigned IPA packages to your device.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now simply double click any *.ipa file and iTunes will boot up and add it to your library so that it will sync.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Where to get [k]'d IPA files:&lt;br /&gt;&lt;br /&gt;Bittorrent Trackers:&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.demonoid.com/files/?uid=0&amp;amp;category=5&amp;amp;subcategory=277&amp;amp;language=0&amp;amp;seeded=0&amp;amp;quality=0&amp;amp;query=iphone&amp;amp;sort=" target="_blank" class="postlink"&gt;Demonoid's Iphone Section&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://thepiratebay.org/search/CrackedAppleStore/0/99/0" target="_blank" class="postlink"&gt;Weekly archives of the most popular apps on the AppleStore&lt;/a&gt;&lt;span style="color: green;"&gt; Great way to download the best apps quickly to get started&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;By the way, you can get IPA files directly from these websites rather than bittorrent.&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.megaupload.com/?f=TQ2I5VP6" target="_blank" class="postlink"&gt;http://www.megaupload.com/?f=TQ2I5VP6&lt;/a&gt;&lt;span style="color: green;"&gt;Good&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://iparepo.com/" target="_blank" class="postlink"&gt;http://iparepo.com/&lt;/a&gt;&lt;span style="color: red;"&gt;No download links yet...&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://appulo.us/appdb/" target="_blank" class="postlink"&gt;http://appulo.us/appdb/&lt;/a&gt;&lt;span style="color: green;"&gt;Looks really good.&lt;/span&gt; &lt;a href="http://www.xsellize.com/forumdisplay.php?f=93" target="_blank" class="postlink"&gt;RSS Feed for any new apps that get added to Appulo.us[/ur]&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.themonkeysball.com/" target="_blank" class="postlink"&gt;http://www.themonkeysball.com/&lt;/a&gt; &lt;span style="color: red;"&gt;Site destroyed by Apple's lawyers... oh well&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://themobileapps.com/" target="_blank" class="postlink"&gt;http://themobileapps.com/&lt;/a&gt; &lt;span style="color: yellow;"&gt;Site has not been updated for a couple of months&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.4shared.com/dir/8492007/8d1e19ab/sharing.html" target="_blank" class="postlink"&gt;http://www.4shared.com/dir/8492007/8d1e19ab/sharing.html&lt;/a&gt;&lt;span style="color: red;"&gt;Oct 1 - Site is down&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.freewebs.com/iauzy/crackedipas.htm" target="_blank" class="postlink"&gt;http://www.freewebs.com/iauzy/crackedipas.htm&lt;/a&gt;&lt;span style="color: red;"&gt;Dec 9 - Site shut down&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sendspace.com/folder/l1rq06" target="_blank" class="postlink"&gt;http://www.sendspace.com/folder/l1rq06&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Piratebay will often have large archives of them.&lt;br /&gt;&lt;br /&gt;In addition, two things that I love about a Jailbroken phone:  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.junefabrics.com/iphone/" target="_blank" class="postlink"&gt;PdaNet&lt;/a&gt; - Free tethering -- use AT&amp;amp;T's internet connection for free on your laptop!&lt;br /&gt;&lt;a href="http://jamesisbored.com/iphone/adblock" target="_blank" class="postlink"&gt;Adblock for Safari.&lt;/a&gt; - You'll need Cyberduck (free) but it's an easy drag and drop step.&lt;br /&gt;&lt;br /&gt;If you have any links or criticisms of this post, please reply here.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;New!&lt;/span&gt;PdaNet is now crippleware after two weeks.  To get the full version of many jailbroken apps do this:&lt;br /&gt;1. Open Cydia and Add Source: &lt;a href="http://xsellize.com/cydia/" target="_blank"&gt;http://xsellize.com/cydia/&lt;/a&gt;&lt;br /&gt;2. Install PdaNet 1.4.0 from the source you just added.&lt;br /&gt;3. You now have PdaNet 1.4.0 cracked &lt;img src="http://beta.macnbits.com/forum/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;In general, any information on warezing Jailbroken apps can be found here:&lt;br /&gt;&lt;a href="http://www.xsellize.com/forumdisplay.php?f=47" target="_blank"&gt;http://www.xsellize.com/forumdisplay.php?f=47&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hackulo.us/forums/index.php?showtopic=5041&amp;amp;st=60" target="_blank" class="postlink"&gt;Installing cracked apps directly on to your iPhone without having to use a computer&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2804910216428644234?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2804910216428644234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2009/02/jailbreaking-your-iphone-for-dummies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2804910216428644234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2804910216428644234'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2009/02/jailbreaking-your-iphone-for-dummies.html' title='Jailbreaking your iPhone for Dummies.'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5828105154184977084</id><published>2007-11-16T10:48:00.000-08:00</published><updated>2009-03-13T08:20:32.635-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 42 - Pointers</title><content type='html'>&lt;h2&gt;Tutorial 42 - Pointers&lt;/h2&gt;   &lt;strong&gt;Pointers&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Ah, the wonderful world of pointers! Have you ever read about them or heard about them? The cause of programmer's nightmares all around the world. Even if PPL allow you to live without them, you still can use them to expand the power of your programs.&lt;br /&gt;&lt;br /&gt;Lets start with string pointers. Strings in PPL are stored pretty much like any other strings in other programming languages. Each byte represents a character. If you define a string, you can later on access its pointer value and go to a specific character by adding a value to it.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;s$ = "HELLO WORLD";&lt;br /&gt;i$ = &amp;amp;s$ + 3;&lt;br /&gt;ShowMessage(@i$);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The following code will display "LO WORLD" in a dialog. The value of variable i$ will be the pointer location of s$ in memory plus the value 3. Now i$ is a simple numerical variable, nothing more. We need to convert it back into a string. The @ operator is used to convert a numerical value into memory content.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5828105154184977084?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5828105154184977084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-42-pointers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5828105154184977084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5828105154184977084'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-42-pointers.html' title='Tutorial 42 - Pointers'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4510496994285341735</id><published>2007-11-16T10:47:00.000-08:00</published><updated>2009-03-13T08:20:32.655-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 41 - The physic engine</title><content type='html'>&lt;h2&gt;Tutorial 41 - The physic engine&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;strong&gt;The physic engine&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Our world is made of physic, everything is physic! Gravity pushes every object to the ground, every step we take involves friction with the surface our shoes come in contact with, wind blows and pushes leaves around and balls bounces from the ground and walls with different elasticity. When applied to a game, physics can add more realism and can add possibilities you thought were too hard to code. PPL comes with a 2D automated physic engine. When I say automated I mean it, you only need to set the mass of a sprite, set the global gravity and the physic will take care of pushing the object down. Objects can bounce back and forth by simply assigning an elasticity value. The physic is far from an advanced one that supports object deformation on collision and such but it can do a very good job simplifying your life while developing your game.&lt;br /&gt;Lets first start by reviewing the principal functions used by the physic engine:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;br /&gt;SetSpriteMass(Sprite$, Mass);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The mass is a percentage value that is compared to the other sprites with physic. A sprite with 0.5 mass will weight half the weight of a sprite with a mass of 1.0.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SetSpriteElasticity(Sprite$, Elasticity);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The elasticity value is a percentage compared to the other sprites. The bigger the value the more rebound will be applied when the sprite collides with another sprite.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SetSpriteFriction(Sprite$, Friction);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The friction is the amount of friction in percentage applied to reduce the movement speed of the sprite when it collides with another sprite.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SetGravity(Gravity);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This function will set the global gravity of the sprite engine, the value of the gravity is applied to the sprites movement speed each cycle. Default gravity is around 0.1.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SetFriction(Friction);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Set the global friction that is applied to sprite's movement speed each cycle. The default friction value is 0.00025.&lt;br /&gt;&lt;br /&gt;There are options that need to be activated for the physic engine to consider moving the objects around. The first one is the SO_KINETIC to active the physic engine on the sprite itself. The second one is the SO_BOUNCE, it will make the sprite bounce around from other sprites. The bounce force is calculated based on the Elasticity of the sprite. Sprites must have the SO_COLLIDECHECK option set to them for bouncing to occur. You can have your sprites bounce from the screen edges by setting the SO_BORDER option. Most of the sprites you will want to bounce around will be of oval shape, you will want to set the SO_OVAL option for the physic engine to bounce the sprite like a real oval shaped object.&lt;br /&gt;&lt;br /&gt;Lets review the bounce.ppl demo that comes with PPL. This demo involves 5 basketball balls bouncing around from the screen edges and from each other. In this example we create 5 sprites with the basketball ball image and the we set the options of each sprite to oval shape, collision checking, pixel checking and border collision check.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;// Set global gravity.&lt;br /&gt;SetGravity(0.1);&lt;br /&gt;// Set global friction.&lt;br /&gt;SetFriction(0.005);&lt;br /&gt;&lt;br /&gt;i$ = 0;&lt;br /&gt;while (i$ &lt; 5)&lt;br /&gt;  // Load ball sprite from disk.&lt;br /&gt;  s$ = loadsprite(AppPath$ + "ball.bmp", G_RGB(255, 0, 255), 1, 0, NULL);&lt;br /&gt;&lt;br /&gt;  // Activate pixel perfect collision detection.&lt;br /&gt;  AddSpriteOption(s$, SO_OVAL | SO_CHECKCOLLIDE | SO_PIXELCHECK | SO_BORDER | SO_KINETIC);&lt;br /&gt;&lt;br /&gt;  // Make the balls collide and never go over another.&lt;br /&gt;  SetSpriteCollide(s$, "BALL");&lt;br /&gt;  SetSpriteId(s$, "BALL");&lt;br /&gt;&lt;br /&gt;  repeat&lt;br /&gt;    MoveSprite(s$, random(g_width - 40), random(64));&lt;br /&gt;    ProcessSprites(1, 0);&lt;br /&gt;  until (Collide(s$, SpriteX(s$), SpriteY(s$), nx$, ny$) == NULL);&lt;br /&gt;&lt;br /&gt;  // Set ball elasticity.&lt;br /&gt;  SetSpriteElasticity(s$, 0.01);&lt;br /&gt;&lt;br /&gt;  // Set some friction when the balls collide.&lt;br /&gt;  SetSpriteFriction(s$, 0.01);&lt;br /&gt;&lt;br /&gt;  // Set sprite's weight.&lt;br /&gt;  SetSpriteMass(s$, 0.5);&lt;br /&gt;&lt;br /&gt;  // Set the maximum velocity to 10 pixels.&lt;br /&gt;  SetSpriteVelLimits(s$, 0, 10);&lt;br /&gt;&lt;br /&gt;  i$++;&lt;br /&gt;end;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-4510496994285341735?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4510496994285341735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-41-physic-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4510496994285341735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4510496994285341735'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-41-physic-engine.html' title='Tutorial 41 - The physic engine'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-8050824753518434283</id><published>2007-11-16T10:46:00.000-08:00</published><updated>2009-03-13T08:20:32.676-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 40 - Form Options Quick Reference</title><content type='html'>&lt;h2&gt;Tutorial 40 - Form Options Quick Reference&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;strong&gt;Form Options Quick Reference (by Brad Manske)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Each of the options are listed below along with the effect that it has on the form.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Dialog Form&lt;/strong&gt;&lt;br /&gt;Default: Off&lt;br /&gt;When selected, the form will be created using a call to NewDlg to create the window. If not selected, then NewForm will be used to create the window if it is full screen, DefaultForm is selected in styles and there are no extended styles. If these conditions are not met, then the NewFormEx function will be used to create the window.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Generate Library&lt;/strong&gt;&lt;br /&gt;Default: Off&lt;br /&gt;When selected, the form will create PPL source code that can be included in with a larger project. If not selected, the form will have a WinMain function indicating the entry point for the project. It is possible to create a stand alone program in a single form file with this option deselected.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Simplified Event Handling&lt;/strong&gt;&lt;br /&gt;Default: On&lt;br /&gt;When selected, PPL will route the windows messages to the correct handler functions. If not selected, then the more traditional case table type logic is needed to decode and process the messages sent to the handler functions.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Extended Event Code&lt;/strong&gt;&lt;br /&gt;Default: On&lt;br /&gt;When selected, PPL will include code in the Simplified Event Handlers to do some of the more&lt;br /&gt;common decoding of the windows messages. If not selected, the code will be left off. To find the included code look in SWAPI.PPL for the #define for HandleEventParms.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Use Namespace&lt;/strong&gt;&lt;br /&gt;Default: On&lt;br /&gt;When selected, the form will include the #NameSpace command in the generated PPL code. This will force global variables and controls into their own namespace to avoid items named the same on multiple forms. If not selected, then all global variables and controls will be placed into the global NameSpace.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-8050824753518434283?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/8050824753518434283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-40-form-options-quick.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8050824753518434283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8050824753518434283'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-40-form-options-quick.html' title='Tutorial 40 - Form Options Quick Reference'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-6305915771313821</id><published>2007-11-16T10:45:00.000-08:00</published><updated>2009-03-13T08:20:32.695-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 39 - PPL Assembler</title><content type='html'>&lt;h2&gt;Tutorial 39 - PPL Assembler&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;strong&gt;PASM from the Beginning (by Brad Manske)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;"PASM can wait till after 1.0" was my reaction when I heard the plans to include a cross platform assembler with PPL. While it was not a lot of code, the complexity was way up there. So that it could run on multiple processors it had to be a virtual processor that was compiled to. There were 36 addressing modes for 22 assembly instructions that would potentially compile to a series of instructions for 2 different processors. The project required complex and intimate knowledge of the processors and the testing challenge was not going to be easy.&lt;br /&gt;&lt;br /&gt;My earliest e-mail on this project (that I kept) is dated the 20th of March 2004. We had already worked together for almost 2 years when the topic came up. There is no backing down from a complex technical challenge, so even though the pressure to release 1.0 was high, PASM went forward. This article will introduce you to PASM and it just may be the raw speed boost your code needs. I will start off with some explanation for the people who have not had much exposure to assembly language. Assembly is a text representation of the 1s and 0s that the computer actually executes. For example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;X$ = 10;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This would be an instruction to move the value 10 into the variable X$:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;move x, 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sound simple? Well, yes, if the processor supports moving a value into memory without going through a register first. And if the value fits in a 32 bit register (Windows CE requires a 32 bit processor). And, etc...&lt;br /&gt;&lt;br /&gt;This is the reason that PASM uses a virtual processor internally. We couldn't guarantee that these conditions would be met for each processor since all of the code written for PASM must run on all of our supported platforms.&lt;br /&gt;&lt;br /&gt;The PASM virtual processor is made up of 4 general purpose registers named R0, R1, R2 and R3. There are more specialized registers like the Stack Pointer (SP) and the Stack Frame (SF). The Arithmetic and Logic unit of our processor is a simplified RISC (Reduced Instruction Set Computing) like design. The instruction set consists of about 22 different assembly operations. This isn't much compared to the hundreds of instructions supported by some processors, but there are 36 addressing modes to offset the simplicity of the instruction set.Here is a quick look at the MOV instruction and the addressing modes that it supports. For 32 bit values:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;mov Register, Value&lt;/strong&gt; move from Value to Register&lt;br /&gt;&lt;strong&gt;mov Absolute, Value&lt;/strong&gt; move from Value to Absolute address&lt;br /&gt;&lt;strong&gt;mov [Register], Value&lt;/strong&gt; move from Value to Indexed Register&lt;br /&gt;&lt;strong&gt;mov [Absolute], Value&lt;/strong&gt; move from Value to Indexed Absolute address&lt;br /&gt;&lt;strong&gt;mov Register, Register&lt;/strong&gt; move from Register to Register&lt;br /&gt;&lt;strong&gt;mov Register, [Register]&lt;/strong&gt; move from Indexed Register to Register&lt;br /&gt;&lt;strong&gt;mov [Register], Register&lt;/strong&gt; move from Register to Indexed Register&lt;br /&gt;&lt;strong&gt;mov [Register], [Register]&lt;/strong&gt; move from Indexed Register to Indexed Register&lt;br /&gt;&lt;strong&gt;mov Absolute, Register&lt;/strong&gt; move from Register to Absolute address&lt;br /&gt;&lt;strong&gt;mov [Absolute], Register&lt;/strong&gt; move from Register to Indexed Absolute address&lt;br /&gt;&lt;strong&gt;mov Register, [Register+offset]&lt;/strong&gt; move from Index+Offset Register to Register&lt;br /&gt;&lt;strong&gt;mov [Register+offset], Register&lt;/strong&gt; move from Register to Index+Offset Register&lt;br /&gt;&lt;strong&gt;mov [Register+offset], [Register+offset]&lt;/strong&gt; move from Index+Offset Register to Index+Offset Register&lt;br /&gt;&lt;strong&gt;mov Absolute+offset, Register&lt;/strong&gt; move from Register to Absolute+Offset address&lt;br /&gt;&lt;strong&gt;mov Absolute+offset, Value&lt;/strong&gt; move from Value to Absolute+Offset address&lt;br /&gt;&lt;strong&gt;mov [Absolute+offset], Register&lt;/strong&gt; move from Register to Index+Offset Absolute address&lt;br /&gt;&lt;strong&gt;mov [Absolute+offset], Value&lt;/strong&gt; move from Value to Index+Offset Absolute address&lt;br /&gt;&lt;strong&gt;mov [Register+offset], Value&lt;/strong&gt; move from Value to Index+Offset Register&lt;br /&gt;&lt;br /&gt;MOV also supports a size modifier for 8 bits (byte) and 16 bit (word) values:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;mov size Register, Register&lt;/strong&gt; move size from Register to Register&lt;br /&gt;&lt;strong&gt;mov size Register, [Register]&lt;/strong&gt; move size from Indexed Register to Register&lt;br /&gt;&lt;strong&gt;mov size [Register], Register&lt;/strong&gt; move size from Register to Indexed Register&lt;br /&gt;&lt;strong&gt;mov size [Register], [Register]&lt;/strong&gt; move size from Indexed Register to Indexed Register&lt;br /&gt;&lt;strong&gt;mov size Absolute, Register&lt;/strong&gt; move size from Register to Absolute address&lt;br /&gt;&lt;strong&gt;mov size Absolute, Value&lt;/strong&gt; move size from Value to Absolute address&lt;br /&gt;&lt;strong&gt;mov size [Absolute], Register&lt;/strong&gt; move size from Register to Indexed Absolute address&lt;br /&gt;&lt;strong&gt;mov size [Absolute], Value&lt;/strong&gt; move size from Value to Indexed Absolute address&lt;br /&gt;&lt;strong&gt;mov size Register, Value&lt;/strong&gt; move size from Value to Register&lt;br /&gt;&lt;strong&gt;mov size [Register], Value&lt;/strong&gt; move size from Value to Indexed Register&lt;br /&gt;&lt;strong&gt;mov size Register, [Register+offset]&lt;/strong&gt; move size from Index+Offset Register to Register&lt;br /&gt;&lt;strong&gt;mov size [Register+offset], Register&lt;/strong&gt; move size from Register to Index+Offset Register&lt;br /&gt;&lt;strong&gt;mov size [Register+offset], [Register+offset]&lt;/strong&gt; move size from Index+Offset Register to Index+Offset Register&lt;br /&gt;&lt;strong&gt;mov size Absolute+offset, Register&lt;/strong&gt; move size from Register to Absolute+Offset address&lt;br /&gt;&lt;strong&gt;mov size Absolute+offset, Value&lt;/strong&gt; move size from Value to Absolute+Offset address&lt;br /&gt;&lt;strong&gt;mov size [Absolute+offset], Register&lt;/strong&gt; move size from Register to Index+Offset Absolute address&lt;br /&gt;&lt;strong&gt;mov size [Absolute+offset], Value&lt;/strong&gt; move size from Value to Index+Offset Absolute address&lt;br /&gt;&lt;strong&gt;mov size [Register+offset], Value&lt;/strong&gt; move size from Value to Index+Offset Register&lt;br /&gt;&lt;br /&gt;A few quick note about the notation above. The brackets [] above mean that the value of the expression inside the brackets is the memory location that will be operated on. Register is a register R0 to R3 or one of the special registers. Absolute, is a number representing a specific memory location. Offset an integer value that allows you to adjust the value of the memory address operated on without the need to modify the base.&lt;br /&gt;Here is a very simple example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#include "console.ppl"&lt;br /&gt;&lt;br /&gt;func WinMain;&lt;br /&gt;  InitConsole;&lt;br /&gt;  ShowConsole;&lt;br /&gt;&lt;br /&gt;  new(startVal$, tint);&lt;br /&gt;  new(endVal$, tint);&lt;br /&gt;&lt;br /&gt;  StartVal$ = 0;&lt;br /&gt;  EndVal$ = 0;&lt;br /&gt;&lt;br /&gt;  asmCall$ = asm(1024, );&lt;br /&gt;&lt;br /&gt;  callasm(asmCall$, 20, 30);&lt;br /&gt;&lt;br /&gt;  writeln("Test "+ startVal$ + ", "+ endVal$);&lt;br /&gt;&lt;br /&gt;  freeasm(asmCall$);&lt;br /&gt;&lt;br /&gt;  free(startVal$, endVal$);&lt;br /&gt;&lt;br /&gt;  return(true);&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you read my previous articles, you know that I'm a fan of using the console for my examples, so it should be no surprise that I first include the console. Next I declare some variables in the PPL memory space outside of PASM. Next is the assembly code followed by the CallASM instruction. Some values are written and the assembly code and variables are freed. When compiled, the call to ASM takes 2 arguments the first being the size of the byte buffer that holds the assembled code and the second is the string of assembly instructions. The buffer is specified in bytes and a multiplier is used on the buffer size depending on what you are doing.&lt;br /&gt;&lt;br /&gt;For example, by running your code under debug, it is possible to step through and break on assembly instructions. In order to do this, extra machine code instructions are inserted to support doing this so the buffer must be expanded. It also means that your code will execute slower under debug than it will in run mode. The buffer is created at run time and the assembler runs against the 2nd argument which is the text with all of the assembly instructions. So keep in mind that if you make a change to the assembly code, any errors will not be found until run time. It also means if you plan on using the assembler you may want&lt;br /&gt;to place your ASM instructions at startup and keep them for the duration of the program so that the code is not reassembled during the execution of your program when you really need the speed.&lt;br /&gt;&lt;br /&gt;The CallASM instruction invokes the code created in the buffer by the ASM command. CallASM can take additional arguments that will be passed into the assembly code as parameters. The parameters are placed into an AARGS$ array and the size of the array is placed into AARGSCOUNT$. Each of the parameters are treated as a 4 byte (32 bit) value. So the value of 20 is at [AARGS$] and the value of 30 is at [AARGS$+4].&lt;br /&gt;&lt;br /&gt;The line ":main" above indicates the entry point to your assembly code. This is a label and is used as the target in jump instructions. The line "#DEASM" above instructs the ASM instruction place the actual assembly instruction for your processor to be placed into the DebugLog file. This does take extra time, so it shouldn't be used in production programs. The #debugoff pragma can be used to disable this for the entire project. Here is a simple example when using #DEASM. The 2 lines from above:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov StartVal$, 1&lt;br /&gt;mov EndVal$, 2&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;On Intel processors are translated into:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov edi, D45B28h(STARTVAL$)&lt;br /&gt;mov [edi], 01h&lt;br /&gt;mov edi, D45B98h(ENDVAL$)&lt;br /&gt;mov [edi], 02h&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On Arm processors are translated into:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ldr r9, 34C9B0h(STARTVAL$)&lt;br /&gt;ldr r10, #01h&lt;br /&gt;str r10, [r9]&lt;br /&gt;str r10, #01h&lt;br /&gt;ldr r9, 34CA40h(ENDVAL$)&lt;br /&gt;ldr r10, #02h&lt;br /&gt;str r10, [r9]&lt;br /&gt;str r10, #02h&lt;/span&gt;&lt;br /&gt;The lines from the PASM example above:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;savesp&lt;br /&gt;pplpush [AARGSCOUNT$]&lt;br /&gt;ppl showmessage&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Show an example of saving the position on the stack pushing some arguments onto the stack where ppl can get to it then calling a PPL function. Here is another example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;savesp&lt;br /&gt;pplpushstr tstStr1$&lt;br /&gt;pplpushstr tstStr2$&lt;br /&gt;pplpushstr tstStr3$&lt;br /&gt;ppl concat&lt;br /&gt;pplpull&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this example, the stack pointer is saved, all of the required arguments are placed onto the stack and the PPL concat function is called to concatenate the strings together. The stack is restored to its previous state after the PPL call, then the address of the new string is pulled from the stack. The new string is created in a new memory space that the garbage collector will automatically clean up from. I'll leave you with one more example. This example demonstrates the usage of Jump instructions and the use of an assembly procedure. The entry point is at ":main". It tests the number of arguments passed into the assembly code to see if there is only one. In this case there is only one so the value of 20 is passed to the function "!asmCalc". As in high level code, the string in parenthesis becomes a variable for the function. The "Var FinSum" instructions declares a local var for use within the function. The function then calculates the Fibonacci series on the number passed to it adding all of the numbers from n + (n-1) + ... + 2 + 1.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#include "console.ppl"&lt;br /&gt;&lt;br /&gt;func WinMain;&lt;br /&gt;  InitConsole;&lt;br /&gt;  ShowConsole;&lt;br /&gt;&lt;br /&gt;  new(startVal$, tint);&lt;br /&gt;  new(endVal$, tint);&lt;br /&gt;&lt;br /&gt;asmFib$ = asm(1024, );&lt;br /&gt;&lt;br /&gt;  t$ = tick;&lt;br /&gt;&lt;br /&gt;  callasm(asmFib$, 20);&lt;br /&gt;&lt;br /&gt;  writeln("Fibbon("+ startVal$ + ")="+ endVal$ + " time =" + (tick - t$));&lt;br /&gt;&lt;br /&gt;  freeasm(asmFib$);&lt;br /&gt;&lt;br /&gt;  free(startVal$, endVal$);&lt;br /&gt;&lt;br /&gt;  return(true);&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Play with PASM a while and let us know what you think in the Forums. In the next newsletter, I will address some more advanced examples.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-6305915771313821?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/6305915771313821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-39-ppl-assembler.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/6305915771313821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/6305915771313821'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-39-ppl-assembler.html' title='Tutorial 39 - PPL Assembler'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-3988264587641184374</id><published>2007-11-16T10:44:00.001-08:00</published><updated>2009-03-13T08:20:32.737-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 37 - Compressing strings in PPL.</title><content type='html'>&lt;h2&gt;Tutorial 37 - Compressing strings in PPL.&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;strong&gt;Compressing strings.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The Pro version of PPL comes fully loaded with different compression and decompression methods from two simple functions: Compress() and UnCompress(). Here are the different compression methods supported by PPL:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;_RLE&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;RLE, or Run Length Encoding, is a very simple method for lossless compression. It simply replaces repeated bytes with a short description of which byte to repeat, and how many times to repeat it.&lt;br /&gt;&lt;br /&gt;Though simple and obviously very inefficient fore general purpose compression, it can be very useful at times (it is used in JPEG compression, for instance).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;_HUFFMAN&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Huffman encoding is one of the best methods for lossless compression. It replaces each symbol with an alternate binary representation, whose length is determined by the frequency of the particular symbol.&lt;br /&gt;&lt;br /&gt;Common symbols are represented by few bits, while uncommon symbols are represented by many bits.&lt;br /&gt;&lt;br /&gt;The Huffman algorithm is optimal in the sense that changing any of the binary codings of any of the symbols will result in a less compact representation. However, it does not deal with the ordering or repetition of symbols or sequences of symbols.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;_LZ&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There are many different variants of the Lempel-Ziv compression scheme. The Basic Compression Library has a fairly straight forward implementation of the LZ77 algorithm (Lempel-Ziv, 1977) that performs very well, while the source code should be quite easy to follow. The LZ coder can be used for general purpose compression, and performs exceptionally well for compressing text. It can also be used in combination with the provided RLE and Huffman coders (in the order: RLE, LZ, Huffman) to gain some extra compression in most situations.&lt;br /&gt;&lt;br /&gt;Lets take the following code:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;in$ = LoadStr(AppPath$+ “MyFile.txt”, insize$);&lt;br /&gt;New(out$, insize$ * 2);&lt;br /&gt;outsize$ = Compress(_RLE, in$, out$, insize$);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This code will load file MyFile.txt into variable in$, return the size in bytes in variable insize$. We then need to create an output buffer that is at least equal or preferably greater that the original input buffer. We then apply the RLE compression method to in$ and outputting the result in the out$ variable returning the new size of the out$ variable in outsize$.&lt;br /&gt;&lt;br /&gt;You can then decompress the out$ buffer to a new newin$ buffer with the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;New(newin$, outsize$ * 2);&lt;br /&gt;newinsize$ = Compress(_RLE, out$, newinsize$, outsize$);&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-3988264587641184374?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/3988264587641184374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-37-compressing-strings-in-ppl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/3988264587641184374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/3988264587641184374'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-37-compressing-strings-in-ppl.html' title='Tutorial 37 - Compressing strings in PPL.'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-8787265302392161343</id><published>2007-11-16T10:44:00.000-08:00</published><updated>2009-03-13T08:20:32.716-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='dav'/><title type='text'>Tutorial 38 - Encryption strings easily.</title><content type='html'>&lt;h2&gt;Tutorial 38 - Encryption strings easily.&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;strong&gt;Encrypting strings in PPL.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;What if you want to protect a file from sneaky eyes? The best solution is to encrypt the file using a very strong password that only you know about. PPL comes with a nice function called Encrypt() that can do this for you very easily.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;s$ = "HELLO WORLD!";&lt;br /&gt;Encrypt(s$, -1, "MYKEY", True);&lt;br /&gt;ShowMessage(s$);&lt;br /&gt;Encrypt(s$, -1, "MYKEY", False);&lt;br /&gt;ShowMessage(s$);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In the following example we encrypt the string “HELLO WORLD!” using an encryption algorythm that uses the key “MYKEY” to encode the result string. The last parameter of the Encryt() function specify if we are encrypting or decrypting the string, true means encryt and false means decrypt. It is always a good idea idea never to leave a key as a regular string in your code even though the .ppc file that PPL generates is encrypted and compressed, it can be easier for a hacker to decode. Try to build your key string using code with mathematical code if possible.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-8787265302392161343?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/8787265302392161343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-38-encryption-strings-easily.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8787265302392161343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8787265302392161343'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-38-encryption-strings-easily.html' title='Tutorial 38 - Encryption strings easily.'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-8126028497984317366</id><published>2007-11-16T10:43:00.002-08:00</published><updated>2009-03-13T08:20:32.796-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 35 - Structures in Linked-Lists</title><content type='html'>&lt;h2&gt;Tutorial 35 - Structures in Linked-Lists&lt;/h2&gt;   &lt;div class="contentbody"&gt;Structures in Linked-Lists&lt;br /&gt;&lt;br /&gt;Linked-lists are very powerful and can allow for very complicated data storage. Now let's see how it possible to store a different structure type inside each list node.First we need to create our list node:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;List(l$);&lt;br /&gt;Add(l$);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;We now have one list node in l$ and our current internal pointer is placed on that first node.&lt;br /&gt;&lt;br /&gt;We can now define the variable type like we would with any other variable:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct(l$, “a”, “b”);&lt;br /&gt;l.a$ = 10;&lt;br /&gt;l.b$ = 20;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;We can now add a new node and store another structure into it:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Add(l$);&lt;br /&gt;struct(l$, “c”, “d”);&lt;br /&gt;l.c$ = 30;&lt;br /&gt;l.d$ = 40;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Now let's iterate through the list and output the structure's element values:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ForEach(l$)&lt;br /&gt;  if (Lpos(l$) == 0)&lt;br /&gt;    ShowMessage(l.a$);&lt;br /&gt;    ShowMessage(l.b$);&lt;br /&gt;  else if (Lpos(l$) == 1)&lt;br /&gt;    ShowMessage(l.c$);&lt;br /&gt;    ShowMessage(l.d$);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Lpos() function returns the current pointer position of the list always starting with 0.&lt;br /&gt;&lt;br /&gt;Imagine the possibilities offered by such flexibility.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-8126028497984317366?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/8126028497984317366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-35-structures-in-linked-lists.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8126028497984317366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8126028497984317366'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-35-structures-in-linked-lists.html' title='Tutorial 35 - Structures in Linked-Lists'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4027971726965759673</id><published>2007-11-16T10:43:00.001-08:00</published><updated>2009-03-13T08:20:32.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'></title><content type='html'>&lt;h2&gt;Tutorial 36 - Regular Expressions in PPL&lt;/h2&gt;   &lt;div class="contentbody"&gt;Regular Expressions (Regex):&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.regular-expres%3cb%3e%3c/b%3Esions.info/"&gt;www.regular-expressions.info&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;“A regular expression (regex or regexp for short) is a special text string for describing a search pattern. You can think of regular expressions as wildcards on steroids. You are probably familiar with wildcard notations such as *.txt to find all text files in a file manager. The regex equivalent is .*\.txt . But you can do much more with regular expressions. In a text editor like EditPad Pro or a specialized text processing tool like PowerGREP, you could use the regular expression \b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]\b to search for an email address. Any email address, to be exact. A very similar regular expression (replace the first \b with ^ and the last one with $) can be used by a programmer to check if the user entered a properly formatted email address. In just one line of code, whether that code is written in Perl, PHP, Java, a .NET language or a multitude of other languages.”&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;PPL supports a variety of expressions like:&lt;br /&gt;&lt;br /&gt;\Quote the next metacharacter&lt;br /&gt;^ Match the beginning of the string&lt;br /&gt;. Match any character&lt;br /&gt;$ Match the end of the string&lt;br /&gt;| Alternation&lt;br /&gt;() Grouping (creates a capture)&lt;br /&gt;[] Character class&lt;br /&gt;&lt;br /&gt;==GREEDY CLOSURES==&lt;br /&gt;&lt;br /&gt;* Match 0 or more times&lt;br /&gt;+ Match 1 or more times&lt;br /&gt;? Match 1 or 0 times&lt;br /&gt;Match at least n times&lt;br /&gt;Match at least n but not more than m times&lt;br /&gt;&lt;br /&gt;==ESCAPE CHARACTERS==&lt;br /&gt;&lt;br /&gt;\t tab (HT, TAB)&lt;br /&gt;\n newline (LF, NL)&lt;br /&gt;\r return (CR)&lt;br /&gt;\f form feed (FF)&lt;br /&gt;&lt;br /&gt;==PREDEFINED CLASSES==&lt;br /&gt;&lt;br /&gt;\l lowercase next char&lt;br /&gt;\u uppercase next char&lt;br /&gt;\a letters&lt;br /&gt;\A non letters&lt;br /&gt;\w alphanimeric [0-9a-zA-Z]&lt;br /&gt;\W non alphanimeric&lt;br /&gt;\s space&lt;br /&gt;\S non space&lt;br /&gt;\d digits&lt;br /&gt;\D non nondigits&lt;br /&gt;\x exadecimal digits&lt;br /&gt;\X non exadecimal digits&lt;br /&gt;\c control charactrs&lt;br /&gt;\C non control charactrs&lt;br /&gt;\p punctation&lt;br /&gt;\P non punctation&lt;br /&gt;&lt;br /&gt;To search a string using regular expression in PPL you will use the Search() function. You can also make sure that the string is an exact match of the regular expression you are providing with the Match() function.&lt;br /&gt;&lt;br /&gt;Let's take the following example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;string$ = "Bill Clinton";&lt;br /&gt;expr$ = "^(Bill|George|Renald) (Clinton|Bush|Reagan)$";&lt;br /&gt;Search(expr$, string$, b$, e$);&lt;br /&gt;ShowMessage(b$ + "," + e$);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The expr$ variable contains an expression that says, if the first word is either Bill, George or Renald and that the string ends with Clinton, Bush or Reagan, we have a match. “Bill Clinton” will be the beginning of our result string, b$ and “” will be our ending string e$.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;i$ = 0;&lt;br /&gt;while(i$ &lt;= subexpcount - 1)&lt;br /&gt;  subexp(string$, i$, begin$, len$);&lt;br /&gt;  ShowMessage("SubExp " + i$ + " = " + begin$ + "," + len$);&lt;br /&gt;  i$++;&lt;br /&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In the previous example, we check each sub expression to see what matched in the string string$ and where it started and how many characters the sub expression took from string$.&lt;br /&gt;Sub expression 0 will return “Bill Clinton” for a length of 12 because it do the whole expression. Sub expression 1 will return “Bill Clinton” but for 4 characters only, the first sub expression “^(Bill|George|Renald)” is analyzed. Sub expression 2 will return “Clinton” for 7 characters, the second sub expression “(Clinton|Bush|Reagan)$” is analyzed.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-4027971726965759673?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4027971726965759673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-36-regular-expressions-in-ppl_16.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4027971726965759673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4027971726965759673'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-36-regular-expressions-in-ppl_16.html' title=''/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-6476612242440340160</id><published>2007-11-16T10:43:00.000-08:00</published><updated>2009-03-13T08:20:32.760-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 36 - Regular Expressions in PPL</title><content type='html'>&lt;h2&gt;Tutorial 36 - Regular Expressions in PPL&lt;/h2&gt;   &lt;div class="contentbody"&gt;Regular Expressions (Regex):&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.regular-expres%3cb%3e%3c/b%3Esions.info/"&gt;www.regular-expressions.info&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;“A regular expression (regex or regexp for short) is a special text string for describing a search pattern. You can think of regular expressions as wildcards on steroids. You are probably familiar with wildcard notations such as *.txt to find all text files in a file manager. The regex equivalent is .*\.txt . But you can do much more with regular expressions. In a text editor like EditPad Pro or a specialized text processing tool like PowerGREP, you could use the regular expression \b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]\b to search for an email address. Any email address, to be exact. A very similar regular expression (replace the first \b with ^ and the last one with $) can be used by a programmer to check if the user entered a properly formatted email address. In just one line of code, whether that code is written in Perl, PHP, Java, a .NET language or a multitude of other languages.”&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;PPL supports a variety of expressions like:&lt;br /&gt;&lt;br /&gt;\Quote the next metacharacter&lt;br /&gt;^ Match the beginning of the string&lt;br /&gt;. Match any character&lt;br /&gt;$ Match the end of the string&lt;br /&gt;| Alternation&lt;br /&gt;() Grouping (creates a capture)&lt;br /&gt;[] Character class&lt;br /&gt;&lt;br /&gt;==GREEDY CLOSURES==&lt;br /&gt;&lt;br /&gt;* Match 0 or more times&lt;br /&gt;+ Match 1 or more times&lt;br /&gt;? Match 1 or 0 times&lt;br /&gt;Match at least n times&lt;br /&gt;Match at least n but not more than m times&lt;br /&gt;&lt;br /&gt;==ESCAPE CHARACTERS==&lt;br /&gt;&lt;br /&gt;\t tab (HT, TAB)&lt;br /&gt;\n newline (LF, NL)&lt;br /&gt;\r return (CR)&lt;br /&gt;\f form feed (FF)&lt;br /&gt;&lt;br /&gt;==PREDEFINED CLASSES==&lt;br /&gt;&lt;br /&gt;\l lowercase next char&lt;br /&gt;\u uppercase next char&lt;br /&gt;\a letters&lt;br /&gt;\A non letters&lt;br /&gt;\w alphanimeric [0-9a-zA-Z]&lt;br /&gt;\W non alphanimeric&lt;br /&gt;\s space&lt;br /&gt;\S non space&lt;br /&gt;\d digits&lt;br /&gt;\D non nondigits&lt;br /&gt;\x exadecimal digits&lt;br /&gt;\X non exadecimal digits&lt;br /&gt;\c control charactrs&lt;br /&gt;\C non control charactrs&lt;br /&gt;\p punctation&lt;br /&gt;\P non punctation&lt;br /&gt;&lt;br /&gt;To search a string using regular expression in PPL you will use the Search() function. You can also make sure that the string is an exact match of the regular expression you are providing with the Match() function.&lt;br /&gt;&lt;br /&gt;Let's take the following example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;string$ = "Bill Clinton";&lt;br /&gt;expr$ = "^(Bill|George|Renald) (Clinton|Bush|Reagan)$";&lt;br /&gt;Search(expr$, string$, b$, e$);&lt;br /&gt;ShowMessage(b$ + "," + e$);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The expr$ variable contains an expression that says, if the first word is either Bill, George or Renald and that the string ends with Clinton, Bush or Reagan, we have a match. “Bill Clinton” will be the beginning of our result string, b$ and “” will be our ending string e$.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;i$ = 0;&lt;br /&gt;while(i$ &lt;= subexpcount - 1)&lt;br /&gt;  subexp(string$, i$, begin$, len$);&lt;br /&gt;  ShowMessage("SubExp " + i$ + " = " + begin$ + "," + len$);&lt;br /&gt;  i$++;&lt;br /&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In the previous example, we check each sub expression to see what matched in the string string$ and where it started and how many characters the sub expression took from string$.&lt;br /&gt;Sub expression 0 will return “Bill Clinton” for a length of 12 because it do the whole expression. Sub expression 1 will return “Bill Clinton” but for 4 characters only, the first sub expression “^(Bill|George|Renald)” is analyzed. Sub expression 2 will return “Clinton” for 7 characters, the second sub expression “(Clinton|Bush|Reagan)$” is analyzed.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-6476612242440340160?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/6476612242440340160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-36-regular-expressions-in-ppl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/6476612242440340160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/6476612242440340160'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-36-regular-expressions-in-ppl.html' title='Tutorial 36 - Regular Expressions in PPL'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2236952132951205947</id><published>2007-11-16T10:42:00.000-08:00</published><updated>2009-03-13T08:20:32.813-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 34 - Linked-lists</title><content type='html'>&lt;h2&gt;Tutorial 34 - Linked-lists&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;strong&gt;Linked-Lists&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Finally a chance to talk about the linked-lists. You have probably heard or learnt about them in school while studying C or maybe you've read about them on the internet or a magazine.&lt;br /&gt;&lt;br /&gt;Here is a great explanation from the great wikipedia.com:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;“In computer science, a linked list is one of the fundamental data structures used in computer programming. It consists of a sequence of nodes, each containing arbitrary data fields and one or two references ("links") pointing to the next and/or previous nodes. A linked list is a self-referential datatype because it contains a pointer or link to another data of the same type. Linked lists permit insertion and removal of nodes at any point in the list in constant time, but do not allow random access.”&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;In PPL linked-lists variables are extremely powerful and versatile. In each node you can have a different type of variable, structures or arrays. This opens up unlimited data storage in memory that is simply unmatched.&lt;br /&gt;&lt;br /&gt;To create a list variable, there many ways, here is how you declare a list variable and how you add nodes to it:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;List(l$);&lt;br /&gt;Add(l$, 1, 2, 3, 4, 5);&lt;br /&gt;Add(l$, “A”, “B”, “C”, “D”);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This new linked-list variable now contains 9 nodes with different values and types. Let's see how you can move through the nodes like other languages would allow you to:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;First(l$);&lt;br /&gt;while (1 == 1)&lt;br /&gt;  ShowMessage(l$);&lt;br /&gt;  if (Next(l$) == false)&lt;br /&gt;    break;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Here is how we iterate through the list in reverse order:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Last(l$);&lt;br /&gt;while (1 == 1)&lt;br /&gt;  ShowMessage(l$);&lt;br /&gt;  if (Prev(l$) == false)&lt;br /&gt;    break;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The First() function moves the list internal pointer to the first node, Next() moves to the next node returning true if succeeded or false is past the end of the node list. The Last() function moves the internal list pointer to the last node in the list and the Prev() function moves to the previous node.&lt;br /&gt;&lt;br /&gt;In PPL you can use the ForEach() statement to iterate through a list, an array, a structure or a matrix type variable:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ForEach(l$)&lt;br /&gt;  ShowMessage(l$);&lt;br /&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ForEachRev(l$)&lt;br /&gt;  ShowMessage(l$);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;If you need to store the list node value into another variable, you can place a second variable as a target in the ForEach() statement:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ForEach(l$, v$)&lt;br /&gt;  ShowMessage(v$);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Let's see how PPL can access nodes at random order, PPL can access list's nodes just like regular arrays:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage(l$[0]);  // display 1&lt;br /&gt;ShowMessage(l$[5]);  // display A&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;How do we go to a specific node position? Simple, by using the Goto() function. How do we know what node is the current one? Use the Lpos() function. How many nodes are in the list? Use the Count() function.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Goto(l$, 0); // Like First()&lt;br /&gt;ShowMessage(LPos(l$));&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Goto(l$, Count(l$)-1); // Like Last()&lt;br /&gt;ShowMessage(LPos(l$));&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;We can also move nodes around using the Lmove() function:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Lmove(l$, 3, 1); // This moves node 3 to node 1.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;You can also insert nodes using the Ins() function:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Ins(l$, 0, 0);  // Insert value 0 at node 0.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To delete a node from the list, you can use the Del() function, if you want to empty the whole list, just use Empty().&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;First(l$); // Move to first node.&lt;br /&gt;Del(l$); // Deletes first node.&lt;br /&gt;Goto(l$, 5); // Goto 5th node.&lt;br /&gt;Del(l$); // Deletes 5th node.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Empty(l$); // Empty the whole list of all of its nodes.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In the next tutorial we will see how you can store different variable types like arrays and structures inside a list node.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2236952132951205947?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2236952132951205947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-34-linked-lists.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2236952132951205947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2236952132951205947'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-34-linked-lists.html' title='Tutorial 34 - Linked-lists'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1916361615513638190</id><published>2007-11-16T10:30:00.001-08:00</published><updated>2009-03-13T08:20:32.854-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 32 - Multiple Windows</title><content type='html'>&lt;h2&gt;Tutorial 32 - Multiple Windows&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Using Multiple Windows (by Brad Manske)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I'd want to address issues dealing with the creation of multiple windows in your PPL programs. This is not a tutorial on creating windows. It is more a collection of tips for when you do create multiple windows. ShowMessage is the most simple way to create a second window. It is useful for debugging and simple informational pop-up windows.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage("Hello World" + #13#10 + "and Country");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Take a look at the #13#10 added above. This is a Carriage Return/Line Feed added to produce a second line. By formatting the text, you can make this simple command very useful. The Windows MessageBox is the next step up in complexity. It allows you to set the owner, the text in the message box, the caption and some flags. In the example below, there is no owner, the question about saving, "Save" is placed into the caption bar, finally the "yes", "no" and "cancel" buttons are created inside the dialog box.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;i$ = MessageBox(NULL, "Do you want to save " + FileName$ + "?", "Save", MB_YESNOCANCEL);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;It is pretty obvious from the names below, which buttons get created when you use these constants.&lt;/p&gt;&lt;p&gt;MB_OK&lt;br /&gt;MB_OKCANCEL&lt;br /&gt;MB_ABORTRETRYIGNORE&lt;br /&gt;MB_YESNOCANCEL&lt;br /&gt;MB_YESNO&lt;br /&gt;MB_RETRYCANCEL&lt;/p&gt;&lt;p&gt;You can also specify an Icon to be placed in the MessageBox from the list below. Simply use the "|" OR operator. &lt;/p&gt;&lt;p&gt;For example MB_YESNOCANCEL | MB_ICONQUESTION &lt;/p&gt;&lt;p&gt;MB_ICONHAND&lt;br /&gt;MB_ICONQUESTION&lt;br /&gt;MB_ICONEXCLAMATION&lt;br /&gt;MB_ICONASTERISK&lt;br /&gt;MB_ICONWARNING = MB_ICONEXCLAMATION&lt;br /&gt;MB_ICONERROR = MB_ICONHAND&lt;br /&gt;MB_ICONINFORMATION = MB_ICONASTERISK&lt;br /&gt;MB_ICONSTOP = MB_ICONHAND&lt;/p&gt;&lt;p&gt;MessageBox has additional features. Refer to MSDN for all of them. MessageBox can return a value based when the button is pressed. These values are defined in Dialog.PPL.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#define IDOK 1&lt;br /&gt;#define IDCANCEL 2&lt;br /&gt;#define IDABORT 3&lt;br /&gt;#define IDRETRY 4&lt;br /&gt;#define IDIGNORE 5&lt;br /&gt;#define IDYES 6&lt;br /&gt;#define IDNO 7&lt;/span&gt;&lt;/p&gt;&lt;p&gt;I try to use these values when returning from displaying a dialog box. When using ShowModal to display a dialog any value less than 100 can be use for a button and it will return automatically, I try to avoid confusion and not change the meaning of the defined values. Going back to my MessageBox example from above, "Yes" and "No" are pretty clear answers, but what about "Cancel"? If you are asking to save the file in response to a command to exit the program, the program flow go like this. User selects the Exit menu item. The menu exit handler would send a&lt;br /&gt;WM_CLOSE command. Then you need a handler for the close event. In the Close event handler, call the MessageBox function and if you receive the "Cancel" ID, then return a FALSE from the OnClose event to stop the program from closing. The operation of the OnClose event is a little different in windows than it is in PPL. Windows will only send you an OnClose event when the entire application is closing. PPL allows you to open multiple windows per application and will send you an OnClose event for each window. This makes it easy in PPL to implement the ability to "Cancel" for each window. The next step is having more than one fully functional window for your application. For each new window that you create with the Form Editor, you need to:&lt;/p&gt;&lt;p&gt;• Select the Generate Library option in the Form -&gt; Options menu.&lt;br /&gt;• Change the form name so that a new windows class is created.&lt;br /&gt;• Give each control on the forms a unique name.&lt;br /&gt;• Give each control on the forms a unique ID. (required if getting the handles from the IDs)&lt;/p&gt;&lt;p&gt;For most forms you will probably want to select the "FormDefault" property. This property enables the use of the SIP (Soft Input Panel) on the PPC. You may open several windows for your program at the same time, then manage input by selectively showing the window that is needed. To Hide or Show a window use:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowWindow(FormHandle$, SW_HIDE); // or SW_SHOW&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In creating more complex windows, you need to be careful about which styles are selected. The example below is how I added styles in the creation code for a window. This was necessary because the WS_EX_CaptionOKBtn style prevented my window from displaying on the PC as it is a PPC only style. So if your window refuses to display at all, you should review the styles that you have used and isolate the trouble-maker.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ExStyles$ = GetWindowLong(SizeDlgHandle$, GWL_EXSTYLE);&lt;br /&gt;#ifdef _WIN32_WCE&lt;br /&gt;  // WS_EX_CAPTIONOKBTN is added here and not on the form because if added to&lt;br /&gt;  // the form then the form will not display on the PC&lt;br /&gt;  SetWindowLong(SizeDlgHandle$, GWL_EXSTYLE, ExStyles$ | WS_EX_CAPTIONOKBTN);&lt;br /&gt;#else&lt;br /&gt;  // WS_EX_TOOLWINDOW is added here for the same reason as above except it will&lt;br /&gt;  // not show on the PPC if present.&lt;br /&gt;  SetWindowLong(SizeDlgHandle$, GWL_EXSTYLE, ExStyles$ | WS_EX_TOOLWINDOW);&lt;br /&gt;#endif&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;I hope that this collection of tips has helped.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1916361615513638190?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1916361615513638190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-32-multiple-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1916361615513638190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1916361615513638190'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-32-multiple-windows.html' title='Tutorial 32 - Multiple Windows'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5747286619374356758</id><published>2007-11-16T10:30:00.000-08:00</published><updated>2009-03-13T08:20:32.832-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 33 - Creating dynamic PPL libraries.</title><content type='html'>&lt;h2&gt;Tutorial 33 - Creating dynamic PPL libraries.&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;strong&gt;Creating dynamic PPL libraries.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;PPL comes with some very powerful functions that looks very plain simple at first but when you start using them, only then can you understand their real power.&lt;br /&gt;&lt;br /&gt;The Run() function does exactly what it is suppose to, it runs a PPL program. However you can run a program but keep it in memory to access its internal functions. To keep a program from being freed from memory after it is ran, you need to use the following as your main code.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func WinMain&lt;br /&gt;  // Initialization code&lt;br /&gt;  return (true); // keep the program in memory&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You must also note, that since PPL comes with a built-in linker, all unused functions will be removed from the compiled code in memory. You must then force the functions not to be removed by the linker using the forcelink statement.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;forcelink func MyFunction (a$, b$)&lt;br /&gt;  // My function code&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once all your functions, procedures and main code are all setup it is time to load the library in memory.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;MyLib$ = Run(AppPath$ + "MyLibrary");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MyLib$ will contain the handle pointing to the compiled library. Notice that we didn't specify an extension to our file "MyLibrary". It is because PPL will detect if a .ppl or .ppc exists and use the right one. While developing your project leave the .ppl file there so that the code is recompiled as needed. When you distribute your program, just use the .ppc (compiled) file.&lt;br /&gt;&lt;br /&gt;Now it is time to call one of the library's function.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;result$ = Call(MyLib$, "MyFunction", 10, 20);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Call() function is very powerful, it can accept as many parameters as are needed by the called function or procedure and can return a value. In our case here, we call the function named "MyFunction" inside the program pointed to by MyLib$, passing the values 10 and 20.&lt;br /&gt;&lt;br /&gt;Once we are finished with the library, we can free it from memory using the KillApp() function. This will unload the program from memory.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;KillApp(MyLib$);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is our library file &lt;strong&gt;MyLibrary.ppl&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;forcelink func MyFunction(a$, b$)&lt;br /&gt;  return (a$ + b$);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;func WinMain&lt;br /&gt;  return (true);&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is our main program file &lt;strong&gt;Main.ppl&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  MyLib$ = Run(AppPath$ + "MyLibrary");&lt;br /&gt;  ShowMessage(Call(MyLib$, "MyFunction", 10, 20));  // Should show 30&lt;br /&gt;  KillApp(MyLib$);&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How do we use variables between libraries?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The first and easiest way would be to use global variables with the % sign.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;MyLibrary.ppl:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;forcelink func MyFunction&lt;br /&gt;  return (GlobalVar1% + GlobalVar2%);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;func WinMain&lt;br /&gt;  return (true);&lt;br /&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Main.ppl:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  GlobalVar1% = 10;&lt;br /&gt;  GlobalVar2% = 20;&lt;br /&gt;  MyLib$ = Run(AppPath$ + "MyLibrary");&lt;br /&gt;  ShowMessage(Call(MyLib$, "MyFunction"));  // Should show 30&lt;br /&gt;  KillApp(MyLib$);&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The second way to do this would be to have a DownloadVars and UploadVars procedures to transfer variables from and to a library.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;MyLibrary.ppl:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;forcelink proc DownloadVars(v1$, v2$);&lt;br /&gt;  LibVar1$ = v1$;&lt;br /&gt;  LibVar2$ = v2$;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;forcelink proc UploadVars$(v$)&lt;br /&gt;  v$ = result$;&lt;br /&gt;end;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;forcelink proc MyFunction&lt;br /&gt;  result$ = LibVar1$ + LibVar2$;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;func WinMain&lt;br /&gt;  Global(Result$);&lt;br /&gt;  return (true);&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Main.ppl:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  MyLib$ = Run(AppPath$ + "MyLibrary");&lt;br /&gt;  Call(MyLib$, "DownloadVars", 10, 20);&lt;br /&gt;  Call(MyLib$, "MyFunction");&lt;br /&gt;  Call(MyLib$, "UploadVars", &amp;amp;result$);&lt;br /&gt;  ShowMessage(result$);  // Should show 30.&lt;br /&gt;  KillApp(MyLib$);&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We hope this tutorial will give you a good idea on how to split your program into dynamic modules that you can load and unload when needed.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5747286619374356758?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5747286619374356758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-33-creating-dynamic-ppl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5747286619374356758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5747286619374356758'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-33-creating-dynamic-ppl.html' title='Tutorial 33 - Creating dynamic PPL libraries.'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-6197463771073405497</id><published>2007-11-16T10:29:00.000-08:00</published><updated>2009-03-13T08:20:32.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 31 - Packages</title><content type='html'>&lt;h2&gt;Tutorial 31 - Packages&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Packages Come In All Sizes (by Eric Pankoke)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There will be very few instances where you will need to distribute an application without some sort of supporting file set. Whether you’re building a database system or a multimedia application, you might have one or more directories filled with extra material that you don’t necessarily want the user to see outside of the application itself. PPL provides a nice mechanism for this through the use of a Package file. A package file is a file that can contain one or more files of any type all bundled up together into one file with a .pkg extension. You can create a package file pro grammatically or you can use the Package Manager supplied with PPL to do so. Run the PPL console (it’s called PPL.EXE, and resides under the RUNTIME directory of your PPL install). From the File menu, select Package Manger. You can use this tool to view, create and manage package files. It’s pretty self explanatory, so I won’t really go into details here. Once you’ve created a package file, you’ll of course want to use it in your program. To open a package&lt;br /&gt;file, you simply call:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;handle$ = OpenPackage(AppPath$ + “mydata.pkg”, key$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The first parameter is a full path and name to the file you wish to open, and the second parameter is the key used to unlock the package file. If a file with the name you’ve specified does not exist, OpenPackage will create it and use the value specified in key$ as the password. When creating a package file in the Package Manager you do not get the opportunity to supply a key, so key$ would be an empty string (“”). If you want a key, you will need to create the package pragmatically. You must be sure to keep track of the return value, as this is the handle that will be passed to all other package functions.&lt;/p&gt;&lt;p&gt;To retrieve the contents of a package file, call:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;PackageFiles(&amp;amp;lst$, handle$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will provide you with a list containing the names of all of the files contained in the package. Of course, you will probably know all of these names already, so let’s get to the heart of the matter: extracting and using the files. There are currently two ways of retrieving a file. The quickest way is to call the following:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;data$ = LoadPackageFile(handle$, “filename”);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This returns the contents of the file as a string in memory, which you can then display or manipulate however you choose. Currently, if the file is some sort of multimedia file or a database, this won’t be of much use to you. Starting in PPL v1.1, however, there are two new functions that will work in conjunction with LoadPackageFile called LoadSpriteFromMem and LoadSoundFromMem. These will be discussed more after 1.1 is released. For cases where you need to interact with the file in some way, you’ll want to call:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;tmpfile$ = ExtractFileFromPackage(handle$, “filename”);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This function will retrieve the contents of the requested file and store it in a temporary file. The return value is the name of the temporary file where the data is stored. So let’s say you wanted to retrieve a database, do some work on it, then store the database back to the package. The code would look something like this:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dbfile$ = ExtractFileFromPackage(handle$, “MyData.db”);&lt;br /&gt;dbhandle$ = sql_open(dbfile$);&lt;br /&gt;if(dbhandle$ &gt; 0)&lt;br /&gt;  //Check out the October newsletter for an SQLite primer&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dbnew$ = ExtractFilePath(dbfile$) % "aviator.db";&lt;br /&gt;MoveFile(dbfile$, dbnew$);&lt;br /&gt;AddFileToPackage(package$, dbnew$);&lt;br /&gt;DeleteFile(dbnew$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;If you will need to place the file back into the package after you’ve done your work with it, the 3 lines following end; are necessary. ExtractFileFromPackage creates a random name for the file, and AddFileToPackage takes the name of the file you’re adding and uses that as the name inside of the package. So, if you want to replace the file that exists in the package with the version your application has just modified, you need to rename it to match the name that exists in the package. ExtractFilePath returns the path portion of a path / file name string, so if you use that on the file path returned from ExtractFileFromPackage, then use the file name that was used to add the file to the package initially, you can rename the temp file so that it will be stored correctly in the package again. The final step to updating the package is:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;AddFileToPackage(handle$, “filename”);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The first parameter is that wonderful handle that was retrieved on your call to OpenPackage. filename is a string containing the full path and name of the file you wish to add. As mentioned before, the actual name of the file (no path) will be used to reference the file within the package. If you call AddFileToPackage with a file that already exists in the package, the file in the package will be replaced with the one you are adding. Finally, when all of your work is done and you don’t need the package any more, simply call:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ClosePackage(handle$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will make sure that the contents of the package have been updated and the handle will be released from memory.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-6197463771073405497?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/6197463771073405497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-31-packages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/6197463771073405497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/6197463771073405497'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-31-packages.html' title='Tutorial 31 - Packages'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1133142726981350397</id><published>2007-11-16T10:28:00.000-08:00</published><updated>2009-03-13T08:20:32.911-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 30 - Arrays in Structures</title><content type='html'>&lt;h2&gt;Tutorial 30 - Arrays in Structures&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Arrays in structures.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We have seen that structures can be defined as arrays using the TDIM() function. But what about having one element of the structure being an array of values? PPL offers a transparent way to do just this using the DIM() function. It will create an array from Lets first start by defining our variable structure:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct(s$, "a", "b");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Now lets dimension our element, in our case we will use s.a$:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim(s.a$, 10);&lt;br /&gt;s.a$[0] = 1;&lt;br /&gt;s.a$[1] = 2;&lt;br /&gt;s.b$ = 3;&lt;br /&gt;ShowMessage(s.a$[0] % "," % s.a$[1] % "," % s.b$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can even use strings with your array element, don't forget to use the @ operator to convert array elements to string since they only point to a pointer:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;s.a$[2] = "Hello World!";&lt;br /&gt;ShowMessage(@s.a$[2]);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As you see, structures are very flexible and quite efficient too. They can support multiple type of data, even arrays of double type values and even strings.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1133142726981350397?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1133142726981350397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-30-arrays-in-structures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1133142726981350397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1133142726981350397'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-30-arrays-in-structures.html' title='Tutorial 30 - Arrays in Structures'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5337564853595909980</id><published>2007-11-16T10:26:00.001-08:00</published><updated>2009-03-13T08:20:32.947-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 28 - List of Structures</title><content type='html'>&lt;h2&gt;Tutorial 28 - List of Structures&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;List of structures.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Now that we know about structures, how can we store multiple structures into one single variable? The best solution is either:&lt;/p&gt;&lt;p&gt;1. An array of structures&lt;br /&gt;2. List of structures.&lt;/p&gt;&lt;p&gt;Let's take a look at list of structures and later array of structures. Everytime you add a new item to a linked-list, the variable type is initialized, therefore you need to restructure the item.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;For (i$, 1, 10)&lt;br /&gt;  Add(l$);&lt;br /&gt;  struct(l$, "a", "b");&lt;br /&gt;  l.a$ = i$;&lt;br /&gt;  l.b$ = i$ + 10;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;ForEach(l$)&lt;br /&gt;  ShowMessage(l.a$ % "," % l.b$);&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;There is nothing more to add here other than the fact that you can define different types of structures for each list item. Powerful isn't it?&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5337564853595909980?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5337564853595909980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-28-list-of-structures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5337564853595909980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5337564853595909980'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-28-list-of-structures.html' title='Tutorial 28 - List of Structures'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5820876782612201167</id><published>2007-11-16T10:26:00.000-08:00</published><updated>2009-03-13T08:20:32.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 29 - Arrays of Structures</title><content type='html'>&lt;h2&gt;Tutorial 29 - Arrays of Structures&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Arrays of structures.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There comes a time when you need to store a series of data in the same format. Storing values in a structure will help clarify your code and your programming task as well. However, you might want to store more of the same data in multiple structures. This is where arrays of structures become very handy.&lt;/p&gt;&lt;p&gt;Lets first define our structure variable format:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct(s$, "a", "b");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Next we will make this structure an array but keeping the structure information at the same time. Notice we use TDIM() and not the regular DIM() function? The TDIM() function is a special function that can be used with structures only.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;tdim(s$, 10);&lt;br /&gt;s.a$[0] = 1;&lt;br /&gt;s.a$[1] = 2;&lt;br /&gt;ShowMessage(s.a$[0] % "," % s.a$[1]);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Arrays of structures are very ressemblant to lists of structures but offers an a great alternative is lists are too complicated for you.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5820876782612201167?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5820876782612201167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-29-arrays-of-structures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5820876782612201167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5820876782612201167'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-29-arrays-of-structures.html' title='Tutorial 29 - Arrays of Structures'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4747901880849924506</id><published>2007-11-16T10:25:00.001-08:00</published><updated>2009-03-13T08:20:32.996-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 26- Arrays</title><content type='html'>&lt;h2&gt;Tutorial 26- Arrays&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Introducing Arrays.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When it comes time to store multiple values into a single variable, we have two choices:&lt;/p&gt;&lt;p&gt;1. Use an array variable&lt;br /&gt;2. Use a linked-list variable&lt;/p&gt;&lt;p&gt;We will use the array variable for now since we will review the linked-list variable type in a later tutorial. PPL offers many ways to work with array variables, including arrays of different sizes and arrays of strings.&lt;/p&gt;&lt;p&gt;Arrays can be defined on local or global variables. To define an array, PPL comes with multiple functions to help you do this.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim(var$, 10);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will create an array of 10 elements of the default type TDOUBLE (8 bytes) for variable var$. To declare multi-dimensional arrays, do the following:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim(var$, 10, 10, 10);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can later access arrays just like other variables by specifying an offset within brakets [].&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim(var$, 10, 10);&lt;br /&gt;var$[0, 0] = 102.24;&lt;br /&gt;var$[9, 9] = 23.2873;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Notice that we use 0,0. Arrays offsets start at 0 and goes to the array size – 1. If your array size is 10, 10, then the minimum offset if 0,0 and the maximum offset is 9,9. To create arrays with custom element sizes, use SDIM().&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SDIM(var$, TBYTE, 10, 10);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will create an array of 10, 10 elements of type TBYTE (1 byte).&lt;/p&gt;&lt;p&gt;Now, what about strings? You will be happy to hear that PPL handles strings transparently with just a little twist. PPL stores only the string pointer address in the array's elements. Therefore the use of the @ operator is required to retrieve the string when accessing an array element.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim(var$, 10);&lt;br /&gt;var$[2] = "Jack Bower";&lt;br /&gt;var$[3] = "Joe Bloe";&lt;br /&gt;ShowMessage(@var$[2] % " " % @var$[3]);&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-4747901880849924506?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4747901880849924506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-26-arrays.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4747901880849924506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4747901880849924506'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-26-arrays.html' title='Tutorial 26- Arrays'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-6622122511344754962</id><published>2007-11-16T10:25:00.000-08:00</published><updated>2009-03-13T08:20:32.971-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 27 - Structures 2</title><content type='html'>&lt;h2&gt;Tutorial 27 - Structures 2&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Structures revisited!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Structures offers enormous flexibility when you design a program. They allow to store information in a nice clean way into your variables. I like to explain structures as a single record database. A structure is like a series of fields that can be stored in one record (the variable). Take the following example:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct (s$, "a", "b");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The variable s$ has two elements, a and b. Each element can contain a separate value. The default type for structure's elements is a TINT (4 bytes) value. You can also specify which value type the element will be holding.You have multiple choices here:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TBYTE&lt;/strong&gt; 1 byte&lt;br /&gt;&lt;strong&gt;TSHORT&lt;/strong&gt; 2 bytes&lt;br /&gt;&lt;strong&gt;TINT&lt;/strong&gt; 4 bytes&lt;br /&gt;&lt;strong&gt;TUINT&lt;/strong&gt; 4 bytes (unsigned)&lt;br /&gt;&lt;strong&gt;TWIDE&lt;/strong&gt; 4 bytes (unicode character string)&lt;br /&gt;&lt;strong&gt;TDOUBLE&lt;/strong&gt; 8 bytes&lt;br /&gt;&lt;strong&gt;TLONG&lt;/strong&gt; 8 bytes (no decimal)&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct (s$, "a", tbyte, "b", tdouble);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The following structure s$ would be 9 bytes in size. 1 byte for element a and 8 bytes for element b. If you need to specify your own size in bytes you can also easily do it:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct (s$, "a", tbyte, "b", 50);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Element b contains 50 bytes. Now how do you access the structure variable elements you ask? Noting is easier:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;s.a$ = 10;&lt;br /&gt;s.b$ = 20;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;What about strings in structures? You will see that PPL is very flexible but can also be a little more complex to use in some cases. You will need to be careful when using strings in structures. PPL either stores a pointer of the string that is assigned to the structure's element in the case where the element size is TINT, TUINT, TWIDE, TDOUBLE or TLONG. If the element size is a user-defined length, then the string is copied directly to the structure's element memory location.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct (s$, "a", "b", 50);&lt;br /&gt;s.a$ = "Hello World!";&lt;br /&gt;s.b$ = "Hello Again!";&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The main difference here is that the string "Hello World!" is not stored in s.a$ but rather stored somewhere in memory and only its pointer address is stored in s.a$. "Hello Again!" is stored directly into s.b$.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage(s.a$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If we try to access s.a$ like the previous code, only its pointer address value will be printed. To access s.a$ as a string we need to use the @ operator to convert a pointer to a string.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage(@s.a$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Now "Hello World!" will be printed in the dialog message. To access s.b$ no need to do anything special.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage(s.b$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will display "Hello Again!".&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-6622122511344754962?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/6622122511344754962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-27-structures-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/6622122511344754962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/6622122511344754962'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-27-structures-2.html' title='Tutorial 27 - Structures 2'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-235535585949292350</id><published>2007-11-16T10:23:00.000-08:00</published><updated>2009-03-13T08:20:33.037-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 25 - Screen origin</title><content type='html'>&lt;h2&gt;Tutorial 25 - Screen origin&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;What are your origins?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The screen display can be moved around. The starting origins are at coordinates (0, 0). You can move the screen in any direction. All the sprites will move according to the screen origins. You can design maps with lots of sprites on them, then scroll the whole map just changing the origin values.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SetOriginX(10);&lt;br /&gt;SetOriginY(-10);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If you need sprites such as interface icons to remain at certain physical screen coordinates (always visible), rather than coordinates that are relative to the origin, you will need to add the following options to the sprites:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SO_FIXED, SO_FIXEDX or SO_FIXEDY.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SO_FIXED will keep the sprite at the pixels they are assigned to, even if the origins of the screen are changed. SO_FIXEDX will keep the X axis of the sprite fixed while the SO_FIXEDY will keep the Y axis location of the sprite fixed.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-235535585949292350?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/235535585949292350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-25-screen-origin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/235535585949292350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/235535585949292350'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-25-screen-origin.html' title='Tutorial 25 - Screen origin'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-510534451675744569</id><published>2007-11-16T10:20:00.000-08:00</published><updated>2009-03-13T08:20:33.061-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 24 - Sprites</title><content type='html'>&lt;h2&gt;Tutorial 24 - Sprites&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Refresh your game with a sprite!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Now is the time to spice up your game knowledge and get into something really cool: Sprites. Remember the old days of the Nintendo (NES) or the Super Nintendo (SNES) video game consoles? Most games you played back then were using sprites. Sprites are basically just an image you can move around and animate. In PPL sprites are pretty advanced. You can stretch them, tint them, tile them, automatically animate them, and so much more...&lt;/p&gt;&lt;p&gt;Let’s first start by loading an image from disk as a sprite:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;MySprite$ = LoadSprite(AppPath$ + "mysprite.bmp", G_RGB(255, 0, 255), 4, 150, NULL);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You always need to retrieve the sprite handle from the LoadSprite() function to be able to access it later on. The sprite handle is just a unique integer value.&lt;/p&gt;&lt;p&gt;The first parameter of the LoadSprite() function is the pathname of the image you wish to use. The image file can be a bitmap (.bmp), a jpeg (.jpg), a Portable Image (.png) or a gif (.gif). The image file can be made of multiple images grouped together in one image file.&lt;/p&gt;&lt;p&gt;The second parameter is the transparent color to use. Sprites can be drawn on the screen with a transparent background to make them blend with the scenery.&lt;/p&gt;&lt;p&gt;The third parameter is the number of frames (images) the image file has.  The images must be sequential (one after the other) horizontally within the file, and they all must be the same width and height in pixels.&lt;/p&gt;&lt;p&gt;The fourth parameter is the speed in milliseconds at which the animation will be played. The default animation will swap between each frame one after the other from the left to the right.&lt;/p&gt;&lt;p&gt;The last parameter is the sprite procedure to use for the sprite. We will get into more advanced sprite handling in a later article.&lt;/p&gt;&lt;p&gt;The image is by default visible on the screen at position (0, 0). You can hide or show the sprite using the following:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;DelSpriteOption(MySprite$, SO_VISIBLE); // Hide the sprite by removing the SO_VISIBLE flag from the sprite's options.&lt;br /&gt;AddSpriteOption(MySprite$, SO_VISIBLE); // Show the sprite by adding the SO_VISIBLE flag to the sprite's options.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Each sprite has a series of special options that can be removed or added at any time.&lt;/p&gt;&lt;p&gt;Now let's move our sprite on the screen, to move the sprite all you need to do is call the MoveSprite() function and pass a new coordinate. In our case we will move the sprite to where the stylus touches the screen.&lt;/p&gt;&lt;p&gt;In the MainProc of our code we will add a WM_LBUTTONDOWN event that will be triggered whenever the stylus touches the screen:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;WM_LBUTTONDOWN:&lt;br /&gt;  MoveSprite (MySprite$, wParam$ - (SpriteWidth(MySprite$) / 2), lParam$ - (SpriteHeight(MySprite$) / 2));&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Here we center the sprite MySprite$ - which we should have made global at the time of loading (LoadSprite) - around the stylus position. SpriteWidth() returns the width in pixels of the sprite and SpriteHeight() return its height in pixels.&lt;/p&gt;&lt;p&gt;The WM_LBUTTONDOWN uses the wParam$ variable to store the X coordinate position and the lParam$ variable for the Y coordinate position the stylus was pointing to. You can write code for the following events:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;WM_LBUTTONDOWN&lt;/strong&gt;: The stylus is pressed.&lt;br /&gt;&lt;strong&gt;WM_LBUTTONUP&lt;/strong&gt;: The stylus is released from the screen.&lt;br /&gt;&lt;strong&gt;WM_MOUSEMOVE&lt;/strong&gt;: The stylus is being moved around while pressed.&lt;/p&gt;&lt;p&gt;You can stretch a sprite's display by doing the following:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SetSpriteWidth (MySprite$, 100);  // Makes the sprite 100 pixels wide.&lt;br /&gt;SetSpriteHeight (MySprite$, 200);  // Makes the sprite 200 pixels high.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can change the animation speed and sequence of a sprite, lets say you have frames for jumping at frame 6 to 10:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SetSpriteFrames (MySprite$, 6, 10, 250, true);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will set the current animation for MySprite$ from frames 6 to 10, animating at 250 milliseconds. The last parameter specifies if PPL should wait for the current animation timer to expire before going to the new animation frames or change right away.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-510534451675744569?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/510534451675744569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-24-sprites.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/510534451675744569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/510534451675744569'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-24-sprites.html' title='Tutorial 24 - Sprites'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5877017001942496319</id><published>2007-11-16T10:15:00.000-08:00</published><updated>2009-03-13T08:20:33.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 23 - GameAPI 2</title><content type='html'>&lt;h2&gt;Tutorial 23 - GameAPI 2&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Draw me a picture I don't get it!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The GameAPI screen is represented by a series of pixels organized on an x and y axis. Position (0, 0) is the top left of the screen and (240, 320) is the bottom right for the typical QVGA display on a PocketPC and (480, 640) is the bottom right for a typical VGA display device.&lt;/p&gt;&lt;p&gt;Drawing to the screen is very simple with the GameAPI, you just need to know where to place the drawing code. Since the first part of our series of articles on the GameAPI talked about a basic code template to create a GameAPI program, we need to focus a little more on the WM_PAINT event here. The WM_PAINT event is called every frame the GameAPI needs to draw to the screen. The WM_PAINT is placed in the game procedure code, like this:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func GameProc(hWnd$, Msg$, wParam$, lParam$)&lt;br /&gt;  case (Msg$)&lt;br /&gt;    WM_PAINT:&lt;br /&gt;      G_Clear(0);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;When you initialize the GameAPI you pass the GameProc pointer to the InitGameApiEx() function. PPL will then use this function to trigger custom events like WM_PAINT, WM_TIMER and WM_COLLIDE.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;InitGameAPIEx(h$, &amp;amp;GameProc, 240, 320, false, 5, 60);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Inside the WM_PAINT code you can put any type of drawing code you want, like g_clear(0) to clear the screen with a color you like, g_textout() to draw informative text and g_fillrect() to draw a rectangle. PPL comes loaded with a ton of drawing functions. PPL clears the screen in black by default if no WM_PAINT event is defined.&lt;/p&gt;&lt;p&gt;What if you want to draw something on the screen outside the WM_PAINT event code? It’s easy, but you need to follow some guidelines. You need to prepare the screen to be drawn to and when done you need to update the screen. Here is simple code to draw a rectangle, wait 5 seconds and then return to normal drawing of the screen either by triggering the WM_PAINT code or by simply clearing the screen with black.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;g_beginscene;&lt;br /&gt;g_fillrect(10, 10, 100, 100, g_rgb(100, 100, 100));&lt;br /&gt;g_update;&lt;br /&gt;delay(5000);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Be careful not to call g_beginscene() without calling a corresponding g_update(). Follow this rule and you will never have any problems.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5877017001942496319?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5877017001942496319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-23-gameapi-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5877017001942496319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5877017001942496319'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-23-gameapi-2.html' title='Tutorial 23 - GameAPI 2'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1782965396307959724</id><published>2007-11-16T10:12:00.001-08:00</published><updated>2009-03-13T08:20:33.122-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 21 - The Console</title><content type='html'>&lt;h2&gt;Tutorial 21 - The Console&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;The PPL Console (by Brad Manske)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A Console Program is a text only interface.  It is still a windows program but it eschews the Graphical User Interface (GUI) and event oriented programming for the sake of simplicity.  This is just the kind of program you want if your program just processes data and return results.  In most cases, when testing the compiler it is quicker and simpler to use the PPL console than to write a Windows GUI program.&lt;/p&gt;&lt;p&gt;To see an example of a console program open the "PPL IDE" link in the PPL program group.  Then select "Console..." from the file menu.  The PPL console will evaluate what you type on the input line at the bottom and display the results in the output window.&lt;/p&gt;&lt;p&gt;Typing:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  10+10&lt;enter&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;for example, will display 20&lt;/p&gt;&lt;p&gt;It will also work with variables.  Try this example:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  a$=10&lt;br /&gt;  b$=20&lt;br /&gt;  a$+b$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The output window will display&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&gt; a$=10&lt;br /&gt;10&lt;br /&gt;&gt; b$=20&lt;br /&gt;20&lt;br /&gt;&gt; a$+b$&lt;br /&gt;30&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The expressions that PPL can evaluate can be quite complex in this mode and it makes for a handy tool.  The real value in the console is using it in your own code.  "Hello World" looks like this for a console program:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#include "console.ppl"&lt;br /&gt;func WinMain&lt;br /&gt;   InitConsole;&lt;br /&gt;   ShowConsole;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;   write("Hello World");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;   return (true);&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Notice that this is a windows program, so it begins with WinMain.  The Console is created and then made visible on the screen.  The Write() statement sends the string to the console to be displayed.  A Writeln() command also exists that will start a new line after the string has printed.  The program ends by returning "true" so that the Console window stays open until the user closes it.&lt;/p&gt;&lt;p&gt;All that remains is to add your code in place of the write statement and you have a way to do unit testing on small pieces of your code.  Here are a few string handling operations to get you going:&lt;/p&gt;&lt;p&gt;Write  - Send a string to the console&lt;br /&gt;Writeln - Send a string to the console then start a new line&lt;br /&gt;+  - Concatenate 2 strings if alphanumeric ("ab"+"12"="ab12")&lt;br /&gt;+  - add the value of 2 strings if numeric ("10"+"10"="20")&lt;br /&gt;%  - Concatenate 2 strings ("ab"+"12"="ab12" or "10"+"10"="1010")&lt;br /&gt;"\n"  - advance to the next line on the console&lt;/p&gt;&lt;p&gt;If you want even more control over how the console displays your data, then consult the manual for the "sprintf" statement.  C language programmers will recognize this powerful formatting statement.  For example:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;MyValue$ = 1234;&lt;br /&gt;sprintf(tmpString$, "Value printed in an 8 char field %8d", MyValue$);&lt;br /&gt;write(tmpString$);  // "    1234"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If you've followed along so far, you get rewarded with the best tip for using the console, which I have saved for last.  ShowMessage() is often used to show the state of the program at some point to help with debugging.  But sometimes it doesn't work or you spend all day clicking "OK" because you have to go through a large amount of data before you get to the point in the data where it  doesn't work.  Instead of dealing with all of that hassle, use the Console.&lt;/p&gt;&lt;p&gt;Create your window, and after the User Interface has been created add InitConsole() &amp;amp; ShowConsole().  Write out the debug statements and before exiting save the console to a file.  Now you can search for the case you’re interested in with a text editor.&lt;/p&gt;&lt;p&gt;You should enclose all of the Console calls in #ifdef statements so that they can easily be removed for a production build.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#undefine ProductionBuild   // change to #define for no console&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#ifndef ProductionBuild&lt;br /&gt;#include "console.ppl"&lt;br /&gt;#endif&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func WinProc&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  // your code - create UI or call the form creation.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#ifndef ProductionBuild&lt;br /&gt;  InitConsole;&lt;br /&gt;  ShowConsole;&lt;br /&gt;#endif&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  // your code&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#ifndef ProductionBuild&lt;br /&gt;  Writeln("Show interesting data in your code.");&lt;br /&gt;#endif&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  return(true);&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;That is the quick run down on the console.  I've never tried using the Console to log the progress inside a game.  I'm hoping that some game designer out there will give this a try.  If you do, please tell us all about it in the Forums at &lt;a href="http://www.arianesoft.ca/forum.php"&gt;http://www.arianesoft.ca/forum.php&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1782965396307959724?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1782965396307959724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-21-console.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1782965396307959724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1782965396307959724'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-21-console.html' title='Tutorial 21 - The Console'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1780522953081541312</id><published>2007-11-16T10:12:00.000-08:00</published><updated>2009-03-13T08:20:33.104-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 22 - Launch programs</title><content type='html'>&lt;h2&gt;Tutorial 22 - Launch programs&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;How to launch an executable from PPL (by Eric Pankoke)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;For any number of reasons, you might want to launch an external program from your PPL application.  It’s actually rather simple to do.  First of all, if you’re not writing a GUI application, you need to include the following file:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#include "windows.ppl"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;If you want to launch a program and have it open normally, here’s a quick function to do so:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc LaunchProgram(path$)&lt;br /&gt;  #ifdef _WIN32_WCE&lt;br /&gt;    path$ = wide(path$);&lt;br /&gt;    verb$ = wide("open");&lt;br /&gt;  #else&lt;br /&gt;    verb$ = "open";&lt;br /&gt;  #endif&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  struct(info$, SHELLEXECUTEINFO);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  info.cbSize$ = sizeof(info$);&lt;br /&gt;  info.lpFile$ = &amp;amp;path$;&lt;br /&gt;  info.nShow$ = SW_SHOWNORMAL;&lt;br /&gt;  info.fMask$ = SEE_MASK_NOCLOSEPROCESS;&lt;br /&gt;  info.lpVerb$ = &amp;amp;verb$;&lt;br /&gt;  result$ = ShellExecuteEx(&amp;amp;info$);&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;For more details on how this works, look up the ShellExecuteEx() function on MSDN.  To launch an application, you use “open” for the lpVerb member of the SHELLEXECUTEINFO structure.  Other supported verbs are dependent on the program that you are attempting to launch, and it will be up to you to figure those out.  Path$ should be a fully qualified path / file name combination.  Below is a quick demonstration that you can use in a non-GUI application to see how this works:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func WinMain()&lt;br /&gt;  #ifdef _WIN32_WCE&lt;br /&gt;    LaunchProgram(GetWinDir() + "addrbook.exe");&lt;br /&gt;  #else&lt;br /&gt;    LaunchProgram(GetWinDir() + "&lt;/span&gt;&lt;a href="file://notepad.exe/"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;\\notepad.exe&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;");&lt;br /&gt;  #endif&lt;br /&gt;&lt;br /&gt;  return(false);&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1780522953081541312?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1780522953081541312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-22-launch-programs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1780522953081541312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1780522953081541312'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-22-launch-programs.html' title='Tutorial 22 - Launch programs'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-7711363980472167374</id><published>2007-11-16T10:11:00.000-08:00</published><updated>2009-03-13T08:20:33.147-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 20 - Structures</title><content type='html'>&lt;h2&gt;Tutorial 20 - Structures&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Put some structure in your life!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Life can be a real succession of disorder sometimes. Don't let this way of life turn your programs into nightmares. Put some structure into your code. Variables are a great way to organize and store information, but you need to classify this information into clean and organized structures to be able to keep your code expandable for the future.&lt;/p&gt;&lt;p&gt;A typical variable can be declared and accessed quite easily in PPL. You declare its scope (local or global) if wanted and then you assign values into it. Nothing new here. What if you have a whole lot of information you want to store into variables? Are you going to create one variable for each value you need to store? If you have answered yes to this question, you need to read further as you will discover that structured variables will give you benefits you probably never considered.&lt;/p&gt;&lt;p&gt;Let’s pretend we need to write a simple three questions survey program. We need to gather user information first and then the user’s answers to three questions. You could do the following:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Name$ = "Alain Deschenes";&lt;br /&gt;Address$ = "Somewhere somehow";&lt;br /&gt;Tel$ = "555-555-5555";&lt;br /&gt;Age$ = "32";&lt;br /&gt;Occupation$ = "Too busy";&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Question1$ = "His answer #1";&lt;br /&gt;Question2$ = "His answer #2";&lt;br /&gt;Question3$ = "His answer #3";&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This will probably turn into a real nightmare when you reach 500 lines of code or more. What if you spell a variable wrong? What if you need to add user information and questions?&lt;/p&gt;&lt;p&gt;With structured variables (called structures), you can group a series of variables into what you might call categories. In our scenario here, we would need a user$ structure and a questions$ structure. Each structure will hold a series of variables.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct(user$, "Name", "Address", "Tel", "Age", "Occupation");&lt;br /&gt;struct(questions$, "Question1", "Question2", "Question3");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;User.Name$ = "Alain Deschenes";&lt;br /&gt;User.Address$ = "Somewhere somehow";&lt;br /&gt;User.Tel$ = "555-555-5555";&lt;br /&gt;User.Age$ = "32";&lt;br /&gt;User.Occupation$ = "Too busy";&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Questions.Question1$ = "His answer #1";&lt;br /&gt;Questions.Question2$ = "His answer #2";&lt;br /&gt;Questions.Question3$ = "His answer #3";&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Yes it is longer to write but if you use this technique you are guaranteed to get great benefits in the long run.&lt;/p&gt;&lt;p&gt;You can declare as many structure elements as you want inside the Struct() function. Each element you declare is by default a double type variable that can hold pretty much any numerical value. However you can change the type of element you need. There are multiple variable types that PPL can support including:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TBYTE&lt;/strong&gt; : 1 byte value. Range from 0 to 255.&lt;br /&gt;&lt;strong&gt;TSHORT&lt;/strong&gt; : 2 bytes value. Range from 0 to 65535.&lt;br /&gt;&lt;strong&gt;TINT&lt;/strong&gt; : 4 bytes value.&lt;br /&gt;&lt;strong&gt;TUINT&lt;/strong&gt; : 4 bytes unsigned value.&lt;br /&gt;&lt;strong&gt;TDOUBLE&lt;/strong&gt; : 8 bytes value. Support decimal point.&lt;/p&gt;&lt;p&gt;You can create a structure that will hold 4 bytes with 4 elements of 1 byte each.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct(mystruct$, "a", tbyte, "b", tbyte, "c", tbyte, "d", tbyte);&lt;br /&gt;mystruct.a$ = 1;&lt;br /&gt;mystruct.b$ = 2;&lt;br /&gt;mystruct.c$ = 3;&lt;br /&gt;mystruct.d$ = 4;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can also define a custom number of bytes the element will hold. You can then access each byte of the element variable using [x] array syntax.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;struct(mystruct$, "element", 256);&lt;br /&gt;mystruct.element$[34] = 20;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can also copy one structure to another variable by doing the following:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;newstruct$ = mystruct$;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can also pass structures as parameters of funcs or procs like this:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc MyProc (s$)&lt;br /&gt;  s.a$ = 10;&lt;br /&gt;  s.b$ = 20;&lt;br /&gt;  s.c$ = 30;&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  struct(mystruct$, "a", "b", "c");&lt;br /&gt;  MyProc (&amp;amp;mystruct$);&lt;br /&gt;  ShowMessage(mystruct.a$ + ", " + mystruct.b$ + ", " + mystruct.c$);&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-7711363980472167374?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/7711363980472167374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-20-structures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7711363980472167374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7711363980472167374'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-20-structures.html' title='Tutorial 20 - Structures'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4896256512336302962</id><published>2007-11-16T10:10:00.001-08:00</published><updated>2009-03-13T08:20:33.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 18 - All about forms</title><content type='html'>&lt;h2&gt;Tutorial 18 - All about forms&lt;/h2&gt;   &lt;p&gt;&lt;strong&gt;All About Forms&lt;/strong&gt; &lt;em&gt;by Richard Gamester&lt;/em&gt;&lt;/p&gt;&lt;p&gt;By now you have had a play with PPL., tried creating a form, maybe even started to write a program!&lt;br /&gt;So now is the time to learn a bit more about forms and how the compiler keeps track of all your code!&lt;/p&gt;&lt;p&gt;Start PPL and click &lt;strong&gt;Project &gt; New&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In the new project window. select &lt;strong&gt;Blank Project&lt;/strong&gt;, then type a different name where it says project name. In this document I will use "Test" but the choice is yours. Click the Ok button.&lt;/p&gt;&lt;p&gt;PPL will create a new folder of that name in your project folder.&lt;/p&gt;&lt;p&gt;Click &lt;strong&gt;Tools &gt; Visual Editor&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A new form will then be created and displayed in the window.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Click an item in the "controls" tool bar, lets say a button (OK).&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tool.gif" style="border: 0px solid black; width: 68px; height: 121px;" alt="Tool.gif" /&gt;&lt;/p&gt;&lt;p&gt;Now it is time to save your form, click &lt;strong&gt;File &gt; Save&lt;/strong&gt; and save the file in your new folder as &lt;strong&gt;Test.frm&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Double click your button. PPL will create a procedure for the (default) &lt;strong&gt;OnClick&lt;/strong&gt; event&lt;br /&gt;Type in a ShowMessage command like this:&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.arianesoft.ca/e107_images/ShowMsg.gif" style="border: 0px solid black; width: 457px; height: 84px;" alt="ShowMsg.gif" /&gt;&lt;/p&gt;&lt;p&gt;Right click the &lt;strong&gt;#button101&lt;/strong&gt; tab and select close. When asked, say Yes to save it. &lt;/p&gt;&lt;p&gt;With the form showing, click the &lt;strong&gt;Form &gt; Initalization Section Code&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Form.gif" style="border: 0px solid black; width: 200px; height: 274px;" alt="Form.gif" /&gt; &lt;/p&gt;&lt;p&gt;In the new window type a comment like&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;// Initalization code here!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Right click on the #%init tab and select close, when asked say yes to save.&lt;/p&gt;&lt;p&gt;Now click &lt;strong&gt;Form &gt; Form Creation Code&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In the new window type a comment like&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;// Form code in here!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Right click on the &lt;strong&gt;#%create&lt;/strong&gt; tab and select &lt;strong&gt;close&lt;/strong&gt;, when asked say yes to save.&lt;br /&gt;&lt;br /&gt;Let's see the result&lt;/p&gt;&lt;p&gt;Click &lt;strong&gt;Form &gt; Create Source&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;What you see now is the PPL file generated from your work so far. On about line 10 you will see your comment:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;// Initalization code here!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This is where you would put the &lt;strong&gt;#include&lt;/strong&gt; statements for other PPL files that you needed in your project.&lt;/p&gt;&lt;p&gt;Following this are the button events (the close menu item is created for you) and the one in which you typed the ShowMessage. In fact, the events for all your controls will be in this area.&lt;/p&gt;&lt;p&gt;Then we get into the form creation code, it starts:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func WinMain&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This is where PPL writes all the code required to create your form. Right down at the bottom, you will see:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#code&lt;br /&gt;  // Form code in here!&lt;br /&gt;  return (true);&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You will see that the "form creation code" is just an extension of the PPL generated WinMain function code. The return (true) is added by PPL.&lt;/p&gt;&lt;p&gt;Note that what you are seeing is code generated by PPL. &lt;strong&gt;Do NOT try to edit this as your changes will be lost!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;PPL keeps the all the events for initialization, form creation and form components separate. This makes it far easier for the user (honest)!  It also allows PPL to remove the code if you delete the component.&lt;/p&gt;&lt;p&gt;If you want to edit the form sections you have to return to the form and use the Form menu. For control events double click the control or use the events menu.&lt;/p&gt;&lt;p&gt;Lines like this&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#code &lt;/span&gt;&lt;/p&gt;are just commands to the compiler to include your text from the Test.frm file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-4896256512336302962?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4896256512336302962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-18-all-about-forms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4896256512336302962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4896256512336302962'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-18-all-about-forms.html' title='Tutorial 18 - All about forms'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-7440050779461775604</id><published>2007-11-16T10:10:00.000-08:00</published><updated>2009-03-13T08:20:33.170-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 19 - Keep your code separate</title><content type='html'>&lt;h2&gt;Tutorial 19 - Keep your code separate&lt;/h2&gt;   &lt;p&gt;&lt;strong&gt;Keep your code separate&lt;/strong&gt; &lt;em&gt;by Richard Gamester&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Following on from All About Forms, I would like to tell you about keeping your code safe.&lt;br /&gt;No, not backup's - that should be normal practice, but the best way to control your ever expanding code, but first we need to understand this bit of the PPL window:&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Project.gif" style="border: 0px solid black; width: 257px; height: 82px;" alt="Project.gif" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;This is your friend the Project Manager, this is where you can list all the parts of your project. As before, I will be using my Test project, in the folder Test. The first thing you need to do is add your form. Click the green plus icon and open the Test.frm file. Do not be tempted to add the Test.ppl file of the same name, it will only confuse you later. This file is the one auto-generated by PPL.&lt;/p&gt;&lt;p&gt;The Project Manager is the quickest way to open your form (frm) or code file (ppl) if you close them in the main window. To be safe, you should place all your main-line code in additional .ppl files.&lt;br /&gt;Doing this is quite simple:&lt;/p&gt;&lt;p&gt;Click &lt;strong&gt;File &gt; New&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You now have a blank form to put your code in! But I suggest you do the housekeeping first and..&lt;/p&gt;&lt;p&gt;Click &lt;strong&gt;File &gt; Save&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Save  your new file and call it something meaningful like Test2.ppl, save it in the project folder with the Test.frm file, then add it to the project list in the same way as you loaded the form.&lt;/p&gt;&lt;p&gt;The next thing to do is tell PPL about your file. &lt;/p&gt;&lt;p&gt;This is quite simple, just add a statement like this to the Form &gt; Initalization Section Code area..&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#include "Test2.ppl"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can then cut and paste your code as procedures or functions in the new file &lt;/p&gt;&lt;p&gt;Here is one last thought. If your routine Test2.ppl relies on several sub routines, these can be put in Test3.ppl.&lt;/p&gt;&lt;p&gt;But this time put the #include for it at the top of the Test2.ppl file.&lt;/p&gt;This has the advantage that your sub-routines are defined before the calling code, so you will not need to use forward statements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-7440050779461775604?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/7440050779461775604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-19-keep-your-code-separate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7440050779461775604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7440050779461775604'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-19-keep-your-code-separate.html' title='Tutorial 19 - Keep your code separate'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-8433818165943180218</id><published>2007-11-16T10:09:00.001-08:00</published><updated>2009-03-13T08:20:33.233-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 16 - Getting a list of all files in a folder</title><content type='html'>&lt;h2&gt;Tutorial 16 - Getting a list of all files in a folder&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;How do I get the list of files in a folder?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You need to extract all the possible information from a folder but don't know where to start? Look no further, PPL offers a great flexibility when it comes to using Windows API functions.&lt;/p&gt;&lt;p&gt;The following code will open up the console and output all the files that are contained in the C:\Program Files\PPL\Runtime\ folder.&lt;/p&gt;&lt;p&gt;A new list item is created to store all the filenames.&lt;/p&gt;&lt;p&gt;Imagine the possibilities... The fd$ structure contains important information about each file scanned, like: File attributes, Creation Time, Last Access Time, Last Write Time, File Size and Filename.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#include "console"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func WinMain&lt;br /&gt;  InitConsole;&lt;br /&gt;  ShowConsole;&lt;br /&gt;&lt;br /&gt;  List(files$);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  struct(fd$, WIN32_FIND_DATA);&lt;br /&gt;  i$ = FindFirstFile("c:\\Program Files\\PPL\\*.*", &amp;amp;fd$);&lt;br /&gt;  if (i$ != INVALID_HANDLE_VALUE)&lt;br /&gt;    repeat&lt;br /&gt;      Add(files$, char(fd.cFilename$));&lt;br /&gt;    until (FindNextFile(i$, &amp;amp;fd$) == false);&lt;br /&gt;    FindClose(i$);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  ForEach(Files$);&lt;br /&gt;    Writeln(Files$);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  return (true);&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-8433818165943180218?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/8433818165943180218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-16-getting-list-of-all-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8433818165943180218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/8433818165943180218'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-16-getting-list-of-all-files.html' title='Tutorial 16 - Getting a list of all files in a folder'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2052693130507438550</id><published>2007-11-16T10:09:00.000-08:00</published><updated>2009-03-13T08:20:33.212-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 17 - Handling double-clicks in PPL</title><content type='html'>&lt;h2&gt;Tutorial 17 - Handling double-clicks in PPL&lt;/h2&gt;   &lt;p&gt;&lt;strong&gt;Handling double-clicks in PPL&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Windows doesn't simplify the task of handling double-clicks. It makes hard for us. Here is a piece of code to simplify your life a little.#declare GetDoubleClickTime apidll GetDoubleClickTime 0 1&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#declare GetDoubleClickTime apidll GetDoubleClickTime 0 1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func mainproc(hWnd$, Msg$, wParam$, lParam$)&lt;br /&gt;  // Make ClickCount$ global&lt;br /&gt;  global(ClickCount$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  ok$ = true;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  case (Msg$)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    WM_CLOSE: // Window is closed&lt;br /&gt;      ShutGameAPI(hWnd$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    WM_LBUTTONDOWN: // Stylus is pressed.&lt;br /&gt;      // Get double click time set in milliseconds in Windows.&lt;br /&gt;      t$ = GetDoubleClickTime;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;      // Add 1 to our clickcount variable.&lt;br /&gt;      ClickCount$++;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;      // Loop for double-click time processing windows messages.&lt;br /&gt;      lasttime$ = tick;&lt;br /&gt;      while (tick - lasttime$ &lt; t$)&lt;br /&gt;        HandleMessage;&lt;br /&gt;      end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;      // If only one click is used it is a single-click.&lt;br /&gt;      if (ClickCount$ == 1)&lt;br /&gt;        g_ShowMessage("Single-click");&lt;br /&gt;        ClickCount$ = 0;&lt;br /&gt;      else&lt;br /&gt;        g_ShowMessage("Double-click");&lt;br /&gt;        ClickCount$ = 0;&lt;br /&gt;      end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    WM_KEYDOWN: // A hardware key or software key is pressed.&lt;br /&gt;      PostMessage(hWnd$, WM_CLOSE, 0, 0);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  return (ok$);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You can apply this to sprite functions as well on the WM_LBUTTONDOWN event.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2052693130507438550?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2052693130507438550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-17-handling-double-clicks-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2052693130507438550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2052693130507438550'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-17-handling-double-clicks-in.html' title='Tutorial 17 - Handling double-clicks in PPL'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4703973561431254038</id><published>2007-11-16T10:08:00.000-08:00</published><updated>2009-03-13T08:20:33.250-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 15 - Installing PPL manually</title><content type='html'>&lt;h2&gt;Tutorial 15 - Installing PPL manually&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Installing PPL manually on your PDA / Smartphone&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The beauty of PPL is that it can run on most StrongARM or XScale powered devices running under PocketPC 2000, 2002, Windows Mobile 2003, 2003se and 2005. However the installer can give you a hard time if your device is not recognized.&lt;/p&gt;&lt;p&gt;There is a solution for you. Install PPL manually. Sounds complicated? Not at all. Here are the steps you will need to follow.&lt;/p&gt;&lt;p&gt;1. Install the latest version of PPL on your desktop PC.&lt;br /&gt;&lt;br /&gt;2. Copy the files inside the RUNTIME folder over to your phone using ActiveSync. Copy all the files inside C:\Program Files\PPL\Runtime\*.* to \Program Files\PPL\.&lt;br /&gt;&lt;br /&gt;3. Copy PPL.EXE from your PC at the location: C:\Program Files\PPL\PPC\WM2003\PPL.EXE to your phone at \Program Files\PPL\PPL.EXE&lt;br /&gt;&lt;br /&gt;4. Now copy \Program Files\PPL\PPC\WM2005\gsgetfile.dll to \ProgramFiles\PPL\gsgetfile.dll&lt;br /&gt;&lt;br /&gt;5. On your phone, go into the File Manager application and run \Program Files\PPL\PPL.EXE.  The device might ask questions about whether to trust this application, answer yes.  It will come up eventually and setup. When done, exit the application.&lt;br /&gt;&lt;br /&gt;6. On your PC, start up the PIDE application.  At the far right, there is a dropdown box for the target, set the target to Target-&gt;Pocket PC.&lt;br /&gt;&lt;br /&gt;7. Now compile and run.  Again, the first time (or few times) you do this, the device might complain about untrusted applications, continue to answer yes to running them.  After answering yes you will see your application run.&lt;br /&gt;&lt;br /&gt;If you want to make a standalone application that runs on your device, go to the menus in PIDE, and select&lt;br /&gt;Run / Make Executable. This will make an executable of your project file into the \My Documents directory on your device. The first time you run it, you'll get the untrusted application message, but after that it will just run.&lt;br /&gt;&lt;br /&gt;NOTE: The IDE does not run properly on the Motorola Q at this moment due to the screen size, in the meantime you can use the PIDE on your desktop.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thanks to Rick Eesley for his instructions and patience!&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-4703973561431254038?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4703973561431254038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-15-installing-ppl-manually.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4703973561431254038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4703973561431254038'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-15-installing-ppl-manually.html' title='Tutorial 15 - Installing PPL manually'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-322375764723159177</id><published>2007-11-16T10:07:00.000-08:00</published><updated>2009-03-13T08:20:33.268-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 14 - Distributing your PPL application.</title><content type='html'>&lt;h2&gt;Tutorial 14 - Distributing your PPL application.&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Distributing your PPL applications.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You are now done testing and debugging your application. It is time to distribute it to your clients or sell it. PPL offers a multitude of ways to do this.&lt;/p&gt;&lt;p&gt;The first method of distribution is to create an executable file (.exe), pack all your files in a zip file and send it over. The second method is to distribute the PPL compiled file (.ppc) file. It is a compressed and encrypted bytecode version of your source code. If you do this you will need to distribute the PPL.EXE application that you can rename to your liking ex: MyApp.exe. You will now need to rename the MyApp.ppc file to Autorun.ppc. PPL looks for Autorun.ppl or Autorun.ppc file at launch time.&lt;/p&gt;&lt;p&gt;Let's review each method one by one:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Create an executable.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There are two ways to generate an executable file in PPL. First you need Pro version to do this. You can use the PIDE by selecting Run / Make Executable. You have a couple choices here:&lt;/p&gt;&lt;p&gt;1. Type of executable you want to generate.&lt;/p&gt;&lt;p&gt;Desktop PC executable.&lt;br /&gt;PocketPC 2000, 2002 compatible executable.&lt;br /&gt;Windows Mobile 2003, 2003se and 2005 compatible executable.&lt;/p&gt;&lt;p&gt;2. Icon file. Allow you to select an icon for your executable file.&lt;/p&gt;&lt;p&gt;3. Use compressed library. This will use the compressed libraries to build your executable. Compressed libraries are about 3 times smaller than normal library files but they can be a little slower to load on some machines.&lt;/p&gt;&lt;p&gt;The second way is to use the main PPL interface on the PocketPC. Here the options you can set:&lt;/p&gt;&lt;p&gt;1. Root file. This is the PPL file to create an executable with.&lt;/p&gt;&lt;p&gt;2. Exe type. Select the executable format to generate. These are the same settings as on the PIDE above.&lt;/p&gt;&lt;p&gt;3. Compressed runtimes. Same as the PIDE.&lt;/p&gt;&lt;p&gt;Once your executable is created you will need to include the external support files that will be used by your application. That is bitmap image files, sound files, text files, data files, etc... It is good practice to keep all files within the same folder or in seperate folders within the root folder of your application.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Extra files that will need to be distributed with your application:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;gsgetfile.dll&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you plan on using the GetFile() or PutFile() functions, you might want to distrbute this file along with your application. This .dll file will provide a nice file dialog selection that is an improvement over the standard Windows Mobile or PocketPC OS default dialog.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;sqlite_pc.dll&lt;/strong&gt; or &lt;strong&gt;sqlite_ppc.dll&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you use any SQLite functions within your application, these two files will need to be included in the root folder of your application. Be careful because there are two seperate sqlite_dll.dll files. One is for the PC and the other is for the PocketPC. The SQL.PPL library file will load the correct one depending on the version of the executable. It's preferable to provide the correct one for each platform.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;vgarom.fnt&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This is the default font used by the GameAPI. If you make a game or an application that uses the GameAPI you will need to include this file in the root folder of your application else the FPS and default fonts won't appear on the screen.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-322375764723159177?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/322375764723159177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-14-distributing-your-ppl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/322375764723159177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/322375764723159177'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-14-distributing-your-ppl.html' title='Tutorial 14 - Distributing your PPL application.'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2568380097479407533</id><published>2007-11-16T10:06:00.001-08:00</published><updated>2009-03-13T08:20:33.310-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 13 - Game API #1</title><content type='html'>&lt;h2&gt;Tutorial 13 - Game API #1&lt;/h2&gt;   &lt;p&gt;&lt;strong&gt;PPL Game Programming - Part 1 - Game code structure.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;PPL comes with a very powerful set of gaming functions called the GameAPI. The GameAPI comes in two different flavors. The first is the standard edition which does not contain the physic engine and the particles engine. You can create very nice games without them as well. In this first article of the series, we will concentrate on how games are handled in PPL.&lt;/p&gt;&lt;p&gt;Designing a game is a long and tedious process. You have to lay down your plan well in advance before even writing a single line of code. When it comes time to write the game you are often presented with low-level functions where you have to create custom routines to handle your particular kind of game. Writing a game engine requires good knowledge and time. With PPL, you can cut this step, saving days, weeks even months of hard work. The GameAPI will offer plenty of power for any type of 2D game programming.&lt;/p&gt;&lt;p&gt;The first step when you write a game with PPL is to start with a solid code structure that you will use as your starting template for all your future projects, unless you use the Game Level Editor that comes with the PIDE, the code generated by the GLE (Game Level Editor) has the same basic code structure as you will have here.&lt;/p&gt;&lt;p&gt;Let's review our code structure:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#include "GameAPI.ppl"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func mainproc(hWnd$, Msg$, wParam$, lParam$)&lt;br /&gt;  ok$ = true;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  case (Msg$)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    WM_CLOSE:&lt;br /&gt;      ShutGameAPI(hWnd$);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    WM_KEYDOWN:&lt;br /&gt;      g_KeyEvent(wParam$, True);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    WM_KEYUP:&lt;br /&gt;      g_KeyEvent(wParam$, False);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  return (ok$);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func GameProc(hWnd$, Msg$, wParam$, lParam$)&lt;br /&gt;  case (Msg$)&lt;br /&gt;    WM_PAINT:&lt;br /&gt;      G_Clear(0);&lt;br /&gt;      RenderSprites;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    WM_TIMER:&lt;br /&gt;      if (g_key.vkA$)&lt;br /&gt;        PostMessage(hWnd$, WM_CLOSE, 0, 0);&lt;br /&gt;      end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  end;&lt;br /&gt;  return (true);&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func WinMain&lt;br /&gt;  h$ = newform(, , &amp;amp;mainproc);&lt;br /&gt;  ShowWindow(h$, SW_SHOW);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  InitGameAPIEx(h$, &amp;amp;GameProc, 240, 320, false, 5, 60);&lt;br /&gt;  ShowFPS(true, G_RGB(255, 255, 255));&lt;br /&gt;&lt;br /&gt;  return (true);&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;At the first line of code we include the GameAPI library into our project. This is where most of the GameAPI constants are defined. Some really handy functions are defined in as well. The mainproc function is where all GameAPI events are handled. The first event we will handle by default is the WM_CLOSE, which is triggered when the GameAPI main form is closed. Here we need to shutdown the GameAPI by calling ShutGameAPI(hWnd$). It is generally here that you will free all global objects. Sprites are freed by the function automatically. If you load surfaces manually, it is a good place to free them. Next we handle the WM_KEYDOWN and WM_KEYUP events. When a key is pressed (hardware keys on the PocketPC device), a keydown is triggered, then when the key is released, the keyup event is triggered. This code is pretty standard, a special function is called to set the g_key$ structure values, then you can easily check to see which key is being pressed and it supports multiple key presses too.&lt;/p&gt;&lt;p&gt;Next, every game as to have a main code function. At every internal cycle this function will be called. This is where you will handle game specific events like painting and timer. The painting can be handled manually using the WM_PAINT event or if you set the G_AutoDraw(True) right after the InitGameAPIEx() line, PPL will handle the drawing of sprites for you. If you use manual painting, the whole screen as to be repainted, that is why we clear the screen with G_Clear(0). Zero is the color of the background, black in this case. The RenderSprites() function will paint all sprites on screen with the correct layer order and everything. The WM_TIMER is called every game code cycle. We will see later how to change the cycle rate with the SetAISpeed() function. Here is a good place to check for key pressed. In our case if the hardware A key is pressed, we send a close message to the main game form.&lt;/p&gt;&lt;p&gt;The WinMain function is where PPL will start executing instructions for this program. Here we need to create a new form, display it using the ShowWindow() function. Next we need to initialize the GameAPI and the sound engine. InitGameAPIEx() will do all this work for us. We need to tell it what form will be used for the game display (h$), which main game code function to use (&amp;amp;GameProc), the resolution of the game (240x320 QVGA), the fullscreen parameter as to be false. Next is the cycle rate at which to call the WM_TIMER event in the main game function (&amp;amp;GameProc). Every 5 milliseconds PPL will try to trigger the WM_TIMER event. The last parameter is the maximum frames per second to display. 60 is a good generic value, it's smooth, gives time to the main game code to be executed and won't slow down the game by trying to draw unnecessary frames. Next we want to display the FPS (frames per second) information on screen. You might want to turn this off when your game is finished and you are ready to distribute it.&lt;/p&gt;&lt;p&gt;Finally we return a value of true to tell PPL to keep the application alive that it hasn't been closed.&lt;/p&gt;This is a very basic game code structure. We will get into more details with sprites and their internal functions, pixel-perfect collision detection, sprite's mass, friction and velocity, particles and so much more as the series evolve. See you next month and happy game creation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2568380097479407533?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2568380097479407533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-13-game-api-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2568380097479407533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2568380097479407533'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-13-game-api-1.html' title='Tutorial 13 - Game API #1'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5265490555058816621</id><published>2007-11-16T10:06:00.000-08:00</published><updated>2009-03-13T08:20:33.287-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>PIDE Shortcut Keys</title><content type='html'>&lt;h2&gt;PIDE Shortcut Keys&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Shortcut keys in the PIDE by Brad Manske&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;By now you've opened up PIDE and used it for a while.  Hopefully everyone has noticed the&lt;br /&gt;keyboard shortcuts placed in the menus.  Here are a few that are very helpful, but not so&lt;br /&gt;obvious.&lt;/p&gt;&lt;p&gt;In PIDE's Game Level Editor try &lt;shift&gt;+&lt;mouse&gt; while a sprite is selected, this will&lt;br /&gt;Create a new sprite copying the original sprites properties.&lt;/p&gt;&lt;p&gt;In PIDE's Visual Form Builder:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The &lt;esc&gt; key will select the Form Control.&lt;/li&gt;&lt;li&gt;If you need a little help, F1 will bring up VFB Help and &lt;ctrl&gt;+F1 will bring up the MSDN help for the selected control.&lt;/li&gt;&lt;li&gt;Hold down the &lt;ctrl&gt; key and move the mouse over the form.  This will show dashed lines from the mouse position to the ruler to help align controls on the form.&lt;/li&gt;&lt;li&gt;Arrow keys can move a control by 1 pixel at a time to get things lined up perfectly.&lt;/li&gt;&lt;li&gt;When editing controls that can use a list (GroupBox, ListBox, TabControl, etc...) select "Caption" in the properties and then press F5.  You can enter values to preload into these control.&lt;/li&gt;&lt;li&gt;If you need to select a color for the properties, use F4.&lt;/li&gt;&lt;li&gt;If you need to select a filename for the properties, use F3.&lt;/li&gt;&lt;li&gt;If you need to select a true/false value for properties, &lt;ctrl&gt;+T will enter true and &lt;ctrl&gt;+F will enter false.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For those of you that are not keyboard jockies, right click on the properties to bring up the context&lt;br /&gt;menu with the options for the properties.&lt;/p&gt;&lt;p&gt;Here is a reference card for those who could use it&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PIDE Editor ShortCut Keys:&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;  &lt;ctrl&gt;-N           New&lt;br /&gt;  &lt;ctrl&gt;-O           Open&lt;br /&gt;  &lt;ctrl&gt;-S           Save file&lt;br /&gt;  &lt;ctrl&gt;-P           Print&lt;br /&gt;  &lt;ctrl&gt;-Z           Undo&lt;br /&gt;  &lt;shift&gt;&lt;ctrl&gt;-Z    Redo&lt;br /&gt;  &lt;ctrl&gt;-X           Cut&lt;br /&gt;  &lt;ctrl&gt;-C           Copy&lt;br /&gt;  &lt;ctrl&gt;-V           Paste&lt;br /&gt;  &lt;ctrl&gt;&lt;del&gt;        Delete&lt;br /&gt;  &lt;shift&gt;&lt;ctrl&gt;-C    Comment Code&lt;br /&gt;  &lt;ctrl&gt;-R           RGB color&lt;br /&gt;  &lt;ctrl&gt;-D           Format Code&lt;br /&gt;  &lt;ctrl&gt;-G           Goto Line Number&lt;br /&gt;  &lt;ctrl&gt;-F           Find&lt;br /&gt;  &lt;shift&gt;&lt;ctrl&gt;-F    Find in Files&lt;br /&gt;  &lt;ctrl&gt;-F3          Find Again&lt;br /&gt;  &lt;ctrl&gt;-H           Replace&lt;br /&gt;  &lt;ctrl&gt;-F11         Find Definition&lt;br /&gt;  &lt;shift&gt;-F11        Open Selected File&lt;br /&gt;  &lt;shift&gt;-F8         Line Profile Result&lt;br /&gt;  &lt;ctrl&gt;-F7          Run&lt;br /&gt;  &lt;ctrl&gt;-F9          Dedicated Run&lt;br /&gt;  F7                 Compile&lt;br /&gt;  F5                 Debug&lt;br /&gt;  F10                Step Over&lt;br /&gt;  F11                Step Into&lt;br /&gt;  &lt;ctrl&gt;-F10         Run to Cursor&lt;br /&gt;  &lt;shift&gt;-F5         Stop&lt;br /&gt;  F9                 Toggle Breakpoints&lt;br /&gt;  &lt;ctrl&gt;-B           Breakpoint Window&lt;br /&gt;  &lt;ctrl&gt;-F7          Watches Window&lt;br /&gt;  &lt;ctrl&gt;-F12         File Manager&lt;br /&gt;  F12                Visual Form Builder&lt;br /&gt;  &lt;ctrl&gt;-G           Procedures List&lt;br /&gt;  F4                 Goto Map...&lt;br /&gt;  &lt;shift&gt;&lt;ctrl&gt;&lt;del&gt; Clear a controls code.&lt;br /&gt;  F1                 Help&lt;br /&gt;  &lt;ctrl&gt;-F1          MSDN Help&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;PIDE VFB ShortCut Keys:&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;  F1                 VFB Help&lt;br /&gt;  &lt;ctrl&gt;+F1          MSDN help on selected control&lt;br /&gt;  F3                 Select FileName for properties&lt;br /&gt;  F4                 Select Color for properties&lt;br /&gt;  F5                 Edit List of values for control&lt;br /&gt;  &lt;esc&gt;              Focus on the Form Control&lt;br /&gt;  &lt;ctrl&gt;             Show Alignment lines&lt;br /&gt;  &lt;ctrl&gt;+T           Enter True for properties&lt;br /&gt;  &lt;ctrl&gt;+F           Enter False for properties&lt;br /&gt;  &lt;arrow&gt;       Move selected control by one pixel.&lt;/pre&gt;&lt;p&gt;PIDE Game Level Editor ShortCut Keys:&lt;/p&gt;&lt;pre&gt;  &lt;shift&gt;+&lt;click&gt;    create a copy of the selected sprite.&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5265490555058816621?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5265490555058816621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/pide-shortcut-keys.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5265490555058816621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5265490555058816621'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/pide-shortcut-keys.html' title='PIDE Shortcut Keys'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5713313106531996864</id><published>2007-11-16T10:05:00.000-08:00</published><updated>2009-03-13T08:20:33.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 12 - SQL</title><content type='html'>&lt;h2&gt;Tutorial 12 - SQL&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;An SQL Primer by Eric Pankoke.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SQLite is a nice, lightweight database available for both the PC and PocketPC, and can be accessed through PPL using the Sql.ppl header.  If you are interested in adding database support to your applications, I strongly suggest giving SQLite a try, since the database format is identical between the Windows and Windows CE platforms.  Here’s a quick look at how to use SQLite.&lt;/p&gt;&lt;p&gt;Of course, you’ll first want to open the database.  You must keep in mind that SQLite’s open function will create a database if one with the specified name does not exist, so if your application should not run unless using a database supplied with the install, make sure you check for the existence of the file before calling the open function.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if not (FileExists(AppPath$ + “mydata.db”))&lt;br /&gt;  ShowMessage(“Data does not exist.  Please reinstall application”);&lt;br /&gt;  //Exit function or possibly application&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;db$ = SqlOpen(AppPath$ + “mydata.db”);&lt;br /&gt;if(db$ == 0)&lt;br /&gt;  ShowMessage(“error opening database”);&lt;br /&gt;  //Exit function or possibly application&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Now you have a variable called db$ that holds a reference to your database.  To retrieve data from a table, simply do the following:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;rs$ = SqlExec(db$, “SELECT * FROM tblName”, &amp;amp;data$, &amp;amp;rows$, &amp;amp;cols$);&lt;br /&gt;if(rs$ &lt;&gt; SQLITE_OK)&lt;br /&gt;  ShowMessage(“Error retrieving data”);&lt;br /&gt;  //Exit function or possibly application&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;If rows$ is greater than 0, data was found in the table.  Data$ is a list containing all of the elements retrieved from the SqlExec command.  The first “row” in the list contains the name of each column.  To navigate through the data, you could do something like the following:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;for(row_cnt$, 1, row$)&lt;br /&gt;  for(col_cnt$, 1, cols$)&lt;br /&gt;    goto(data$, col_cnt$ - 1);&lt;br /&gt;    data_name$ = data$;&lt;br /&gt;    goto(data$, (row_cnt$ * cols$) – 1 + (col_cnt$ - 1));&lt;br /&gt;    data_value$ = data$;&lt;br /&gt;    ShowMessage(data_name$ + “ = “ + data_value$);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Finally, you need to make sure you close the database.  To do this, simply call the following:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SqlClose(db$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;A demo called SqlDemo.ppl comes with PPL, demonstrating some more SQLite commands, such as creating tables and inserting data.  For a comprehensive list of the commands supported by SQLite, check out this web site: &lt;a href="http://www.sqlite.org/"&gt;http://www.sqlite.org&lt;/a&gt;.  Remember that PPL currently supports version 2.8.x of SQLite, so information specific to version 3.x of SQLite don’t apply here.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5713313106531996864?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5713313106531996864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-12-sql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5713313106531996864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5713313106531996864'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-12-sql.html' title='Tutorial 12 - SQL'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1907363897700957744</id><published>2007-11-16T10:04:00.000-08:00</published><updated>2009-03-13T08:20:33.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 11 - Arrays</title><content type='html'>&lt;h2&gt;11 - Arrays&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;The world of Arrays&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;PPL has a very strong array system. Just like a good programming language PPL offers multi-dimensional arrays but arrays in PPL can store about anything. There is a big difference.&lt;/p&gt;&lt;p&gt;Arrays in PPL are like C arrays, the base index is 0 and not 1. The first element of an array is always 0 and the last is the size of array - 1.&lt;/p&gt;&lt;p&gt;You can store numbers or strings in arrays. Strings are a little special since they are stored as pointers only. You can have strings of any size in each element of an array. Since strings are stored as pointers you will need to convert them to strings in order to use them with functions in PPL. The good news is that PPL offers an easy-to-use operator that will do just that. The @ operator must be used with an expression (usually a variable) and will convert the result value to the string pointed by the pointer value.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim (a$, 10);  // Creates an array of 10 elements&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;a$[0] = 10.4567;  // Set first array element to value of 10.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;a$[1] = "HELLO";  // Set second array element to&lt;br /&gt;                            the pointer of string "HELLO".&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage (a$[0]);  // Shows 10.4567&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage (a$[1]);  // Shows the pointer value of&lt;br /&gt;                                   the string and not the string itself.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage (@a$[1]);  // Shows "HELLO".&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage (@(a$[1] + 2));  // Shows "LLO";&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;There is way to obtain the size of the array by using the sizeof() function:&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage (sizeof(a$));  // Shows 80. 10 elements * 8 bytes each.&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Remember that arrays uses double type values to store eveything? Double type values are 8 bytes long.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Multi-dimensional arrays are created and uses the following way:&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim (a$, 10, 10, 10);&lt;br /&gt;a$[1,1,2] = 293.42;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;You can also create arrays using your own element type.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;To get an array of bytes:&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SDIM (a$, TBYTE, 20);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;amp;a$ = "ARRAY OF BYTES";&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ShowMessage(a$[3]);  // Shows 65.&lt;br /&gt;ShowMessage(chr(a$[3]));  // Shows "A".&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;What about an array of integer values?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;SDIM(a$, TINT, 10, 10);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;a$[5,5] = 1023;&lt;br /&gt;a$[0,0] = 1983;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do you iterate through an array?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There are multiple ways to iterate through a list. The first and easiest is to use the &lt;strong&gt;For&lt;/strong&gt; loop.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim(a$, 10, 10);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;For (x$, 0, 9)&lt;br /&gt;  For (y$, 0, 9)&lt;br /&gt;    a$[x$, y$] = x$ * y$;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The second is to use the &lt;strong&gt;ForEach&lt;/strong&gt;.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim(a$, 5, 5);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;i$ = 0;&lt;br /&gt;ForEach (a$, s$);&lt;br /&gt;  s$ = i$++;&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Another way is to use the &lt;strong&gt;While &lt;/strong&gt;or the &lt;strong&gt;Repeat&lt;/strong&gt; loops:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim (a$, 10);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;x$ = 0;&lt;br /&gt;i$ = 0;&lt;br /&gt;while (x$ &lt; 10)&lt;br /&gt;  a$[x$] = i$++;&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;x$ = 0;&lt;br /&gt;i$ = 0;&lt;br /&gt;repeat&lt;br /&gt;  a$[x$] = i$++;&lt;br /&gt;until (x$ &gt;= 10);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Remember that arrays can be used to store Structs and Objects. We will see in future tutorials how to do this.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1907363897700957744?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1907363897700957744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-11-arrays.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1907363897700957744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1907363897700957744'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-11-arrays.html' title='Tutorial 11 - Arrays'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2725162233504280469</id><published>2007-11-16T10:02:00.000-08:00</published><updated>2009-03-13T08:20:33.480-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 9 - Strings</title><content type='html'>&lt;h2&gt;Tutorial 9 - Strings&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="http://www.arianesoft.ca/e107_images/abecedaire.jpg" style="border: 0px solid black; width: 112px; height: 150px;" alt="abecedaire.jpg" /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;No strings attached!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Ha! the wonderful world of strings. PPL is the language of choice for strings. It is very versatile, flexible and support many operators you won't see in many languages.&lt;/p&gt;&lt;p&gt;Strings are also managed by an intelligent garbage collector that will create and free the memory as needed.&lt;/p&gt;&lt;p&gt;Variables containing a string are zero-based indexed and are always terminated by a character 0. They can be accessed as arrays to obtain specific characters:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;s$ = "ABCDEFG";&lt;br /&gt;c$ = s$[0];  // c$ = "A"&lt;br /&gt;c$ = s$[0, 2];  // c$ = "AB"&lt;br /&gt;c$ = s$[2, 0];  // c$ = "FG"&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;If the second array element is 0, it will take x characters from the end of the string, where x is the first array element specified.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Some operators support strings just like numbers.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;"Hello " + "World!"&lt;/span&gt;&lt;br /&gt;This will add two strings together. The result string will now be "Hello World!"&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;"10" + "20"&lt;/span&gt;&lt;br /&gt;Since both strings contain numbers, PPL will convert them to numbers and add them, the result will be a value of 30. It won't be a string anymore. How do I add them as a string to give a result of "1020" you ask?&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;"10" % "20"&lt;/span&gt;&lt;br /&gt;This will concatenate two strings no matter what type they are. The result will be a string "1020". The same thing would have happen by doing "10" % 20 or 10 % 20, the result will be a string "1020".&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;"ABC" - "B"&lt;/span&gt;&lt;br /&gt;This will remove all B's from the "ABC" string. In this example the resulting string will be "AC".&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;"ABC" - 2&lt;/span&gt;&lt;br /&gt;This will truncate the string by 2 characters from the right. The resulting string will be "A".&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;"ABC" * 2&lt;/span&gt;&lt;br /&gt;The string "ABC" will be multiplied two times, the resulting string will be "ABCABC".&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;"ABC" / 3&lt;/span&gt;&lt;br /&gt;This will divide the string "ABC" in three parts. In our case the strings "A", "B" and "C" will be returned to the stack and will need to be stored into variables, to do this do the following:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;A$, B$, C$ = "ABC" / 3;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Variable A$ will contain string "A", variable B$ "B" and C$ "C".&lt;/p&gt;&lt;p&gt;It does not stop here. PPL comes with a full set of string functions.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Conversion&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;PPL variables can store either a string value or a numeric value (double type). You can switch between the two types by doing the following:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;a$ = 10;&lt;br /&gt;a$ = str(a$);&lt;br /&gt;a$ = int(a$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;PPL will take care of using the appropriate type when needed you won't have to worry about variable type conversion but sometimes having a little bit of control helps. The following code is perfectly valid:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;a$ = 10;&lt;br /&gt;ShowMessage (a$);&lt;br /&gt;a$ = "2";&lt;br /&gt;ShowMessage (mid ("ABCDEF", a$, 2));&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2725162233504280469?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2725162233504280469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-9-strings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2725162233504280469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2725162233504280469'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-9-strings.html' title='Tutorial 9 - Strings'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-433986110201501378</id><published>2007-11-16T10:01:00.001-08:00</published><updated>2009-03-13T08:20:33.517-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 7 - SWAPI</title><content type='html'>&lt;h2&gt;Tutorial 7 - SWAPI&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="http://www.arianesoft.ca/e107_images/align.jpg" style="border: 0px solid black; width: 175px; height: 118px;" alt="align.jpg" /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Using the Simplified Windows API library.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The Windows API is the very low-level basic of all you see on your screen when using Windows. Forms, buttons, comboboxes, etc... are all windows really just painted differently. To move windows around, resize them, change their caption or text, the Windows API is versatile but very complex to use for beginners. The best reference site is the venerable MSDN (Microsoft Developer Network) which can be reached at &lt;a href="http://www.msdn.com/"&gt;www.msdn.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;PPL is meant to be an easy-to-use language. The SWAPI (Simplified Windows API) is a library that we have created to simplify interaction with windows controls and forms. There are many sets of functions that are grouped in categories each function name following a naming convention.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;For listbox controls, we have ListBox_Add to add an item to the list and for comboboxes we have ComboBox_Add to add an item to the list as well.&lt;/p&gt;&lt;p&gt;We have already learned how to design a form using the PIDE we will now learn how to interact with the controls on our form using the SWAPI library.&lt;/p&gt;&lt;p&gt;If you use the Visual Form Builder in the PIDE or the VFB on the PocketPC the SWAPI library is automatically included in your code file but if you are designing the form with code only, you will need to include the SWAPI.PPL library file in your code, here is how to do it:&lt;/p&gt;&lt;p&gt;#include "swapi"&lt;/p&gt;&lt;p&gt;We think the best way to learn how to use the SWAPI is to give you situations followed by an answer.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How I hide or show my forms?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Form_Show (FormHandle$)&lt;br /&gt;Form_Hide (FormHandle$) &lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I move my form around?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Form_Move (FormHandle$, x$, y$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I resize my form?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Form_Resize (FormHandle$, Width$, Height$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I close a form?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Form_Close (FormHandle$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I change the caption of a form?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Form_Set (FormHandle$, Caption$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I move a control around?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Control_Move (ControlHandle$, x$, y$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I resize a control?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Control_Resize (ControHandle$, Width$, Height$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I hide or show a control?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Control_Show (ControlHandle$)&lt;br /&gt;Control_Hide (ControlHandle$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I set the text from an edit control?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Edit_Set (EditHandle$, NewText$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I get all list items from a listbox?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;ListBox_SaveToList (ListHandle$, List$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I save all the list items from a listbox?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;ListBox_SaveToFile (ListHandle$, Filename$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I load list items from a file?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;ListBox_LoadFromFile (ListHandle$, Filename$)&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I change the font of a control?&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Control_SetFont (ControlHandle$, FormHandle$, FontName$,&lt;br /&gt;FontSize$, Bold$, Italic$, Underline$)&lt;/pre&gt;&lt;p&gt;By now you should get the idea. Review the SWAPI.PPL file from the Lib\ folder to get the full list of functions.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-433986110201501378?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/433986110201501378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-7-swapi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/433986110201501378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/433986110201501378'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-7-swapi.html' title='Tutorial 7 - SWAPI'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-3584904317615335150</id><published>2007-11-16T10:01:00.000-08:00</published><updated>2009-03-13T08:20:33.497-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 8 - Multiple Forms in a project</title><content type='html'>&lt;h2&gt;Tutorial 8 - Multiple Forms in a project&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="http://www.arianesoft.ca/e107_images/MultipleWindows_preview.jpg" style="border: 0px solid black; width: 184px; height: 120px;" alt="MultipleWindows_preview.jpg" /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Using multiple forms in a project&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The first thing you should know about forms in PPL is that they are auto-converted to a .ppl file at compile time and if you don't specify the form is a library type form PPL will generate code to create and display the form within a &lt;strong&gt;WinMain&lt;/strong&gt; function. This is perfectly fine for a single form project but in a multi-form project it will cause the compiler to give you an error that you have duplicate WinMain functions.&lt;/p&gt;&lt;p&gt;The solution is very simple. First you need to make sure that your non-main forms will be generated as library type forms, to do this in the PIDE, go to &lt;strong&gt;Form -&gt; Form Options -&gt; Generate Library&lt;/strong&gt; and make sure this menu item is checked. For this example we will save our form file to &lt;strong&gt;MyForm.frm&lt;/strong&gt;. At compile time PPL will generate a new MyForm.ppl file and it will create a new function called &lt;strong&gt;Form100Create ()&lt;/strong&gt; instead of a &lt;strong&gt;WinMain&lt;/strong&gt;. Notice that our form name needs to be &lt;strong&gt;Form100&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;You will now need to include this .ppl file in the code or form you want to call this new form from. A simple &lt;strong&gt;#include "myform"&lt;/strong&gt; will do the trick. Now where to place it you ask? The Initialization section code is the best place, go to &lt;strong&gt;Form -&gt; Initialization section code&lt;/strong&gt; and add the following line:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#include "myform"&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Once the form file is included in your main form, it is time to create Form100 in memory and display it. In your code where you want to do this, you will need to do the following:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;f$ = Form100Create;&lt;br /&gt;Form_Show (f$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Once you don't need the form anymore, this could be done in the MyForm code, you need to destroy the form from memory by doing the following:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Form_Close (f$);&lt;br /&gt;Form_Destroy (f$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Make sure f$ is valid. You will probably need to call this code from another form. Just closing the form won't destroy it from memory.&lt;/p&gt;&lt;p&gt;If you want MyForm to be a dialog box type form, in the PIDE, make sure Form -&gt; Form Options -&gt; Dialog Form is also checked. This will make the form a special dialog box type form when created. Your calling code will look something like this:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;f$ = Form100Create;&lt;br /&gt;if (ShowModal (f$, NULL, false) == 1)&lt;br /&gt;  // do some code here&lt;br /&gt;end;&lt;br /&gt;Form_Destroy (f$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The &lt;strong&gt;ShowModal()&lt;/strong&gt; function takes three parameters. The first one is the form handle of the dialog to show, the second is the control to set the focus on when the dialog is shown, this value can be left to NULL, the first control that can get focus will get it and finally the last parameter is whether you want the dialog to be fullscreen or not on the PocketPC, this last value is generally false.&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How do I set buttons to close my dialog form and return a specific value?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;PPL offers a very easy way to do this. The trick is in the ID of the button. If you want to create an &lt;strong&gt;OK&lt;/strong&gt; button, set the button ID to a value of &lt;strong&gt;1&lt;/strong&gt;. To create a &lt;strong&gt;Cancel&lt;/strong&gt; button, set the ID to a value &lt;strong&gt;2&lt;/strong&gt;. All buttons with an ID less than a value of 100 will close the dialog form and return the ID has a result to the &lt;strong&gt;ShowModal()&lt;/strong&gt; function. This way you are not limited and can create up to 99 buttons that can close a dialog form and each return a specific value. You can create &lt;strong&gt;Ignore&lt;/strong&gt;, &lt;strong&gt;Retry&lt;/strong&gt;, &lt;strong&gt;Yes To All&lt;/strong&gt;, &lt;strong&gt;No To All&lt;/strong&gt; buttons with ease.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-3584904317615335150?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/3584904317615335150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-8-multiple-forms-in-project.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/3584904317615335150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/3584904317615335150'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-8-multiple-forms-in-project.html' title='Tutorial 8 - Multiple Forms in a project'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-7405141561440030312</id><published>2007-11-16T10:00:00.000-08:00</published><updated>2009-03-13T08:20:33.538-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial - Enable VGA/WM2005 in PPL</title><content type='html'>&lt;h2&gt;Tutorial - Enable VGA/WM2005 in PPL&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Enabling VGA in PPL and Window Mobile 5.0 compatibility&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;To enable VGA, you will a third-party program like Force Hi-Resolution Tool. Check the following article from the PocketPC Magazine: &lt;a href="http://www.pocketpcmag.com/forum/topic.asp?TOPIC_ID=15471"&gt;http://www.pocketpcmag.com/forum/ topic.asp?TOPIC_ID=15471&lt;/a&gt; to download and install the application.&lt;/p&gt;&lt;p&gt;You can then add PPL.EXE or your own program's executable file generated with PPL to the list.&lt;/p&gt;&lt;p&gt;You can also use Tweaks2k2 to create an .MUI file that you can distribute with your application to enable VGA display. We recommend this solution for an easier distribution. Force Hi-Resolution Tool needs to be installed on the target device to enable VGA. With Tweaks2k2 solution you don't need to install anything other than distributing the .MUI file.&lt;/p&gt;&lt;p&gt;For VGA game development you will need to change the GameAPI InitGameAPIEx resolution to 480 x 640 for normal display or 640 x 480 for landscape display.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ex:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;InitGameAPIEx&lt;/strong&gt; (h$, NULL, &lt;strong&gt;480&lt;/strong&gt;, &lt;strong&gt;640&lt;/strong&gt;, false, 0, 0);&lt;/p&gt;&lt;p&gt;The last step is to replace the gsgetfile.dll file with a Windows Mobile 5.0 compatible version.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Rename the file gsgetfile.dll from \Program Files\PPL\ to gsgetfile_ppc2000.dll &lt;/li&gt;&lt;li&gt;Copy the file gsgetfile_wm2005.dll to \Program Files\PPL\&lt;/li&gt;&lt;li&gt;Rename the file gsgetfile_wm2005.dll to \Program Files\PPL\ to gsgetfile.dll&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Et voila, the file selection dialog will look correct on Windows Mobile 2005.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-7405141561440030312?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/7405141561440030312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-enable-vgawm2005-in-ppl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7405141561440030312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7405141561440030312'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-enable-vgawm2005-in-ppl.html' title='Tutorial - Enable VGA/WM2005 in PPL'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1825831059842138982</id><published>2007-11-16T09:55:00.000-08:00</published><updated>2009-03-13T08:20:33.561-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>PPL Tech Notes</title><content type='html'>&lt;h2&gt;PPL Tech Notes&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="http://www.arianesoft.ca/e107_images/technotesLogo.gif" style="border: 0px solid black; width: 250px; height: 53px;" alt="technotesLogo.gif" /&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How to use strings in arrays?&lt;br /&gt;&lt;/strong&gt;Each element of an array is by default a double type value (8 bytes). Strings cannot be stored directly in an array element, therefore only the string pointer is stored in the array. If you get the value of an array element that is pointing to a string, all you will get is a memory address location where the string is located. You need to use the @ operator to convert the pointer to a string.:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main dim(array$, 10);&lt;br /&gt;  array$[0] = "THIS IS A STRING";&lt;br /&gt;  array$[1] = "THIS IS ANOTHER STRING";&lt;br /&gt;  ShowMessage(@array$[0]);&lt;br /&gt;  ShowMessage(@array$[1]);&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do return an array from a func?&lt;br /&gt;&lt;/strong&gt;Returning an array from a function is quite easy but to assign the new array returned to a variable can be tricky if you don't know how. You need to use the &amp;amp; operator to assign a new pointer to the variable.:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func mytest&lt;br /&gt;  dim(array$, 10);&lt;br /&gt;  Fill(array$, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);&lt;br /&gt;  return (array$);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;proc main&lt;br /&gt;  dim(newarray$, 10);&lt;br /&gt;  &amp;amp;newarray$ = mytest;&lt;br /&gt;  For(i$, 0, 9)&lt;br /&gt;    ShowMessage(newarray$[i]);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How do I use linked-list as parameters?&lt;br /&gt;&lt;/strong&gt;Linked-list variables are very special. They are usually perceived as single values to the PPL interpreter unless you use special list functions with them. Passing linked-lists as parameters can only be done by passing them as pointers.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc test(l$)&lt;br /&gt;  add(l$, 10, 20, 30);&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  list(l$);&lt;br /&gt;  test(&amp;amp;l$);&lt;br /&gt;  ForEach(l$)&lt;br /&gt;    ShowMessage(l$);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What if you don't know the size of an array returned from a func?&lt;br /&gt;&lt;/strong&gt;In order to return an array from a function, you have to make sure you have declared an array that is large enough to hold the data that gets returned.The ForEach statement works, but it loops over all elements of the target array. Make sure that you process your subset of values and not the garbage at the end of the array.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How do I create a linked-list?&lt;br /&gt;&lt;/strong&gt;A linked-list is made of a infinite (memory capacity is your only limit) number of elements linked together. You can build lists by adding elements, inserting element and removing elements. You can access elements of a list directly by it's index location or by moving forward or backward within the list.:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;List(l$);&lt;br /&gt;Add(l$, 1, 2, 3, 4, 5, 6, 7);&lt;br /&gt;Goto(l$, 2);&lt;br /&gt;ShowMessage(l$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The list variable will always contain the value of the list element the list cursor is on. You can move this cursor by using the Goto() function or the First(), Last(), Next() or Prior() functions.:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;First(l$);&lt;br /&gt;ShowMessage(l$);&lt;br /&gt;Next(l$);&lt;br /&gt;ShowMessage(l$);&lt;br /&gt;Prior(l$);&lt;br /&gt;ShowMessage(l$);&lt;br /&gt;Goto(l$, 2);&lt;br /&gt;ShowMessage(l$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I move elements within the list?&lt;br /&gt;&lt;/strong&gt;You can move elements to different position within the list by using the LMove() function.:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;List(l$);&lt;br /&gt;Add(l$, 1, 2, 3, 4, 5, 6);&lt;br /&gt;LMove(l$, 0, 3);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The list will now contain the following elements:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;2, 3, 4, 1, 5, 6&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How do I copy a list to an array?&lt;br /&gt;&lt;/strong&gt;In PPL it is possible to copy a list to an array by doing the following:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;list(l$);&lt;br /&gt;add(l$, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);&lt;br /&gt;Dim(a$, 10);&lt;br /&gt;ListToArray(l$, a$);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Can I use a WIN32 API function?&lt;br /&gt;&lt;/strong&gt;The #declare statement can be used to map WIN32 API functions to PPL.  The syntax is:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#declare PPL_Alias DLL_Name Win32API_Nam&lt;br /&gt;e #InputParams #OutputParms&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;You can use this to call an API function that hasn't been declared yet. Most declares are in Windows.PPL. Here is an example:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#declare GetWindow apidll GetWindow 2 1&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The DLL_Name parameter (apidll in the above example) is an alias.  This is so that when switching platforms, the different DLL names among platforms can be taken into account. You can find these names declared in DEFS.PPL.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The #declareapi keyword solves a similar platform problem; the selection of the ASCII or the Unicode version of the function automatically.  Using SetWindowsText as an example. Look in Windows.ppl and you'll see:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#declareapi SetWindowText apidll SetWind&lt;br /&gt;owText 2 1&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The PPC uses Unicode text and XP uses Ascii text. The Windows OS accomplishes this by having 2 functions SetWindowTextW and SetWindowTextA. A macro exists to map the function you need to SetWindowText. In PPL, this is done by #declareapi. It really looks for SetWindowTextW and SetWindowTextA within the referenced DLL.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How to use objects in a linked-list?&lt;/strong&gt;&lt;br /&gt;It is possible to store objects in linked-list offering a wide range of possibilities to your applications. You don't need to store objects using their pointers. All you need to do is to assign the current list element with an object and PPL will take care of the rest.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#class myclass&lt;br /&gt;  public (z$);&lt;br /&gt;  private (x$);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  nproc create&lt;br /&gt;    x$ = args$[0];&lt;br /&gt;  end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  func getx&lt;br /&gt;    return(x$);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  proc m&lt;br /&gt;    ShowMessage(x$ + "," + z$);&lt;br /&gt;  end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#endclass&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  Local(l$, i$);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  List(l$);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  for(i$, 1, 5)&lt;br /&gt;    Add(l$);&lt;br /&gt;    #object myclass l$(i$);&lt;br /&gt;  end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  foreach(l$)&lt;br /&gt;    l.z$ = l.getx * 2;&lt;br /&gt;    l.m;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How to use objects in an array?&lt;/strong&gt;&lt;br /&gt;Support for objects in arrays is supported by default in PPL. All you need to do is to assign an object to an array using the = operator. You cannot directly store an object into an array element using the #object statement, you need to assign it after with the = operator.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#class myclass&lt;br /&gt;  public(v$, x$);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  public proc m&lt;br /&gt;    ShowMessage(v$ + "," + x$);&lt;br /&gt;  end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#endclass&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#class myclass2&lt;br /&gt;  public(v$);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  public proc m&lt;br /&gt;    ShowMessage(v$);&lt;br /&gt;  end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#endclass&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  dim(o$, 10);&lt;br /&gt;&lt;br /&gt;  For (i$, 1, 5)&lt;br /&gt;    #object myclass z$;&lt;br /&gt;    o$[i] = z$;&lt;br /&gt;    o$[i].x$ = i$ * 2;&lt;br /&gt;    myclass2(o$[i]).v$ = i$;  // Classtyping&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  For (i$, 1, 5)&lt;br /&gt;    o$[i].m;&lt;br /&gt;    myclass2(o$[i]).m;  // Classtyping&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How to create a memory allocation and return the pointer from a function?&lt;br /&gt;&lt;/strong&gt;In function MyTest we create a new variable based on the size of the variable string$ adding 10 to the new length. We use the static(n$) to make sure the pointer of ptr$ will not be destroyed when the function MyTest exit. We then concatenate string$ to the string " New" and put the result into n$. We then have to return the pointer of n$ by doing return(&amp;amp;n$);.&lt;/p&gt;&lt;p&gt;When we call MyTest from the Main procedure, the return value is a pointer value assigned to variable ptr$. We then need to output the memory content of that pointer. We use @ptr$. The @ will convert the pointer to the memory content. We display it as a string. Then we need to free the memory allocated in MyTest of ptr$ because PPL cannot do it anymore since ptr$ contains a numerical value (a pointer address value).&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;func mytest (string$)&lt;br /&gt;  new(n$, sizeof(string$)+10);&lt;br /&gt;  static(n$);&lt;br /&gt;  n$  = string$ % " new";&lt;br /&gt;  return(&amp;amp;n$);&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  ptr$ = mytest("Old ");&lt;br /&gt;  ShowMessage(@ptr$);&lt;br /&gt;  free(ptr$);&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;How to use lists as parameters and return list values?&lt;br /&gt;&lt;/strong&gt;Lists are handled as normal variables by the PPL interpreter. It means that the current list position index value is used by the interpreter at all time. If you assign a value to a list, the current list position value is set, the same for returning a list variable from a func. Only the current list position value will be returned. The best way to return list variables to a proc or func is to pass the parameter variable as a pointer with the &amp;amp; operator. In the example above, we first pass l$ as a non-pointer value, therefore the values 4, 5 and 6 are not added to the list. The second time we call the test procedure, we pass the list variable as pointer, therefore the 4, 5 and 6 values are properly added to the list on return.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc test(l$)&lt;br /&gt;  add(l$, 4, 5, 6);&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;proc main&lt;br /&gt;  list(l$);&lt;br /&gt;  add(l$, 1, 2, 3);&lt;br /&gt;  test(l$);&lt;br /&gt;  ForEach (l$)&lt;br /&gt;    ShowMessage(l$);&lt;br /&gt;  end;&lt;br /&gt;  test(&amp;amp;l$);&lt;br /&gt;  ForEach (l$)&lt;br /&gt;    ShowMessage(l$);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1825831059842138982?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1825831059842138982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/ppl-tech-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1825831059842138982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1825831059842138982'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/ppl-tech-notes.html' title='PPL Tech Notes'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-714683807845510429</id><published>2007-11-15T01:28:00.000-08:00</published><updated>2009-03-13T08:20:33.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Tutorial 3 - Create a game visually</title><content type='html'>&lt;h2&gt;Tutorial 3 - Create a game visually&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;Create a game visually&lt;/p&gt;&lt;p&gt;Ever wanted to create a game easily without too much coding? Well you know it cannot be done without coding but things can certainly be simpler. PPL offers a nice solution to help you design the game levels and reduce coding to a minimum.&lt;/p&gt;&lt;p&gt;The Game Level Editor that ships with the PIDE is a unique tool that will allow you to design each levels of your game visually, just like designing a form. Each object is represented as a sprite, each sprite has it's own set of styles, properties and events.&lt;/p&gt;&lt;p&gt;The first step is to launch the Game Level Editor, press the Game Level Editor button on the toolbar:&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial12.png" style="border: 0px solid black; width: 134px; height: 63px;" alt="Tutorial12.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;Once this is done you will be presented with an empty map. Since the GLE (Game Level Editor) is a multi-map editor you are now presented with map #1. We will use map from now on instead of level, they are the same. Now it's time to save the game to make sure that all images you will insert into the game will have a pathname that is relative to the game's current folder. If you don't save your game now, the images will be treated as static pathname and if you try to play the game on the PocketPC or from another target folder location the images won't be found. Save the game to C:\Program Files\PPL\Tutorials\MyGame.gam.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial13.png" style="border: 0px solid black; width: 426px; height: 264px;" alt="Tutorial13.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;By now you are probably thinking, "What kind of game are going to create?". I will tell right now. We will create a demo of two basketballs that will fall from the middle of screen and bounce from the screen edges acting like real balls in the real world using the GameAPI proprietary physic engine. We will assign each ball a mass, friction, shape and collision id's and let the physic engine do the rest.&lt;/p&gt;&lt;p&gt;Now it is time to add our first sprite. The first sprite we will add will be a basketball. Here is the important step, you will need to copy the ball.bmp image file from the C:\Program Files\PPL\Demos folder to C:\Program Files\PPL\Tutorials. This step will ensure that the image is always available to your game nomatter where the game is ran from.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial15.png" style="border: 0px solid black; width: 498px; height: 375px;" alt="Tutorial15.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;To add a new sprite to our game, click the sprite button in the toolbar on the left.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial14.png" style="border: 0px solid black; width: 65px; height: 138px;" alt="Tutorial14.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;Now, let's double-click on the sprite that was just created, it's the green empty screen on your map screen. Let's now select the ball.bmp image file from the C:\Program Files\PPL\Tutorials folder.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial16.png" style="border: 0px solid black; width: 428px; height: 266px;" alt="Tutorial16.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;The ball sprite will look like this:&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial17.png" style="border: 0px solid black; width: 64px; height: 57px;" alt="Tutorial17.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;The fuschia color around the ball needs to be removed. In order to do this, we will need to change the sprite's &lt;strong&gt;TransparentColor&lt;/strong&gt; property to the fuschia color. Scroll the properties list until you find the &lt;strong&gt;TransparentColor&lt;/strong&gt; property then right click on it and select color fuschia. The ball sprite will now show without the borders.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial18.png" style="border: 0px solid black; width: 263px; height: 258px;" alt="Tutorial18.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;It is now time to set some properties to the sprite. We will first set the ball &lt;strong&gt;Mass&lt;/strong&gt; to the value 0.5. Scroll the properties list until you find the &lt;strong&gt;Mass&lt;/strong&gt; line. Change the value to 0.5. Let's apply some friction to make sure the ball slows down after a little while. Change the &lt;strong&gt;Friction&lt;/strong&gt; property to 0.01. The ball needs to bounce from the screen edges, it needs to be elastic. Change the &lt;strong&gt;Elasticity&lt;/strong&gt; property to 0.01. Now let's make sure the ball will not go too fast in case the rebound gets too great or too low. Change the &lt;strong&gt;VelLimitLow&lt;/strong&gt; to 0 and &lt;strong&gt;VelLimitHigh&lt;/strong&gt; to 10. This will make sure the ball's velocity will not go over a value of 10 pixels. The ball will need to collide with the other ball will insert later. In order to do this we need to define the ball's Id and with which &lt;strong&gt;Id&lt;/strong&gt; it will collide with. Change the ball &lt;strong&gt;Id&lt;/strong&gt; to BALL and the &lt;strong&gt;Collide&lt;/strong&gt; value to BALL also. This will make sure two balls will collide with each other as long as their id's are both BALL.&lt;/p&gt;&lt;p&gt;Now that we are done with the changing the ball's properties, we need to set some of styles. We need to make sure the ball will check for collision, check the &lt;strong&gt;SO_CHECKCOLLIDE&lt;/strong&gt; style. The ball will need to bounce off of screen edges (borders), check the &lt;strong&gt;SO_BORDER&lt;/strong&gt; style. We also need to apply physics to the ball, check the &lt;strong&gt;SO_KINETIC&lt;/strong&gt; to make sure the physic engine handles the properties we've set earlier. The collision detection needs to be done on a per-pixel basis so that only the pixels of ball will collide, check the &lt;strong&gt;SO_PIXELCHECK&lt;/strong&gt; style. And lastly we need to define the ball as an oval shape for the physic engine to calculate the physical attributes accordingly, check the &lt;strong&gt;SO_OVAL&lt;/strong&gt; style.&lt;/p&gt;&lt;p&gt;It's time to test our game, save your game and select the Run -&gt; Run menu item.&lt;/p&gt;&lt;p&gt;Nice isn't it? What about we put two more balls in there and look at them bouncing off each others? Copy the first ball sprite by selecting it and selecting Edit -&gt; Copy. Now paste the second ball, select Edit -&gt; Paste. Do another Edit -&gt; Paste command. Move the balls to position them in the same way the following picture shows.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial20.png" style="border: 0px solid black; width: 239px; height: 322px;" alt="Tutorial20.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;Run the program again, select Run -&gt; Run.&lt;/p&gt;&lt;p&gt;Without a single line of code you have just created a nice demo with physics that you could not even imagine you could do. Image what you can do next...&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-714683807845510429?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/714683807845510429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-3-create-game-visually.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/714683807845510429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/714683807845510429'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-3-create-game-visually.html' title='Tutorial 3 - Create a game visually'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5972980236850993026</id><published>2007-11-14T11:58:00.000-08:00</published><updated>2009-03-13T08:20:33.613-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><title type='text'>Tutorial #2</title><content type='html'>&lt;h2&gt;Tutorial #2 - Form based Hello World&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p&gt;&lt;strong&gt;Form based Hello World&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;An Hello World program is great to learn the basics of a language but anyone knows that a good looking program using forms is what sells. PPL offers an easy to use visual form builder to simplify this task. Lets design a form based Hello World program that will do a little bit than the usual message on screen.&lt;/p&gt;&lt;p&gt;Lets first start by creating a new form. Click the form builder icon in the toolbar.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial6.png" alt="Tutorial6.png" /&gt;&lt;/p&gt;&lt;p&gt;Save the form to C:\Program Files\PPL\Tutorials\Hello World Form.frm. Click the save button.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial9.png" style="border: 0px solid black; width: 426px; height: 264px;" alt="Tutorial9.png" /&gt;&lt;/p&gt;&lt;p&gt;Now design the following form.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial8.png" style="border: 0px solid black; width: 241px; height: 322px;" alt="Tutorial8.png" /&gt;&lt;/p&gt;&lt;p&gt;Add a Label component. Change the caption property with "Click the button".&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial7.png" style="border: 0px solid black; width: 209px; height: 106px;" alt="Tutorial7.png" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add an EDIT component on the form. that is the text box, and that name should be replaced with "&lt;span style="font-family:courier new,courier;"&gt;EDIT103".&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Add a new BUTTON component and change the caption to "Click Me!". Now double-click on the button to edit its onClick event code. Type the following line:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;Edit_Set(EDIT103$, "Hello World!");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The complete code should look like this:&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial11.png" style="border: 0px solid black; width: 472px; height: 81px;" alt="Tutorial11.png" /&gt;&lt;/p&gt;&lt;p&gt;Now select Run -&gt; Run. Here the result form after pushing the Click Me! button.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial10.png" style="border: 0px solid black; width: 242px; height: 308px;" alt="Tutorial10.png" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5972980236850993026?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5972980236850993026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5972980236850993026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5972980236850993026'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-2.html' title='Tutorial #2'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5955931670067768942</id><published>2007-11-14T11:45:00.000-08:00</published><updated>2009-03-13T08:20:33.634-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PPL Tutorials'/><title type='text'>Tutorial #1 - Hello World</title><content type='html'>&lt;h2&gt;Tutorial #1 - Hello World&lt;/h2&gt;   &lt;div class="contentbody"&gt;&lt;p align="center"&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Hello World&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Pocket Programming Language's syntax is very easy to learn. It is simple, clean and very efficient. The syntax is a mixture of the best features of the most common programming languages like C, C++, Pascal and Basic. If you know just little bit of programming, chances are you will pickup PPL in no time.&lt;/p&gt;&lt;p&gt;Now it is time to write your first program in PPL. You can now show your friends that you can write programs on the PocketPC and the PC with just one source code.&lt;/p&gt;&lt;p&gt;Open up the PIDE (short for PPL IDE) and select &lt;strong&gt;File -&gt; New&lt;/strong&gt;. A new source code window will open. Write the following line inside that text:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;ShowMessage("Hello World!");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Now let's save our program. To  do this, simply select &lt;strong&gt;File -&gt; Save as...&lt;/strong&gt; Save it to &lt;strong&gt;C:\Program Files\PPL\Tutorials\Hello World.ppl&lt;/strong&gt; You will have create the folder Tutorials first.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial1.png" style="border: 0px solid black; width: 495px; height: 289px;" alt="Tutorial1.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;It's time to see if we have made any errors typing this code. Select &lt;strong&gt;Run -&gt; Compile&lt;/strong&gt;. The first PPL will do is to ask you where you want to run the current program from and the location where PPL runtime has been installed. Every new file you run or compile will need this value entered the first time. If you use a project, PPL will save the locations for you in the project file, you won't have to do it again.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial2.jpg" style="border: 0px solid black; width: 392px; height: 175px;" alt="Tutorial2.jpg" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;Compiling your code first will produce a compilation report. If there are any errors, simply double-click on the line in error on the report and it will bring you right where the error occurred in your source code.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial3.png" style="border: 0px solid black; width: 488px; height: 127px;" alt="Tutorial3.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;Finally it's time to run this nice little program. Select &lt;strong&gt;Run -&gt; Run&lt;/strong&gt;. Voila you will have a nice little dialog with Hello World! in it.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial4.png" style="border: 0px solid black; width: 104px; height: 100px;" alt="Tutorial4.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;Let's now run it on the PocketPC. Go to the top right side of the PIDE in the toolbar, change the Target Device to PocketPC. Select &lt;strong&gt;Run -&gt; Run&lt;/strong&gt;, enter the default location where you want the program to run from. In this case we will use the default &lt;strong&gt;\My Documents\&lt;/strong&gt;. The source code will be transfered to &lt;strong&gt;\My Documents\Hello World.ppl&lt;/strong&gt; and run from there on the PocketPC.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What if we would go step further and make this Hello World program a little more sophisticated?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Change the source code to this:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;proc DisplayMessage (message$)&lt;br /&gt;  ShowMessage (message$);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;proc Main&lt;br /&gt;  DisplayMessage ("Hello World!");&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This program will give you the same result but we can now see how to use procedures and pass parameters to them. Select File -&gt; Save to save the file. Compile it, then run it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What about the console you ask?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Let's rewrite the program again but this time, we will output the Hello World! line to the console. Change the program to the following code:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;#include "console"&lt;br /&gt;&lt;br /&gt;func WinMain&lt;br /&gt;  InitConsole;&lt;br /&gt;  ShowConsole;&lt;br /&gt;&lt;br /&gt;  Writeln ("Hello World!");&lt;br /&gt;&lt;br /&gt;  return (true);&lt;br /&gt;end;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;It is a little different this time. PPL needs to run in window mode since a new console window will be created. You need to return a false value to tell PPL not to free the application from memory when the function WinMain finish executing. The first line is to include the console.ppl library in our program. Next we need to initialize the console and then we display it with ShowConsole. All we need to do now is display our Hello World! line using the Writeln function.&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://www.arianesoft.ca/e107_images/Tutorial5.png" style="border: 0px solid black; width: 373px; height: 253px;" alt="Tutorial5.png" /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt; &lt;/p&gt;&lt;p&gt;If you would like to review the functions and procedures of the console.ppl library, click on the console world in the #include line of your program and press SHIFT+F11 to open the console.ppl file in the editor.&lt;/p&gt;&lt;p&gt;So there we are. Our first &lt;span class="searchhighlight"&gt;tutorial&lt;/span&gt;, a simple program but one that works and both platforms with any modifications and that can be a good start to expand your ideas. Have fun and see you next time.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5955931670067768942?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5955931670067768942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-1-hello-world.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5955931670067768942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5955931670067768942'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/tutorial-1-hello-world.html' title='Tutorial #1 - Hello World'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-5263625308363542099</id><published>2007-11-11T09:42:00.000-08:00</published><updated>2009-03-13T08:20:33.652-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>MSDict v5.60</title><content type='html'>&lt;span class="postdetails"&gt;       &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;MSDict v5.60&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Requirements:&lt;/span&gt; WM 2003, WM 2005,2006&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Overview:&lt;/span&gt; The MSDict Viewer is a shell program for various high quality dictionaries,Oxford,Cambridge,Collins...&lt;br /&gt;&lt;img src="http://forum.ppcwarez.org/download/file.php?id=2809" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;More Info:&lt;/span&gt;   &lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;  http://www.mobisystems.com/ &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Download Instructions:&lt;/span&gt;&lt;br /&gt;Download the patch here &lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://www.megaupload.com/?d=L9TMFUZV"&gt;http://www.megaupload.com/?d=L9TMFUZV&lt;/a&gt;&lt;!-- m --&gt; - instructions included.&lt;br /&gt;Next, download the Cambridge Advanced Dic + the MSDictViewer here &lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://rapidshare.com/files/64073374/Cambridge_Advanced_Learners_Dictionary_PPC_5.60.20.rar.html"&gt;http://rapidshare.com/files/64073374/Cambridge_Advanced_Learners_Dictionar ... 0.rar.html&lt;/a&gt;&lt;!-- m --&gt; &lt;br /&gt;Use the patch, enter 10 digit number in the reg box.&lt;br /&gt;&lt;br /&gt;Mirror for the patch: &lt;a href="http://rapidshare.com/files/64070445/Patcher.zip.html" class="postlink"&gt;http://rapidshare.com/files/64070445/Patcher.zip.html&lt;/a&gt;&lt;br /&gt;Mirror for the application :&lt;a href="http://www.megaupload.com/?d=4HWZNFXG" class="postlink"&gt;http://www.megaupload.com/?d=4HWZNFXG&lt;/a&gt;&lt;br /&gt;Mirrors for MSDict v5.60 + Patcher:&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://www.sendspace.com/file/7rpdep"&gt;http://www.sendspace.com/file/7rpdep&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://www.zshare.net/download/4384975f992dbe/"&gt;http://www.zshare.net/download/4384975f992dbe/&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://www.4shared.com/file/27178889/d5a6ffc8/CambridgeAdvancedLearnersDictionaryPPC_56020Patcher.html"&gt;http://www.4shared.com/file/27178889/d5a6ffc8/CambridgeAdvancedLearnersDic ... tcher.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-5263625308363542099?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/5263625308363542099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/msdict-v560.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5263625308363542099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/5263625308363542099'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/msdict-v560.html' title='MSDict v5.60'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1227834690255142024</id><published>2007-11-10T23:22:00.000-08:00</published><updated>2009-03-13T08:20:33.721-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='Dev'/><title type='text'>Pelles C v4.50 (freeware)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Pelles C v4.50&lt;/span&gt; (freeware)&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Requirements:&lt;/span&gt; PC and/or PPC (CE 2.0 â€¢ CE 3.0 â€¢ CE 4.0 â€¢ CE 5.0)&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Overview:&lt;/span&gt; Pelles C for Windows is a complete development kit for Windows and Pocket PC. It contains among other things an optimizing C compiler, a linker, a resource compiler, a message compiler, a make utility and install builders for both Windows and Pocket PC.&lt;br /&gt;&lt;br /&gt;New project dialog:&lt;br /&gt;&lt;img src="http://www.smorgasbordet.com/pellesc/images/screen4.png" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;ARM debugger:&lt;br /&gt;&lt;img src="http://www.smorgasbordet.com/pellesc/images/screen13.png" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;It also contains an integrated development environment (IDE) with project management, debugger, source code editor and resource editors for dialogs, menus, string tables, accelerator tables, bitmaps, icons, cursors, animated cursors, animation videos (AVI's without sound), versions and XP manifests.&lt;br /&gt;&lt;br /&gt;The compiler is based on LCC (by Chris Fraser and David Hanson), and the install builder for Windows is based on NSIS. Both are heavily modified.&lt;br /&gt;&lt;br /&gt;Features:&lt;br /&gt;&lt;br /&gt; * Integrated resource editor.&lt;br /&gt; * Integrated bitmap, icon and cursor editor.&lt;br /&gt; * Integrated animated cursor and video editor.&lt;br /&gt; * Integrated hex-dump editor.&lt;br /&gt; * Integrated source-level debugger.&lt;br /&gt; * Integrated source code editor with Win32 API call tips.&lt;br /&gt; * Project management.&lt;br /&gt; * Inline assembler with Intel syntax.&lt;br /&gt; * Support for custom controls in the dialog editor.&lt;br /&gt; * Support for additional project wizards.&lt;br /&gt; * Support for Microsoft's exception handling: __try, __except, __finally, __leave.&lt;br /&gt; * Support for Microsoft's new import libraries.&lt;br /&gt; * Support for delayed loading of DLL's, much like Microsoft.&lt;br /&gt; * Support for most C99 features.&lt;br /&gt; * Support for Pocket PC.&lt;br /&gt; * Pelles C is free! (but this site, and all the work, isn't - so donations are welcome)&lt;br /&gt;&lt;br /&gt;More Info:&lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;http://www.christian-heffner.de/&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;or&lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;http://www.smorgasbordet.com/pellesc/&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Download Instructions:&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1227834690255142024?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1227834690255142024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/pelles-c-v450-freeware.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1227834690255142024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1227834690255142024'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/pelles-c-v450-freeware.html' title='Pelles C v4.50 (freeware)'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2719357745069787815</id><published>2007-11-10T23:21:00.000-08:00</published><updated>2009-03-13T08:20:33.744-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Health'/><category scheme='http://www.blogger.com/atom/ns#' term='App'/><title type='text'>BioBody Personal Trainer Edition 2.11</title><content type='html'>&lt;div class="postbody"&gt;&lt;span style="font-weight: bold;"&gt;BioBody Personal Trainer Edition 2.11&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Requirements:&lt;/span&gt; Window 2002/2003SE/WM5&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Overview:&lt;/span&gt; New! More flexibility for different exercise programs! Track your food and workout information. Powerful graphs and views.&lt;br /&gt;&lt;img src="http://trials2.pocketgear.com/Product_images/5/538/biotodayanim2.gif" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;New! BioBody 2 is here! Offers improved performance, and the ability to track multiple users. See BioBody Personal Trainer Edition if you wish to use multiple users on the same device.&lt;br /&gt;&lt;br /&gt;BioBody still works great with the Body For Life program, but was redesigned to accomodate just about any type of exercise program. Now you can enter as many as three aerobic workouts and 144 different sets of strength exercises a day! See the change log at the biomobility.com web site for what is new. BioBody can help you keep track of your strength and aerobic workouts and food intake. BioBody begins with a display of your workout and diet information on its own "Today" screen (which is separate from your Pocket PC's built-in today screen) for at-a-glance viewing of your overall plan for the day.&lt;br /&gt;&lt;br /&gt;Log your upper body, lower body, and aerobic workouts at their individual views. BioBody can automatically bring in the data from your last workout for easy data entry. BioBody also allows you to customize the drop down lists to include your own favorite exercises! Entering your data only takes seconds! Leave those thick paper exercise and food logs behind!&lt;br /&gt;&lt;br /&gt;Logging your food intake is a snap. Just pick out your foods from the protein, carbohydrate, vegetable, and other/supplement lists! The format of the food page will look very familiar to people following the Body For Life program&lt;br /&gt;&lt;br /&gt;BioBody Reports View gives you a great way to view your progress. View graphs of your weight, body fat, water intake, workouts completed, weight used, blood pressure, resting heart rate, measurements, and more! The new graphing functions in BioBody 2 include over 600 different combinations of graphs!&lt;br /&gt;&lt;br /&gt;Store a photo to view for inspiration. A great place for your "before" photo or whatever motivates you!&lt;br /&gt;&lt;br /&gt;Month view allows an at-a-glance view of your completed workouts, a month at a time. Use the new integrated utilities functions to back up your data, import from a prior version of BioBody, or export to .csv format for analysis on the desktop.&lt;br /&gt;&lt;br /&gt;For a more detailed look at BioBody, see the online user guide at biomobility.com. Your suggestions for BioBody are welcomed. Plese mail mailto:support@biomobility.com with your suggestions&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Download Instructions:&lt;/span&gt; Unzip, Install, Register with keygen&lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;http://rapidshare.com/files/5000184/apbbv211.zip&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2719357745069787815?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2719357745069787815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/biobody-personal-trainer-edition-211.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2719357745069787815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2719357745069787815'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/biobody-personal-trainer-edition-211.html' title='BioBody Personal Trainer Edition 2.11'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-7390602812268340782</id><published>2007-11-10T22:24:00.000-08:00</published><updated>2009-03-13T08:20:33.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Personality Psychology Pro v1.6</title><content type='html'>&lt;div class="postbody"&gt;&lt;span style="font-weight: bold;"&gt;Personality Psychology Pro v1.6&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Requirements:&lt;/span&gt; WM 2002-2006 &lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Overview:&lt;/span&gt; A huge pack of personality test &amp;amp; games presented in a pleasant / funny way. By these Psychology tests &amp;amp; games you can realize much more about yourself and about your companion (Sexual partner). You can analyze your personality and find out what is on your mind. You can use this program to understand yourself, to find more about a close person or to have fun with your friends. You can even impress someone by its accurate results.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://forum.ppcwarez.org/files/images/15156_ppcpersonalitylong_1.gif" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Features:&lt;/span&gt;&lt;br /&gt;This program is a pack of:&lt;br /&gt;* personality tests (&gt; 1000 ques.),&lt;br /&gt;* personality statistics and outcome&lt;br /&gt;* games/fun (Graph., text, stories etc)&lt;br /&gt;* birthday analysis  (What tree did you fall from? etc)&lt;br /&gt;* you can set up to 3 completely different users at the same time!&lt;br /&gt;â€¦and much more that will make you realize about your character learn more about psychology and of course have fun.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DETAILS:&lt;/span&gt;&lt;br /&gt;The program consists of three major parts:     &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) FUN / GAMES:&lt;/span&gt;&lt;br /&gt;Graphical tests:&lt;br /&gt;* Paint Test&lt;br /&gt;* Image Test&lt;br /&gt;Textual tests:&lt;br /&gt;* Dalai Lama personality test&lt;br /&gt;* Put the story in the right order&lt;br /&gt;* Choose one animal&lt;br /&gt;* Choose one colour&lt;br /&gt;* Psychological question - Funeral&lt;br /&gt;* Psychological question - Order&lt;br /&gt;Interactive Stories:&lt;br /&gt;* Luna Park&lt;br /&gt;* Stolen Strawberries&lt;br /&gt;* Blue Bird&lt;br /&gt;* The bat&lt;br /&gt;* The camel&lt;br /&gt;* Sudden rain&lt;br /&gt;* The museum&lt;br /&gt;* Volcano explosion&lt;br /&gt;* The concert&lt;br /&gt;* The mountain&lt;br /&gt;* Under the blue sky&lt;br /&gt;* The garbage&lt;br /&gt;* Soap bubbles&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) UPDATES:&lt;/span&gt;&lt;br /&gt;* Birthday Analisys&lt;br /&gt;* Chinese test&lt;br /&gt;* What were you in your past life?&lt;br /&gt;* The Color Test&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) PERSONALITY TESTS:&lt;/span&gt;&lt;br /&gt;Sexuality:&lt;br /&gt;* Sexual Libido&lt;br /&gt;* Sexual Satisfaction&lt;br /&gt;* Sexual Permissiveness&lt;br /&gt;* Sexual Stereotype&lt;br /&gt;Emotional Stability:&lt;br /&gt;* Self-Esteem&lt;br /&gt;* Happiness&lt;br /&gt;* Anxiety&lt;br /&gt;* Obsessiveness&lt;br /&gt;* Independence&lt;br /&gt;* Hypochondria&lt;br /&gt;* Guilt&lt;br /&gt;Introversion /&lt;br /&gt;extraversion:&lt;br /&gt;* Activity&lt;br /&gt;* Sociability&lt;br /&gt;* Risk-Taking&lt;br /&gt;* Impulsiveness&lt;br /&gt;* Expressiveness   &lt;br /&gt;* Reflectiveness&lt;br /&gt;* Responsibility&lt;br /&gt;Mastery / Sympathy:&lt;br /&gt;* Aggressiveness&lt;br /&gt;* Assertiveness&lt;br /&gt;* Ambition&lt;br /&gt;* Manipulation&lt;br /&gt;* Sensation-Seeking&lt;br /&gt;* Dogmatism&lt;br /&gt;* Masculinity / Femininity&lt;br /&gt;Social &amp;amp; Political&lt;br /&gt;Attitudes:&lt;br /&gt;* Social Permissiveness&lt;br /&gt;* Racism&lt;br /&gt;* Belief&lt;br /&gt;* Socialism / Capitalism&lt;br /&gt;* Libertarianism&lt;br /&gt;* Reactionism&lt;br /&gt;* Pacifism&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;More Info:&lt;/span&gt;&lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;http://www.crazysoft.gr/Pocket_PC_PPC/Programs/personality_psychology_pro.asp&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Download Instructions:&lt;/span&gt;&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://rapidshare.com/files/36117917/personality_psychology_pro_v1.zip.html"&gt;http://rapidshare.com/files/36117917/personality_psychology_pro_v1.zip.html&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://www.sharebig.com/share.php?id=s14ggvknvmuiVG5Gh"&gt;http://www.sharebig.com/share.php?id=s14ggvknvmuiVG5Gh&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://www.megaupload.com/?d=JORMP14R"&gt;http://www.megaupload.com/?d=JORMP14R&lt;/a&gt;&lt;!-- m --&gt;&lt;/div&gt;             &lt;!--//SD-REWARD-MOD BEGIN --&gt;&lt;!--//SD-REWARD-MOD END --&gt;                                                &lt;a href="http://forum.ppcwarez.org/report.php?f=37&amp;amp;p=109284"&gt;&lt;img src="http://forum.ppcwarez.org/styles/ppcw/imageset/en/icon_post_report.gif" alt="Report this post" title="Report this post" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-7390602812268340782?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/7390602812268340782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/personality-psychology-pro-v16.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7390602812268340782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7390602812268340782'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/personality-psychology-pro-v16.html' title='Personality Psychology Pro v1.6'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-7591915497845588582</id><published>2007-11-10T11:03:00.000-08:00</published><updated>2009-03-13T08:20:33.790-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='enhancement'/><title type='text'>SPB Phone Suite v1.1.1 Build 1309</title><content type='html'>&lt;span style="font-weight: bold;"&gt;SPB Phone Suite v1.1.1 Build 1309&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Requirements:&lt;/span&gt; wm5, wm6 phone edition&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Overview:&lt;/span&gt; Spb Phone Suite is a collection of useful tools for Windows Mobile Pocket PCs and Smartphones with integrated telephone and Touchscreen. The program covers functions like profile, call filtering, messages about missed calls, decline and answer with SMS, and much more&lt;br /&gt;&lt;img src="http://pocketland.net/images/screenshots/screenshot.36234.gif" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;Functions:&lt;br /&gt;Enter and manage a profile&lt;br /&gt;Today Screen Plugin&lt;br /&gt;Messages about missed calls&lt;br /&gt;Messages about unread SMS&lt;br /&gt;Call filtering&lt;br /&gt;Automatic decline and answer with SMS&lt;br /&gt;Quick select by image&lt;br /&gt;Call history with images&lt;br /&gt;Wireless Manager&lt;br /&gt;Automatic profile&lt;br /&gt;Wireless settings in profile&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;More Info:&lt;/span&gt;&lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;http://forum.ppcwarez.org/viewtopic.php?f=47&amp;amp;t=24866&amp;amp;hilit=spb+phone+suite&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Download Instructions:&lt;/span&gt;&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://rapidshare.com/files/51811767/SPB.Phone.Suite.v1.1.1.Build.1309.PPC.regged.rar"&gt;http://rapidshare.com/files/51811767/SPB.Phone.Suite.v1.1.1.Build.1309.PPC.regged.rar&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;Mirror: &lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://depositfiles.com/files/1611626"&gt;http://depositfiles.com/files/1611626&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-7591915497845588582?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/7591915497845588582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/spb-phone-suite-v111-build-1309.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7591915497845588582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/7591915497845588582'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/spb-phone-suite-v111-build-1309.html' title='SPB Phone Suite v1.1.1 Build 1309'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4843866069333216750</id><published>2007-11-10T10:53:00.000-08:00</published><updated>2009-03-13T08:20:33.807-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><title type='text'>PIM Backup v2.5 (Freeware)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;PIM Backup v2.5 (Freeware)&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Requirements:&lt;/span&gt; Windows Mobile 2003/SE/WM5 PocketPc&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Overview:&lt;/span&gt; This tool allows to backup/restore appointments,call logs,contacts,messages (SMS, Mails, ...),speed dials AND tasks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://forum.ppcwarez.org/download/file.php?id=273" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;PIM Backup v2.4 (Release date 06/07/2007)&lt;br /&gt;- fix a crash bug during restore of a text backup for messages having no&lt;br /&gt;subject&lt;br /&gt;- fix a bug in scheduled backup&lt;br /&gt;- add one instance only&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;More Info:&lt;/span&gt;&lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;http://forum.xda-developers.com/showthread.php?t=299705&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Download Instructions:&lt;br /&gt;&lt;/span&gt;New V2.5&lt;br /&gt;WM5:&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://forum.xda-developers.com/attachment.php?attachmentid=44328&amp;amp;d=1184802894"&gt;http://forum.xda-developers.com/attachment.php?attachmentid=44328&amp;amp;d=1184802894&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;WM2003&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://forum.xda-developers.com/attachment.php?attachmentid=44327&amp;amp;d=1184802881"&gt;http://forum.xda-developers.com/attachment.php?attachmentid=44327&amp;amp;d=1184802881&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-4843866069333216750?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4843866069333216750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/pim-backup-v25-freeware.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4843866069333216750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4843866069333216750'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/pim-backup-v25-freeware.html' title='PIM Backup v2.5 (Freeware)'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-359407712932264531</id><published>2007-11-10T09:11:00.000-08:00</published><updated>2009-03-13T08:20:33.825-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>bluetooth Wizard (Pocket PC) 1.0 For Eng</title><content type='html'>&lt;span class="tpc_title"&gt;bluetooth Wizard (Pocket PC) 1.0 For Eng&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="tpc_content"&gt;  Bluezard - Bluetooth Wizard (Pocket PC) 1.0&lt;span style="font-size: 0pt;"&gt; d[(AC59t!o &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; 7&gt;U.=6pE&gt;4 &lt;/span&gt;&lt;br /&gt;Bluezard (also know as The Real Bluejack) is an application for Windows Mobile Pocket PC devices that extends Bluetooth features and functions! It’s a complete Bluetooth connection manager with lot’s of abilities! With Bluezard you would be able to: - Browse remote device filesystem, download, upload and delete files on a remote-device, create folders.&lt;span style="font-size: 0pt;"&gt; ?p_tA &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; :Sh:8qB2 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; )&amp;amp;CO'R!"v &lt;/span&gt;&lt;br /&gt;&lt;img src="http://handheld.softpedia.com/images/software/screens/Bluezard-Bluetooth-Wizard-Smartphone-0.jpg" onclick="" /&gt;screen.width-461) window.open('http://handheld.softpedia.com/images/software/screens/Bluezard-Bluetooth-Wizard-Smartphone-0.jpg');" border="0"&gt;&lt;span style="font-size: 0pt;"&gt; Y@Gqg0N &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; * A1hXS7 &lt;/span&gt;&lt;br /&gt;Bluezard (also know as The Real Bluejack) is an application for Windows Mobile Pocket PC devices that extends Bluetooth features and functions! It’s a complete Bluetooth connection manager with lot’s of abilities!&lt;span style="font-size: 0pt;"&gt; .c'$*M@%5@ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; }d`AOW._R &lt;/span&gt;&lt;br /&gt;With Bluezard you would be able to: &lt;span style="font-size: 0pt;"&gt; o.5am{\&amp;amp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; Q(7;p.}a^= &lt;/span&gt;&lt;br /&gt;- Browse remote device filesystem, download, upload and delete files on a remote-device, create folders. &lt;span style="font-size: 0pt;"&gt; %$k#yr &lt;/span&gt;&lt;br /&gt;- Control remote-device by sending AT-commands. It has built-in terminal. &lt;span style="font-size: 0pt;"&gt; n'$}%tcHC &lt;/span&gt;&lt;br /&gt;- Send SMS from remote-device. &lt;span style="font-size: 0pt;"&gt; 'R@fME|M &lt;/span&gt;&lt;br /&gt;- Download SMS from remote-device. &lt;span style="font-size: 0pt;"&gt; &amp;amp;WObX X_ &lt;/span&gt;&lt;br /&gt;- Download phonebook from remote-device. &lt;span style="font-size: 0pt;"&gt; mBvV)W, l &lt;/span&gt;&lt;br /&gt;- Send files to the remote-device up to several times faster than filemanagers! &lt;span style="font-size: 0pt;"&gt; wR! &lt;/span&gt;&lt;br /&gt;- Receive files sent via Bluetooth. It can save files directly to storage card, file size is unlimited and it is done on a really high speed! &lt;span style="font-size: 0pt;"&gt; 8&gt;n]2 &lt;/span&gt;&lt;br /&gt;- You can choose where to save incoming file. &lt;span style="font-size: 0pt;"&gt; Y&amp;amp;o'\Zs &lt;/span&gt;&lt;br /&gt;- You can set filters for auto-sorting incoming files to different folders. &lt;span style="font-size: 0pt;"&gt; )8|SNTOd &lt;/span&gt;&lt;br /&gt;- Get extended info about remote-devices: bluetooth manufacturer, avaible services, bluetooth address. &lt;span style="font-size: 0pt;"&gt; -xTW'QEq&lt; &lt;/span&gt;&lt;br /&gt;- Get invisible device status. &lt;span style="font-size: 0pt;"&gt; \5}#E(:Y"L &lt;/span&gt;&lt;br /&gt;- Bluezard is using system device list, so you don’t need to scan for devices every time! &lt;span style="font-size: 0pt;"&gt; TX=E{EbX &lt;/span&gt;&lt;br /&gt;- Bluejack remote-device with a message! &lt;span style="font-size: 0pt;"&gt; dUU)6= z+| &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; }.abvw &lt;/span&gt;&lt;br /&gt;Other features of Bluezard: &lt;span style="font-size: 0pt;"&gt; \%`R[O&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; [L9i  &lt;/span&gt;&lt;br /&gt;- Bluesnarfing (only for security testing) &lt;span style="font-size: 0pt;"&gt; V2;CWUr &lt;/span&gt;&lt;br /&gt;- Hellomoto (only for security testing) &lt;span style="font-size: 0pt;"&gt; #,h) 1nr &lt;/span&gt;&lt;br /&gt;- Fast and easy-to-use interface. &lt;span style="font-size: 0pt;"&gt; sUC8 ##bZ &lt;/span&gt;&lt;br /&gt;- And many-many other features!Limitations:&lt;span style="font-size: 0pt;"&gt; T{Y g,]^ &lt;/span&gt;&lt;br /&gt;Some features are disabled in demo.&lt;span style="font-size: 0pt;"&gt; &amp;amp;S0h9V~Ba &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; VeIYLLW &lt;/span&gt;&lt;br /&gt;Requirements:&lt;span style="font-size: 0pt;"&gt; L3K7Q/.)* &lt;/span&gt;&lt;br /&gt;Microsoft Bluetooth stack and .NET Compact Framework 2.0&lt;span style="font-size: 0pt;"&gt; O~mMwFg &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; x@?&gt;J| &lt;/span&gt;&lt;br /&gt;Pocket PC 2003/2005&lt;/span&gt;&lt;br /&gt; &lt;!--&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; --&gt;&lt;!-- google_ad_client = "pub-3313139143977671"; google_alternate_ad_url = "http://www.pxdxa.com/google_adsense_script.html"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel ="2583046568"; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--&gt;&lt;!-- &lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt; &lt;/script&gt; --&gt;    &lt;br /&gt;&lt;br /&gt; &lt;span class="style5"&gt;Attachment&lt;/span&gt;： &lt;img src="http://www.pxdxa.com/image/wind/file/zip.gif" align="absbottom" /&gt;   &lt;a href="http://www.pxdxa.com/job.php?action=download&amp;amp;pid=tpc&amp;amp;tid=54288&amp;amp;aid=100116" target="_blank"&gt; &lt;span style="color:red;"&gt;Bluezard Eng PPC Full.rar&lt;/span&gt;&lt;/a&gt; (1012 K) Downloads:291&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-359407712932264531?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/359407712932264531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/bluetooth-wizard-pocket-pc-10-for-eng.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/359407712932264531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/359407712932264531'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/bluetooth-wizard-pocket-pc-10-for-eng.html' title='bluetooth Wizard (Pocket PC) 1.0 For Eng'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4841868205518394264</id><published>2007-11-09T11:36:00.000-08:00</published><updated>2009-03-13T08:20:33.845-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>HushSMS - zero message&amp;stealthy PING message</title><content type='html'>&lt;span class="tpc_title"&gt;HushSMS - zero message&amp;amp;stealthy PING message&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="tpc_content"&gt;  &lt;img src="http://www.silentservices.de/HushSMSL.PNG" onclick="" /&gt;screen.width-461) window.open('http://www.silentservices.de/HushSMSL.PNG');" border="0"&gt;&lt;span style="font-size: 0pt;"&gt; Rm[MV_!" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; @V*,a62s &lt;/span&gt;&lt;br /&gt;HushSMS is a tool to sent a class zero message (aka Flash-SMS) or a stealthy PING message to another cellphone.&lt;span style="font-size: 0pt;"&gt; &lt;ey5w@$v&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; s5qq3?93 &lt;/span&gt;&lt;br /&gt;The "Silent Ping" enables you to sent a message to another cellphone without the owner getting knowledge about.&lt;span style="font-size: 0pt;"&gt; kHxGSy|T &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; EC9tQ &lt;/span&gt;&lt;br /&gt;The message is discarded on the owners phone and no trace exists. You will get back a message from the operator that your message has been delivered, proving that your message has been received, and thus you can know that the owners phone is switched on.&lt;span style="font-size: 0pt;"&gt;  t{hQl &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; &lt;mw.@e5_&gt;&lt;br /&gt;This is not some kind of hack or whatever. It's a normal function per standard and works on any phone.&lt;span style="font-size: 0pt;"&gt; l#5c6JDg &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; {#]aP$ &lt;/span&gt;&lt;br /&gt;Q: Why such a software? A: I regulary need it in my job. Sometimes I have to be sure a specific phone is switched on and I can send information to that phone without it beeing stored (class zero message).&lt;span style="font-size: 0pt;"&gt; C'=y_B h &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; ~PI;J2zvi &lt;/span&gt;&lt;br /&gt;It runs on Windows Mobile 5 and 6 based PocketPCs.&lt;span style="font-size: 0pt;"&gt; @P{}|&amp;amp;p6 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; B=[H 9K/ &lt;/span&gt;&lt;br /&gt;developer: &lt;a href="http://www.silentservices.de/HushSMS.html" target="_blank"&gt;http://www.silentservices.de/HushSMS.html&lt;/a&gt;&lt;span style="font-size: 0pt;"&gt; c l37 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; #us%E &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; H5|u=&lt; &lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.4shared.com/file/27242726/1a23a5f4/HushSMS-01.html" target="_blank"&gt;http://www.4shared.com/file/27242726/1a23a5f4/HushSMS-01.html&lt;/a&gt;&lt;/span&gt;&lt;br /&gt; &lt;!--&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; --&gt;&lt;!-- google_ad_client = "pub-3313139143977671"; google_alternate_ad_url = "http://www.pxdxa.com/google_adsense_script.html"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel ="2583046568"; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--&gt;&lt;!-- &lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt; &lt;/script&gt; --&gt;    &lt;br /&gt;&lt;br /&gt; &lt;span class="style5"&gt;Attachment&lt;/span&gt;： &lt;img src="http://www.pxdxa.com/image/wind/file/zip.gif" align="absbottom" /&gt;   &lt;a href="http://www.pxdxa.com/job.php?action=download&amp;amp;pid=tpc&amp;amp;tid=52773&amp;amp;aid=96957" target="_blank"&gt; &lt;span style="color:red;"&gt;HushSMS-0.1.zip&lt;/span&gt;&lt;/a&gt; (7 K) Downloads:179&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-4841868205518394264?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4841868205518394264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/hushsms-zero-message-ping-message.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4841868205518394264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4841868205518394264'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/hushsms-zero-message-ping-message.html' title='HushSMS - zero message&amp;amp;stealthy PING message'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-1925915608691166885</id><published>2007-11-09T11:23:00.000-08:00</published><updated>2009-03-13T08:20:33.880-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>HTC Sim Manager 6.25</title><content type='html'>&lt;span style="font-weight: bold;" class="tpc_title"&gt;HTC Sim Manager 6.25&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="tpc_content"&gt;&lt;img src="http://www.imageturk.com/img/bf28210bee011dd53e73z.JPG" onclick="" /&gt;screen.width-461) window.open('http://www.imageturk.com/img/bf28210bee011dd53e73z.JPG');" border="0"&gt;&lt;span style="font-size: 0pt;"&gt; 8EHL+ So &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; Bsl NJ &lt;/span&gt;&lt;br /&gt;More Info:&lt;span style="font-size: 0pt;"&gt; *}"VBo* &lt;/span&gt;&lt;br /&gt;- Calling Contacts from your SIM Card&lt;span style="font-size: 0pt;"&gt; "9sH!0 &lt;/span&gt;&lt;br /&gt;- Creating a Contacts on your SIM Card&lt;span style="font-size: 0pt;"&gt; q�]),g6}0 &lt;/span&gt;&lt;br /&gt;- Transferring All SIM Card Contacts to your Device&lt;span style="font-size: 0pt;"&gt; M?VkI: &lt;/span&gt;&lt;br /&gt;- Saving Personal Number&lt;/span&gt;&lt;br /&gt; &lt;!--&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; --&gt;&lt;!-- google_ad_client = "pub-3313139143977671"; google_alternate_ad_url = "http://www.pxdxa.com/google_adsense_script.html"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel ="2583046568"; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--&gt;&lt;!-- &lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt; &lt;/script&gt; --&gt;    &lt;br /&gt;&lt;br /&gt; &lt;span class="style5"&gt;Attachment&lt;/span&gt;： &lt;img src="http://www.pxdxa.com/image/wind/file/zip.gif" align="absbottom" /&gt;   &lt;a href="http://www.pxdxa.com/job.php?action=download&amp;amp;pid=tpc&amp;amp;tid=49549&amp;amp;aid=91571" target="_blank"&gt; &lt;span style="color:red;"&gt;HTC_SIM Manager 6.25.zip&lt;/span&gt;&lt;/a&gt; (60 K) Downloads:453&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-1925915608691166885?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/1925915608691166885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/htc-sim-manager-625.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1925915608691166885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/1925915608691166885'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/htc-sim-manager-625.html' title='HTC Sim Manager 6.25'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-407424051742961878</id><published>2007-11-09T09:00:00.000-08:00</published><updated>2009-03-13T08:20:33.915-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>birthday boy v2.1</title><content type='html'>&lt;span style="font-weight: bold;"&gt;birthday boy v2.1&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Requirements:&lt;/span&gt; PPC2002, WM2003&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Overview:&lt;/span&gt; Birthday Boy is fantastic application for the Pocket PC which will scan your database of contacts and report any birthdays or anniversaries coming up.&lt;br /&gt;&lt;img src="http://www.gigabytesol.com/images/BBoy2.gif" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;Features include:-&lt;br /&gt;Check dates upto 1 year ahead (new)&lt;br /&gt;Events picked up from contacts database&lt;br /&gt;Click an event to be taken directly to contact details&lt;br /&gt;Customize color scheme and number of display lines&lt;br /&gt;Today screen plug-in for high visibility&lt;br /&gt;Optionally display Age and Anniversary number&lt;br /&gt;Shrinks when no events present&lt;br /&gt;Tiny, takes less thank 64k of storage&lt;br /&gt;Fully skinable on Pocket PC 2002 / 2003(new)&lt;br /&gt;Direct database access for incredible speed&lt;br /&gt;Selectable viewing dates&lt;br /&gt;Selectable date display formats&lt;br /&gt;Full help included&lt;br /&gt;Now compatible with PPC 2003(new)&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;More Info:&lt;/span&gt;&lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;http://www.gigabytesol.com/bboy.htm&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Download Instructions:&lt;/span&gt;&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://rapidshare.com/files/58267716/birthday.boy.2.1.pocketpc.full-tsrh.zip"&gt;http://rapidshare.com/files/58267716/birthday.boy.2.1.pocketpc.full-tsrh.zip&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;Mirrors: &lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://depositfiles.com/files/1878586"&gt;http://depositfiles.com/files/1878586&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-407424051742961878?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/407424051742961878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/birthday-boy-v21.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/407424051742961878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/407424051742961878'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/birthday-boy-v21.html' title='birthday boy v2.1'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-2878468750356041112</id><published>2007-11-09T08:54:00.000-08:00</published><updated>2009-03-13T08:20:33.936-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='enhancement'/><title type='text'>birthday boy for dashboard v2.0</title><content type='html'>&lt;span style="font-weight: bold;"&gt;birthday boy for dashboard v2.0&lt;/span&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Requirements:&lt;/span&gt; PPC2002, WM2003&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Overview:&lt;/span&gt; BirthdayBoy for Dashboard is a plugin for Snoopsoft's popular Today Screen replacement. It adds many features to the original release of BirthdayBoy to make viewing your upcoming events even easier.&lt;br /&gt;&lt;img src="http://www.gigabytesol.com/images/BBoyDash2.gif" alt="Image" /&gt;&lt;br /&gt;&lt;br /&gt;Features include:-&lt;br /&gt;Check dates upto 1 year ahead (new)&lt;br /&gt;Events picked up from contacts database&lt;br /&gt;Click an event to be taken directly to contact details&lt;br /&gt;Click execute to create a new contact&lt;br /&gt;Customize color scheme (chosen from skin)&lt;br /&gt;Click the clock to select a viewing date to check events months in advance&lt;br /&gt;Change font size to suit the screen space available in the skin.&lt;br /&gt;Optionally display Age and Anniversary number&lt;br /&gt;Tiny, takes less thank 64k of storage&lt;br /&gt;Direct database access for incredible speed&lt;br /&gt;Can be displayed in any Dashboard view (new)&lt;br /&gt;Selectable date display formats (new)&lt;br /&gt;Full help included (new)&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;More Info:&lt;/span&gt;&lt;br /&gt;&lt;div class="codewrapper"&gt;&lt;div class="codetitle"&gt;&lt;b&gt;Code:&lt;/b&gt;&lt;/div&gt;&lt;div class="codecontent"&gt;http://www.gigabytesol.com/bboydash.htm&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;Download Instructions:&lt;/span&gt;&lt;br /&gt;&lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://rapidshare.com/files/58267995/birthday.boy.for.dashboard.2.0.pocketpc.full-tsrh.zip"&gt;http://rapidshare.com/files/58267995/birthday.boy.for.dashboard.2.0.pocketpc.full-tsrh.zip&lt;/a&gt;&lt;!-- m --&gt;&lt;br /&gt;Mirror: &lt;!-- m --&gt;&lt;a class="postlink" target="_new" href="http://anonym.to/?http://www.2xupload.de/file/232e58ea4425ce891da1bad90a7121f1/birthday.boy.for.dashboard.2.0.pocketpc.full-tsrh.zip.html"&gt;http://www.2xupload.de/file/232e58ea4425ce891da1bad90a7121f1/birthday.boy. ... h.zip.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-2878468750356041112?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/2878468750356041112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/birthday-boy-for-dashboard-v20.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2878468750356041112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/2878468750356041112'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/birthday-boy-for-dashboard-v20.html' title='birthday boy for dashboard v2.0'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-722723822513712826</id><published>2007-11-08T05:57:00.000-08:00</published><updated>2009-03-13T08:20:33.956-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>MyPersonalDiet v2.5.0</title><content type='html'>&lt;img src="http://www.pxdxa.com/image/post/emotion/12.gif" align="left" border="0" /&gt; &lt;span class="tpc_title"&gt;MyPersonalDiet v2.5.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Pic：&lt;br /&gt;&lt;img src="http://www.pxdxa.com/attachmentes/Day_070731/65_256269_27ece_pxdxa.diet1.gif" onclick="" /&gt;screen.width-461) window.open('http://www.pxdxa.com/attachmentes/Day_070731/65_256269_27ece_pxdxa.diet1.gif');" border="0"&gt; &lt;br /&gt;&lt;span class="tpc_content"&gt; MyPersonalDiet is the most comprehensive diet software for Pocket PC that gives you the tools to reach you weight goal by providing simple means of tracking your food and workouts, monitor your health and get clear assessments of your efforts and results. MyPersonalDiet will not burn calories for you, but it will eliminate any guesswork and help you make the right decisions to reach your objectives. It is also equipped with features to monitor specific nutrients, which is essential for people with food restrictions.&lt;span style="font-size: 0pt;"&gt; q)J\l~q &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; vb[v pB &lt;/span&gt;&lt;br /&gt;&lt;b&gt;Version 2.5.0 (June 19, 2007)&lt;/b&gt;&lt;span style="font-size: 0pt;"&gt; \-#F9{XO[ &lt;/span&gt;&lt;br /&gt;* Compatibility with VidaOne &amp;amp; Diet Fitness.&lt;span style="font-size: 0pt;"&gt; ($#U9  ( &lt;/span&gt;&lt;br /&gt;* Custom categories can be used when creating food items.&lt;span style="font-size: 0pt;"&gt; w/[8vn% &lt;/span&gt;&lt;br /&gt;* The number of entries in the Favorites list can now be customized.&lt;span style="font-size: 0pt;"&gt; "b0f4x  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; &lt;=&lt;[UG&amp;amp; &lt;/span&gt;&lt;br /&gt;Download Instruction&lt;span style="font-size: 0pt;"&gt; #wm( i&lt;1&gt;&lt;br /&gt;&lt;div style="font-size: 9px; margin-left: 5px;"&gt;&lt;b&gt;CODE:&lt;/b&gt;&lt;/div&gt;&lt;div class="quote" id="code1"&gt;http://rapidshare.com/files/46067284/VidaOne_MyPersonalDiet_v2_5.rar.html&lt;br /&gt;&lt;br /&gt;&lt;span class="style5"&gt;Attachment&lt;/span&gt;： &lt;img src="http://www.pxdxa.com/image/wind/file/zip.gif" align="absbottom" /&gt;   &lt;a href="http://www.pxdxa.com/job.php?action=download&amp;amp;pid=695203&amp;amp;tid=44797&amp;amp;aid=83364" target="_blank"&gt; &lt;span style="color:red;"&gt;VidaOne_MyPersonalDiet_v2_5.rar&lt;/span&gt;&lt;/a&gt; (818 K) Downloads:180&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-722723822513712826?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/722723822513712826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/mypersonaldiet-v250.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/722723822513712826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/722723822513712826'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/mypersonaldiet-v250.html' title='MyPersonalDiet v2.5.0'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-4463784948535578202</id><published>2007-11-08T05:55:00.000-08:00</published><updated>2009-03-13T08:20:33.977-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>HTC Plus</title><content type='html'>&lt;span class="tpc_title"&gt;HTC Plus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 描述：Home page with Clock&lt;br /&gt; Pic：&lt;br /&gt;&lt;img src="http://www.pxdxa.com/attachmentes/Day_070901/65_103894_4e247_pxdxa.70901-025354-00.jpg" onclick="" /&gt;screen.width-461) window.open('http://www.pxdxa.com/attachmentes/Day_070901/65_103894_4e247_pxdxa.70901-025354-00.jpg');" border="0"&gt; &lt;br /&gt;&lt;br /&gt; 描述：Configuation Page&lt;br /&gt; Pic：&lt;br /&gt;&lt;img src="http://www.pxdxa.com/attachmentes/Day_070901/65_103894_52d57_pxdxa.70901-025410-04.jpg" onclick="" /&gt;screen.width-461) window.open('http://www.pxdxa.com/attachmentes/Day_070901/65_103894_52d57_pxdxa.70901-025410-04.jpg');" border="0"&gt; &lt;br /&gt;&lt;br /&gt; 描述：Home page without Clock&lt;br /&gt; Pic：&lt;br /&gt;&lt;img src="http://www.pxdxa.com/attachmentes/Day_070901/65_103894_65531_pxdxa.70901-025455-15.jpg" onclick="" /&gt;screen.width-461) window.open('http://www.pxdxa.com/attachmentes/Day_070901/65_103894_65531_pxdxa.70901-025455-15.jpg');" border="0"&gt; &lt;br /&gt;&lt;span class="tpc_content"&gt;HTC Plus Home Plug-in&lt;span style="font-size: 0pt;"&gt; ~x%6b$'8g &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; X }YYNT &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 0pt;"&gt; Go&gt;w?n/ 1 &lt;/span&gt;&lt;br /&gt;Remember to backup your device before trying the software, I saw other post where people need to hard rest after installation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:gray;"&gt;[ 此贴被y2smc在2007-09-01 19:20重新编辑 ]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;!--&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; --&gt;&lt;!-- google_ad_client = "pub-3313139143977671"; google_alternate_ad_url = "http://www.pxdxa.com/google_adsense_script.html"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel ="2583046568"; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--&gt;&lt;!-- &lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt; &lt;/script&gt; --&gt;    &lt;br /&gt;&lt;br /&gt; 描述：HTC plus&lt;br /&gt; &lt;span class="style5"&gt;Attachment&lt;/span&gt;： &lt;img src="http://www.pxdxa.com/image/wind/file/zip.gif" align="absbottom" /&gt;   &lt;a href="http://www.pxdxa.com/job.php?action=download&amp;amp;pid=tpc&amp;amp;tid=47939&amp;amp;aid=88877" target="_blank"&gt; &lt;span style="color:red;"&gt;HTCPlus.zip&lt;/span&gt;&lt;/a&gt; (346 K) Downloads:1281&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8699384813664411939-4463784948535578202?l=iapplephone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://iapplephone.blogspot.com/feeds/4463784948535578202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://iapplephone.blogspot.com/2007/11/htc-plus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4463784948535578202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8699384813664411939/posts/default/4463784948535578202'/><link rel='alternate' type='text/html' href='http://iapplephone.blogspot.com/2007/11/htc-plus.html' title='HTC Plus'/><author><name>Akki</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='30' src='http://4.bp.blogspot.com/_uUnuAveok-M/TD27ieBj7lI/AAAAAAAAE2M/jnGGIWVwBFo/S220/Picture+9.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8699384813664411939.post-6369966422074349266</id><published>2007-11-08T05:47:00.000-08:00</published><updated>2009-03-13T08:20:33.997-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Inesoft Cash Organizer 2007 Premium v7.29.1 [20070930]</title><content type='html'>&lt;span class="tpc_title"&gt;Inesoft Cash Organizer 2007 Premium v7.29.1 [20070930]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Pic：&lt;br /&gt;&lt;img src="http://www.pxdxa.com/attachmentes/Day_071002/65_103276_1da3b_pxdxa.2007_account.gif" onclick="" /&gt;screen.width-461) window.open('http://www.pxdxa.com/attachmentes/Day_071002/65_103276_1da3b_pxdxa.2007_account.gif');" border="0"&gt; &lt;br /&gt;&lt;br /&gt; Pic：&lt;br /&gt;&lt;img src="http://www.pxdxa.com/attachmentes/Day_071002/65_103276_83730_pxdxa.2007_express.gif" onclick="" /&gt;screen.width-461) window.open('http://www.pxdxa.com/attachmentes/Day_071002/65_103276_83730_pxdxa.2007_express.gi
