<?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-4349911995767920194</id><updated>2012-02-02T00:35:56.228-06:00</updated><category term='Vista'/><category term='User Interface'/><category term='Plugins'/><category term='Windows Marketplace'/><category term='Microsoft'/><category term='Cairo'/><category term='Technology'/><category term='Xcode'/><category term='10.7'/><category term='bugs'/><category term='Stack Trace'/><category term='Windows'/><category term='SQLite'/><category term='REAL Studio Web Edition'/><category term='Oracle'/><category term='Flicker'/><category term='Apple'/><category term='Feedback'/><category term='general'/><category term='IDE'/><category term='REAL Server'/><category term='WebPageSource'/><category term='validation'/><category term='Skype'/><category term='REALbasic'/><category term='Programming'/><category term='Web'/><category term='LLVM'/><category term='Steve Jobs'/><category term='New Releases'/><category term='REAL Studio'/><category term='Declare'/><category term='Community'/><category term='Debugger'/><category term='Conference'/><category term='Mac'/><category term='Mac OS X'/><category term='REALSQLDatabase'/><category term='Tablets'/><category term='feature requests'/><category term='iOS'/><category term='Documentation'/><category term='Events'/><category term='JSON'/><category term='Android'/><category term='iPod Touch'/><category term='Web 3.0'/><category term='Mac OSX'/><category term='64 bit'/><category term='HTML5'/><category term='announcements'/><category term='Windows 7'/><category term='PowerPC'/><category term='Mac App Store'/><category term='Mobile'/><category term='Renewal'/><category term='Lion'/><category term='MySQL'/><category term='Internet'/><category term='Javascript'/><category term='iCloud'/><category term='WebPopupMenu'/><category term='graphics'/><category term='REALSQLDatabsae'/><category term='Buttons'/><category term='Leicester'/><category term='Tips'/><category term='Platforms'/><category term='OSX'/><category term='8 digit code'/><category term='Developer Costs'/><category term='UK'/><category term='Canvas'/><category term='Carbon'/><category term='Apple iMac TV'/><category term='Firefox'/><category term='iPhone'/><category term='Cross-Platform'/><category term='REALbasic applications'/><category term='REAL World'/><category term='Upgrade'/><category term='Tip'/><category term='Database'/><category term='Linux'/><category term='optimization'/><category term='Porting'/><category term='Cocoa'/><category term='compiling'/><category term='Smartphones'/><category term='iPad'/><category term='Exceptions'/><category term='Intel'/><category term='Education'/><title type='text'>Real Software</title><subtitle type='html'>Insights from the Real Software team about Real Studio, cross-platform development and industry trends.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default?start-index=101&amp;max-results=100'/><author><name>Katherine</name><uri>http://www.blogger.com/profile/16569580603783689811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>194</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6584060491004995917</id><published>2012-02-01T14:48:00.000-06:00</published><updated>2012-02-01T14:48:00.023-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><category scheme='http://www.blogger.com/atom/ns#' term='Education'/><category scheme='http://www.blogger.com/atom/ns#' term='Documentation'/><title type='text'>Hello from Paul Lefebvre</title><content type='html'>&lt;br /&gt;Hello fellow Real Studio developers! &amp;nbsp;My name is Paul Lefebvre and I am the newest member of the Real Software team, taking on the role of Developer Evangelist.&lt;br /&gt;&lt;br /&gt;In this position I will be responsible for many things that relate to educating prospective and existing customers about the best ways to get the most out of Real Studio. &amp;nbsp;In particular, I will be focusing on documentation, tutorials, example projects, webinars, blogging, training and social web coverage.&lt;br /&gt;&lt;br /&gt;I've been using Real Studio for over 10 years and have been programming professionally for nearly 20 years using other tools such as PowerBuilder, C#, VB.NET and Java.&lt;br /&gt;&lt;br /&gt;I am extremely excited to be joining the Real Software team!&lt;br /&gt;&lt;br /&gt;I love hearing from fellow Real Studio developers, so if you have any suggestions on how I can help you make better use of Real Studio, send me an email: paul@realsoftware.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6584060491004995917?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6584060491004995917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6584060491004995917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6584060491004995917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6584060491004995917'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2012/02/hello-from-paul-lefebvre.html' title='Hello from Paul Lefebvre'/><author><name>Paul Lefebvre</name><uri>http://www.blogger.com/profile/10946193666886618101</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-4326492442728260188</id><published>2012-01-30T07:30:00.000-06:00</published><updated>2012-01-30T07:30:01.530-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Debugger'/><title type='text'>Debugger 101</title><content type='html'>&lt;div&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;There are a lot of users that don't realize that &lt;a href="https://secure.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt; has a debugger- and it's very easy to use!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Let's say that you want to track down a bug in your code and you know that the problem occurs when you push the Show Me button on a window. In your project you would go to the action event of the Show Me button and set a breakpoint next to one of the lines of code as shown below by the red dot (click on the hash mark to set the breakpoint):&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-mboN_Fo3tNU/TyLFC_KwfWI/AAAAAAAAAAc/yve-0_KBMaM/s1600/debugging.png"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5702336733311434082" src="http://4.bp.blogspot.com/-mboN_Fo3tNU/TyLFC_KwfWI/AAAAAAAAAAc/yve-0_KBMaM/s320/debugging.png" style="cursor: hand; cursor: pointer; display: block; height: 233px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Then, to debug the code:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;1. Press the Run button&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;2. Enter any necessary values into the UI&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;3. Press the Show Me button&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;You will see debugger pane on the right (this shows the result after pressing the Step button several times):&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-tiabzAzSwt4/TyLEsjutJ6I/AAAAAAAAAAQ/zfppmMdjIZY/s1600/breakpoint.png"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5702336347988895650" src="http://4.bp.blogspot.com/-tiabzAzSwt4/TyLEsjutJ6I/AAAAAAAAAAQ/zfppmMdjIZY/s320/breakpoint.png" style="cursor: hand; cursor: pointer; display: block; height: 233px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;That's all there is to it. Using the debugger you will have a much easier time locating and fixing problems in your code. For more details on how to use the Real Studio debugger visit &lt;a href="http://docs.realsoftware.com/index.php/UsersGuide:Chapter_12" target="_blank"&gt;"Debugging Your Code"&lt;/a&gt; in our Documentation Wiki.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&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/4349911995767920194-4326492442728260188?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/4326492442728260188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=4326492442728260188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4326492442728260188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4326492442728260188'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2012/01/debugger-101.html' title='Debugger 101'/><author><name>jason@real</name><uri>http://www.blogger.com/profile/07648650479087678846</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-mboN_Fo3tNU/TyLFC_KwfWI/AAAAAAAAAAc/yve-0_KBMaM/s72-c/debugging.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5381757738126518601</id><published>2012-01-24T07:23:00.000-06:00</published><updated>2012-01-24T07:23:00.160-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Cross-Platform'/><title type='text'>Leveling the playing field</title><content type='html'>Anyone reading this blog knows that one of the most valuable features of &lt;a href="http://www.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt; is its ability to create cross-platform applications. So it goes without saying that the more level the desktop OS playing field is, the more important cross-platform becomes. As the Mac market share has increased, we get more and more Windows developers coming to Real Studio because their customers want them to support the Mac.&lt;br /&gt;&lt;br /&gt;Last week, research firm &lt;a href="http://www.gartner.com/" target="_blank"&gt;Gartner&lt;/a&gt; released a &lt;a href="http://www.gartner.com/it/page.jsp?id=1893523" target="_blank"&gt;report&lt;/a&gt; on PC shipments for the fourth quarter of 2011. It showed that while all the major Windows PC makers saw a drop in market share, the market share for the Mac increased substantially. And this week, the Wall Street Journal &lt;a href="http://online.wsj.com/article/SB10001424052970203721704577156704148493394.html" target="_blank"&gt;reported&lt;/a&gt; that big companies like GE are allowing employees to choose the Mac as the computer they will use at work.&lt;br /&gt;&lt;br /&gt;As the market share for the Mac increases, the OS playing field becomes more level and that's great for cross-platform software. It's good news for those of you that create cross-platform, commercial software with Real Studio and it's great for us. In the ideal world, the market share for the three major desktop OSs would be split evenly. But anything that makes it more even is a good thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-5381757738126518601?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5381757738126518601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5381757738126518601' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5381757738126518601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5381757738126518601'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2012/01/leveling-playing-field.html' title='Leveling the playing field'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-3457056101171785093</id><published>2012-01-20T09:18:00.000-06:00</published><updated>2012-01-20T10:22:00.069-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><category scheme='http://www.blogger.com/atom/ns#' term='User Interface'/><title type='text'>Is it time to redesign?</title><content type='html'>A huge part of what makes any application intuitive is its interface. If it's well thought out, a user interface can make the difference between an app that is fun and easy to use and one that makes water boarding seem like a nice alternative. If the developer has taken the time to make sure the interface is not only self-consistent but consistent with other applications that provide similar functionality (when appropriate), it can add beauty to an application.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;User interfaces don't age like fine wine. If an application's user interface is not updated from time to time, it's going to start making the app look old and out-dated. Additionally, if the application has a lot of features, its developers are likely to have learned quite a bit over the years about how people use the app. It's important to continually advance the usability of an application, this improves the productivity of its users and, in the case of commercial software, keeps the app competitive.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In some cases, incremental improvements can be made to a user interface. But sometimes the entire user interface needs to be redesigned. If you could do it over again, would you create the same user interface you have today? Though it may be a lot of work up front, a much improved user interface should be seriously considered throughout an application's life. Real Studio has gone through several user interface changes since version 1 and we are working on another big one right now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's take a look at how the &lt;a href="http://www.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt; user interface has evolved. Real Studio was first released on July 4, 1998 as REALbasic. The original release of &lt;a href="http://www.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt; back in 1998, looked like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gUvfP2PHpjc/TxXkTGPqd_I/AAAAAAAAABY/vBui1Q-L3S4/s1600/RBv1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-gUvfP2PHpjc/TxXkTGPqd_I/AAAAAAAAABY/vBui1Q-L3S4/s400/RBv1.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;REALbasic 1.0&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;When Mac OS X was released, we updated the user interface to have an appropriate, native look and feel:&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-cUqJx4DaILU/TxXk5enujqI/AAAAAAAAABg/X1QNO5jYEcI/s1600/RBv5.5Mac.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-cUqJx4DaILU/TxXk5enujqI/AAAAAAAAABg/X1QNO5jYEcI/s400/RBv5.5Mac.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;REALbasic 5.5 for Mac OS X&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;And when we brought it to Windows, we took care to make sure the UI felt native:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-otOQDNGjfHU/TxXlcDT3HpI/AAAAAAAAABo/w9ergbiim0A/s1600/RB5.5Win.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-otOQDNGjfHU/TxXlcDT3HpI/AAAAAAAAABo/w9ergbiim0A/s400/RB5.5Win.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;REALbasic 5.5 for Windows&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;Over the years we began to recognize that there were areas where we could really improve the user interface. One of the downsides to the original interface was that a user could easily end up with a &lt;b&gt;lot&lt;/b&gt; of windows open. At the time, browsers also suffered from this same problem and to solve it the idea of using tabs to separate documents rather than windows was adopted. We also recognized that users spend a lot of their time navigating their projects, so anything to make navigation easier would be helpful. Lastly, we decided we should be eating our own dog food. The IDE was written in C++ and it really should be written in &lt;a href="http://www.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt; itself. So in 2004 we began redesigning the user interface, rewriting in it Realbasic, to solve these and other problems. In mid-2005 we introduced the current Real Studio user interface:&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-onxulxSvvzI/TxXpMFeRcyI/AAAAAAAAABw/9y2WWF1ZSvs/s1600/RB2005Mac.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="275" src="http://1.bp.blogspot.com/-onxulxSvvzI/TxXpMFeRcyI/AAAAAAAAABw/9y2WWF1ZSvs/s400/RB2005Mac.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Real Studio 2011&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;This current interface uses a single window rather than multiple windows. This makes it easier for the user to concentrate on the item they are editing, rather than spending time rearranging and scanning through windows that are layered on top of each other. This concept started on Windows and Linux but has been adopted more and more by Mac OS X applications as well.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The user interface you see above has served &lt;a href="http://www.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt; users well for the past six years. In that time, however, we have learned a lot about how people use and learn to use Real Studio and we have taken note as interfaces have changed in the last six years. As a result, we are applying all of this to a significant redesign of Real Studio's user interface. Our goals are a cleaner user interface, easier navigation, better interactivity, a more intuitive user interface and a more modern look and feel. I'll be more specific about these goals for &lt;a href="http://www.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Cleaner user interface&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;- Every piece of text, control, line, and icon you present in a window is something the user believes they have to understand to use the product. Determining which items are infrequently used and removing them (possibly moving them to menus if they still do provide a needed function) can help make the interface cleaner. For example, the current user interface relies too much on text.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Easier to navigate&lt;/b&gt; - Real Studio users spend a lot of time moving from one part of a project to another. While the tabs help, they can also get in the way. The user has to constantly return to the project tab and double-click on a project item which then opens in its own tab. All of these tabs start to take up a lot of room in the tab bar and before long the user is spending time closing tabs to make room for new tabs! Search results only add to this issue because double-clicking on &amp;nbsp;result opens another tab. And while there's one way to navigate a project, there's a different way to navigate the code for the project. All of these ways of navigating present opportunities for improvement.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Better interactivity&lt;/b&gt; - A project can be filled with many different project items that need to interact with each other. The current user interface does not make this as easy as it could be. For example, to create a custom canvas subclass and use it on a window requires as many as six steps:&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;blockquote class="tr_bq"&gt;&lt;blockquote class="tr_bq"&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Click Add Class in the Project Editor.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Change the Super property of the new class to Canvas.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Write your code.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Switch to the Window Editor.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Choose Project Controls from the Controls Selector popupmenu above the Controls list in the Window Editor.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Drag your custom canvas subclass to the window.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;That's a lot of steps. It's also not easy for a new user to figure out these steps. Making basic tasks like this more simple and intuitive helps create better interactivity. And this not only makes it easier for a new user to learn; it makes the experienced user more productive.&lt;/span&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;More intuitive&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;- An intuitive interface is one where the user can use the software, for the most part, without consulting the documentation. The key is to think of all the different ways users will try to use the software and anticipate them. The more often a user is successful when attempting a task, the more intuitive the software is. In the current version of &lt;a href="http://www.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt;, there is usually only one way to do a particular task. In the new user interface, we are adding more ways to accomplish tasks to create a more intuitive design for more users.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Modern look and feel&lt;/b&gt; - Modern user interfaces are using higher resolution graphics, shadows, textures, animation and more. We are using many of these elements in the new user interface to modernize the look and feel.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;It's been 2 years since we first began designing and implementing a greatly improved user interface to reach these goals. Because &lt;a href="http://www.realsoftware.com/realstudio/" target="_blank"&gt;Real Studio&lt;/a&gt; has many editors, this has been an enormous task but we are very pleased with the results and I'm sure you will be too.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Some people just don't like change and any significant change to a user interface will result in some of the existing users balking at these changes. There's just no getting around that. Though most of our users really&amp;nbsp;appreciated&amp;nbsp;the changes in the 2005 user interface refresh,&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;there were a small number of users that just hated it&lt;/span&gt;&lt;span style="font-size: small;"&gt;. Apple changed the direction of gesture for scrolling in Mac OS X Lion; though it seemed like a huge change at first, it quickly became more intuitive to users. Technology moves fast and user interfaces need to keep pace. People will adjust quickly to well-thought-out changes and designers have to consider what the best user interface will be for the application moving forward.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&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/4349911995767920194-3457056101171785093?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/3457056101171785093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=3457056101171785093' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3457056101171785093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3457056101171785093'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2012/01/is-it-time-to-redesign.html' title='Is it time to redesign?'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-gUvfP2PHpjc/TxXkTGPqd_I/AAAAAAAAABY/vBui1Q-L3S4/s72-c/RBv1.png' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5006428951535393271</id><published>2012-01-19T13:08:00.001-06:00</published><updated>2012-01-26T12:10:30.481-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>iOS Meta Tags</title><content type='html'>&lt;span style="font-family: arial;font-family:Arial, Helvetica, sans-serif;" &gt;Over the last few months, there have been several requests for the ability to override the tags that are used for determining how a website scales on iOS devices. Before Real Studio 2011r4, you were locked into using our defaults.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="font-family: arial;font-family:Arial, Helvetica, sans-serif;" &gt;&lt;span style="font-size:large;"&gt;Viewport&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;The default tag looks like this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:'Courier New', Courier, monospace;"&gt;&amp;lt;meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;This says:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;1. The page width should be the same as the device width&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;2. Users are NOT allowed to pinch or zoom the page to change the scale&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;3. The initial scale is 100%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;4. The minimum scale is 100%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;5. The maximum scale is 100%&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;While this works out great for web applications (most of the time anyway), it's not so hot for other uses. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;Take our Orders example – the minimum width of the main screen is 1012. Not so much a constraint of the browser, but of the content on the page. When viewed on an iPad in portrait mode, you have to slide the page left and right to access all of the elements. To accommodate this, you can now override this tag with your own by simply adding a replacement in App.HTMLHeader. For the Orders example, the code looks like this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: normal normal normal 14px/normal Helvetica;"&gt;&lt;span style=" ;font-family:'Courier New', Courier, monospace;font-size:small;"  &gt;&amp;lt;meta name="viewport" content="width=1012"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;This tag tells the browser that the width of the content is 1012 and not to restrict page scale. In doing so, the page will scale to fit the device. &lt;i&gt;Note: Using this dimension does not work for smaller devices like the iPhone. With a smaller screen, it tries to fit the content into 320px (portrait mode) or 480px (landscape mode), which means the content will be drawn at ¼ or ⅓ of the original size, respectively.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=" ;font-family:Arial, Helvetica, sans-serif;font-size:large;"  &gt;&lt;b&gt;Web App Capable&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;On iOS devices, when looking at a web page in Safari, you can add the current page to your Home screen where it will get an icon and be available directly with a single touch. Our defaults make it so Safari does not display the URL and Search fields, nor the Safari toolbar across the bottom of the page. The result is that there is a greater amount of vertical space for your application to run.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;If you want to turn off this capability, thereby making your application always work more like a website, you can add a line to App.HTMLHeader:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:'Courier New', Courier, monospace;"&gt;&amp;lt;meta name="apple-mobile-web-app-capable" content="no"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=" ;font-family:Arial, Helvetica, sans-serif;font-size:large;"  &gt;&lt;b&gt;Web App Icons&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;By default, we compose your application icon for you so that it fits nicely within a white rounded rectangle background. While this is the style that Apple recommends for icons, you have very little control of how big your icon will be. Moreover, as Apple has started offering devices with higher resolution screens, they've suggested different resolutions for different devices.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;You can override the default icon by adding a line like this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:'Courier New', Courier, monospace;"&gt;&amp;lt;link rel="apple-touch-icon-precomposed" href="touch-icon-iphone.png"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;if you want iOS to add the nice "shine" effect to your icon, leave out "precomposed" like this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:'Courier New', Courier, monospace;"&gt;&amp;lt;link rel="apple-touch-icon" href="touch-icon-iphone.png"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:inherit;" &gt;For more information on the options for configuring Web Applications for iOS, see Apple's &lt;a href="http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html#//apple_ref/doc/uid/TP40002051-CH3-SW3" target="_blank"&gt;Safari Web Content&lt;/a&gt; PDF.&lt;/span&gt;&lt;br style="font-family: arial;"&gt;&lt;br style="font-family: arial;"&gt;&lt;i style="font-family: arial;"&gt;Remember: setting these values affects every page that is loaded. If you set the width to 1024, every page will render as if it needs 1024 pixels to appear properly. If your page is only 320 pixels wide it will only take up ⅓ of the device width, regardless of the resolution.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-5006428951535393271?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5006428951535393271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5006428951535393271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5006428951535393271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5006428951535393271'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/11/ios-meta-tags.html' title='iOS Meta Tags'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6337036239576787048</id><published>2012-01-16T08:00:00.001-06:00</published><updated>2012-01-26T12:11:15.813-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feature requests'/><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Feedback'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><category scheme='http://www.blogger.com/atom/ns#' term='Education'/><title type='text'>More Video Tutorials Coming Soon</title><content type='html'>&lt;span style="font-family: arial;"&gt;Starting in February we will welcome Paul Lefebvre as our new Developer Evangelist. Among &lt;/span&gt;&lt;i style="font-family: arial;"&gt;many&lt;/i&gt;&lt;span style="font-family: arial;"&gt; other tasks, Paul will be giving live tutorials on a number of Real Studio topics each month.&lt;/span&gt;&lt;br style="font-family: arial;"&gt;&lt;br style="font-family: arial;"&gt;&lt;span style="font-family: arial;"&gt;We already have quite a few ideas for these tutorials from your feedback and I'm sure that Paul will arrive with ideas of his own. In addition, we welcome tutorial suggestions from you. If you have a suggestion for a video tutorial, one that would be helpful for you as well as other Real Studio users, please enter a Feature Request into Feedback.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_47-5r0-LAE/TxCxldLhyrI/AAAAAAAAAC4/gNLSvIczoaY/s1600/Screen+Shot+2012-01-13+at+2.34.42+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://4.bp.blogspot.com/-_47-5r0-LAE/TxCxldLhyrI/AAAAAAAAAC4/gNLSvIczoaY/s400/Screen+Shot+2012-01-13+at+2.34.42+PM.png" border="0" height="152" width="400" /&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/4349911995767920194-6337036239576787048?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6337036239576787048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6337036239576787048' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6337036239576787048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6337036239576787048'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2012/01/more-video-tutorials-coming-soon.html' title='More Video Tutorials Coming Soon'/><author><name>Alyssa</name><uri>http://www.blogger.com/profile/01227961762199194001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-7A_seQwJ2gA/TsFia5sFQ_I/AAAAAAAAABc/ydlYTgzbQ8w/s220/RealOffice.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-_47-5r0-LAE/TxCxldLhyrI/AAAAAAAAAC4/gNLSvIczoaY/s72-c/Screen+Shot+2012-01-13+at+2.34.42+PM.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6061183975002844506</id><published>2011-12-20T13:19:00.000-06:00</published><updated>2011-12-20T15:18:57.979-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><category scheme='http://www.blogger.com/atom/ns#' term='Education'/><title type='text'>What got you interested in programming?</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;When I was a kid, I would race home after school to watch M*A*S*H reruns on TV. One of my older brothers watched Star Trek reruns so I would sit through Star Trek waiting for&amp;nbsp;M*A*S*H to start. It didn't take long before I became a Star Trek fan. Star Trek provided me with a view of the future. In that future all things were better. No one was poor, getting around was easy and just about any sickness seemed curable all in a 60 minute episode. Computers were an important element in Star Trek so for me, they became a way to touch the future.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I grew up near the University of California at Irvine. I would ride my bike there and hang out in the computer science lab. I bought punch cards, put them in a punch card machine and typed on them. I had no idea how to write programming code. I just mimicked what I saw others doing. I was probably 13 at the time and why no one chased me out of there still surprises me to this day.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;My father spent his career as an electrical engineer mostly creating communications equipment for the military. One day he brought home a Texas Instruments portable terminal. It had no screen, just acoustic couplers that held the telephone handset for communication with the VAX mainframe at his work. A thermal printer was the only output device and of course when we would run out of the special thermal paper, that was a problem. My dad taught me to program in the original BASIC and we played the original text adventure game (called "Adventure") as well.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;When the Apple II came along I wanted one but being in high school at the time, I certainly couldn't afford it. My dad was unwilling to pay extra for the Apple brand so instead purchased a Franklin ACE 1000, which was an Apple II Clone. The Franklin's motherboard failed several times, and I'll bet my dad ended up paying far more for it than he would have paid for an Apple II to begin with! &amp;nbsp;He bought me a book that taught Applesoft BASIC and 6502 assembler. One look at the pages about assembler and I knew right away that I was going to stick with BASIC.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Programming for me became a terrific outlet where I could create anything I could imagine. That's what got me interested in programming.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;What got you interested in programming? Share your story.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6061183975002844506?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6061183975002844506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6061183975002844506' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6061183975002844506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6061183975002844506'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/12/what-got-you-interested-in-programming.html' title='What got you interested in programming?'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-7393181260127201265</id><published>2011-12-12T09:00:00.000-06:00</published><updated>2011-12-12T11:16:50.312-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='Declare'/><title type='text'>How to create a Dylib on Mac OS X and create declares in Realbasic to use it.</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;This tutorial explains how to use Xcode to create a dylib, and then use Realbasic to declare into it. Dylib is short for Dynamic Library, which is a file that contains code that can be linked against at runtime. This means that it isn't built directly into your application, like a static library is, but you can still load it up and call methods in it.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;This is mainly useful for C/C++ or Objective-C programmers to create a library that may do something not possible from Realbasic.&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span class="Apple-style-span"&gt;Creating the dylib&lt;/span&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Launch Xcode&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;This tutorial assumes that you are using Xcode 3.1.4 from Apple.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Choose "File-&amp;gt;New Project", or type Command-Shift-N.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Select BSD Dynamic Library, and click "Choose".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Choose a project name. For this example, we'll call it "SampleDylib".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Choose "File-&amp;gt;New File..."&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Choose "C File", from within the "Mac OS" section&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Name the file. For this example, we'll call it "SampleDylib.c". The default settings are generally correct, but if you have multiple projects open with multiple targets, make sure the proper project and target is selected. When done, click "Finish".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Open the SampleDylib.c source file.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Add the code below:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span"&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int addFunction( int a, int b ) {&lt;br /&gt; return a + b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int stringLength( char *str ) {&lt;br /&gt; return strlen(str);&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Save the file, then click the Build button, or press Command-B.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;If there were build errors, ensure that the code you entered looks exactly like it does above. Once the build is successful, continue to step 12.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Find where the build was saved. If the builds folder location hasn't been changed, it will be located in a "build" folder, next to your project file. It will be named libSampleDylib.dylib. (This is bceuase we've not altered the default install name in the build target.)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;Another way to locate the file is to locate the target by going to the project window, expanding libSampleDylib, then expanding Products. Select libSampleDylib.dylib, and control-click (or right-click, for those with two-button mice), and choose Reveal in Finder&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;You will need to access this location later.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;&lt;span class="Apple-style-span"&gt;Creating the Realbasic project&lt;/span&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Launch Real Studio. Create a new project, and choose "Desktop"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Save the project to your Documents folder (so that it is next to the dylib file). For this example, we'll name it, "Test Dylib.rb"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Double click on "App" in the project window.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Expand the "Events" section, and select "Open"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Add the code below:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span"&gt;CONST dylibLocation = "@executable_path/../Frameworks/libSampleDylib.dylib"&lt;br /&gt;&lt;br /&gt;Declare Function addFunction lib dylibLocation (a as integer, b as Integer) as Integer&lt;br /&gt;Declare Function stringLength lib dylibLocation (s as CString) as Integer&lt;br /&gt;&lt;br /&gt;msgBox "5 + 2 = " + str(AddFunction(5,2))&lt;br /&gt;&lt;br /&gt;msgBox "The length of ""asdf"" is " + str(stringLength("asdf"))&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Run your application using the "Run Paused" feature of the IDE.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Copy the dylib from the Xcode build into the application bundle. You can do this by right clicking on the debug app &amp;amp; selecting "Show Package Contents".&lt;br /&gt;Navigate to Contents &amp;gt; Mac OS &amp;amp; copy the dynamic library created by Xcode into the Frameworks directory in the bundle. (If the edition of Real Studio you use supports this you could use a Build Automation Step to do this for you on every compile)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Now launch the debug application by double clicking it in the Finder. It should then connect to the debugger in the IDE.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;Notice that it correctly adds, and also correctly computes the length of the string.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;&lt;span class="Apple-style-span"&gt;What is it doing?&lt;/span&gt;&lt;/h4&gt;&lt;span class="Apple-style-span"&gt;The loader (aka Dynamic Linker) doesn't search for a dynamic library very well. It relies on either having a full path to the library, or having it relative to the executable path. Since we want the dylib to be installed in the bundle, we use "@executable_path/../Frameworks/libSampleDylib.dylib" as the path for non-debug builds. This means that when you build your application you will need to copy the SampleDylib.dylib file into your Contents/&lt;/span&gt;Frameworks dire&lt;span class="Apple-style-span"&gt;ctory next to your actual executable file.&lt;br /&gt;However, since the application is regenerated every time Realbasic builds it, the same path won't work for debug builds. (Suggestions about how to deal with this are included later)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What about the native types in Realbasic?&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Using Realbasic, you can do almost anything through declares. Here are a few tips on how to handle different types in Realbasic:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span class="Apple-style-span"&gt;&lt;li&gt;Passing a float into your dylib, or returning a float: In Realbasic, use "Single" as the data type. Singles are the exact same as a float -- a single precision floating point, to be specific.&lt;/li&gt;&lt;li&gt;Passing a double into your dylib, or returning a double: Doubles are the exact same in both languages.&lt;/li&gt;&lt;li&gt;Passing a c-string (null-terminated string) into your dylib: In Realbasic, declare the type for the parameter as CString.&lt;/li&gt;&lt;li&gt;Passing a pascal-string (one byte length specifier) into your dylib: In Realbasic declare the type for the parameter as PString.&lt;/li&gt;&lt;li&gt;Passing a void* (arbitrary data) into your dylib, or returning it: In Realbasic, declare the type for the parameter as Ptr, and pass in a MemoryBlock. Also declare the return type as Ptr, and it will automatically be converted to a MemoryBlock on return.&lt;/li&gt;&lt;li&gt;Passing a pointer to a struct into your dylib: The same as above. Set up the memoryblock to contain the different fields, and pass it in as a Ptr.&lt;/li&gt;&lt;li&gt;Limitation: It isn't currently possible to pass in a struct inline.&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span class="Apple-style-span"&gt;Known issues&lt;/span&gt;&lt;/h4&gt;&lt;span class="Apple-style-span"&gt;&lt;ul&gt;&lt;li&gt;By default all symbols (functions &amp;amp; subroutines in C) are exported. This is usually what you want.&lt;br /&gt;If you happen to preface one with the C keyword "static" then it won't be exported &amp;amp; so it will not be usable directly in Real Studio code like we've shown.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you name your file with a ".cpp" extension then Xcode assumes that it is a C++ file &amp;amp; names will get mangled by the Xcode compiler. This means they would not be directly usable in Real Studio.&lt;br /&gt;You will need to preface them with an "extern "C"" declaration to make sure the names get exported unmangled.&lt;/li&gt;&lt;/ul&gt;Because Real Studio recompiles your application every time you run it under the debugger you can't use the same path for the dylib while debugging as you can in the final build. You can deal with this by using an absolute path to the dylib when debugging. In my case this would be:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;CONST dylibLocation = "/Users/npalardy/Documents/libSampleDylib.dylib"&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;Another way to deal with this is to put the dylib next to the application bundle where Real Studio builds the application (right next to the project file on OS X). Then you can use a relative path like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;CONST dylibLocation = "@executable_path/../../../libSampleDylib.dylib"&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;And you could make the code in your Real Studio project look like:&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span"&gt;#if debugBuild&lt;br /&gt;   CONST dylibLocation = "@executable_path/../../../libSampleDylib.dylib" // next to the app bundle&lt;br /&gt;#else&lt;br /&gt;   CONST dylibLocation = "@executable_path/../Frameworks/libSampleDylib.dylib" // inside the app frameworks in the bundle&lt;br /&gt;#endif&lt;/span&gt;&lt;/pre&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span"&gt;Declare Function addFunction lib dylibLocation (a as integer, b as Integer) as Integer&lt;br /&gt;Declare Function stringLength lib dylibLocation (s as CString) as Integer&lt;/span&gt;&lt;/pre&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;b&gt;Document Updated by:&lt;/b&gt;&lt;/span&gt;Norman Palardy &lt;a href="mailto:norman@realsoftware.com"&gt;norman@realsoftware.com&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;Real Software, Inc.&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;based on a previous article by Jonathan Johnson&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;Real Software, Inc.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-7393181260127201265?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/7393181260127201265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=7393181260127201265' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7393181260127201265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7393181260127201265'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/12/how-to-create-dylib-on-mac-os-x-and.html' title='How to create a Dylib on Mac OS X and create declares in Realbasic to use it.'/><author><name>Norman Palardy</name><uri>http://www.blogger.com/profile/04199995960714147285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-4646153042176220755</id><published>2011-12-09T09:22:00.001-06:00</published><updated>2011-12-09T16:46:56.894-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Search Engine Indexing of Web Edition Apps</title><content type='html'>We've been getting some questions about how the search engines treat Web Edition apps and what, if anything, you can do about it.&lt;br /&gt;&lt;br /&gt;First of all, it's worth noting that most search engine "bots" do not support Javascript. This means that neither the Web Edition framework nor the initial WebPage of your app will ever be delivered. You can't even use a Javascript command to redirect to another page.&lt;br /&gt;&lt;br /&gt;In fact, there are some good arguments for why you&amp;nbsp;&lt;i&gt;wouldn't&lt;/i&gt; want a search engine to index your application content. Think of a membership list, or a company calendar or an email client. Having that content indexed by a search engine could be catastrophic, and probably part of the reason that most search engines don't index dynamic content like that, unless specifically told to do so.&lt;br /&gt;&lt;br /&gt;We're investigating ways to make this a little easier to do, but there &lt;i&gt;is&lt;/i&gt; something you can do about this now...&amp;nbsp;META Tags. There are two HTML header tags that you can add that help a search engine to figure out what your site/app is all about. They are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Description: A brief description of that your page or product is about. It is not uncommon for search engines to display this text as is when showing a listing for your page.&lt;/li&gt;&lt;li&gt;Keywords: A list of key words and phrases under which a search engine should index your page.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;To use these tags, add code that looks like this to the app.HTMLHeader property in the IDE:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;meta name="description" content="My software is the greatest piece of software ever made" /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;meta name="keywords" content="best software, greatest software, awesome software, most-likeable software" /&amp;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/4349911995767920194-4646153042176220755?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/4646153042176220755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=4646153042176220755' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4646153042176220755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4646153042176220755'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/12/search-engine-indexing-of-web-edition.html' title='Search Engine Indexing of Web Edition Apps'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1369457032853960159</id><published>2011-12-07T11:38:00.001-06:00</published><updated>2011-12-08T08:59:38.997-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Marketplace'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><category scheme='http://www.blogger.com/atom/ns#' term='Developer Costs'/><title type='text'>How much is too much?</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;This week, Microsoft provided more &lt;a href="http://allthingsd.com/20111206/microsoft-promises-windows-store-will-offer-a-bigger-bite-of-the-apple/" target="_blank"&gt;information&lt;/a&gt; about the app marketplace being built into Windows 8. They are doing some things differently than Apple which is a good because healthy competition is always a good thing for consumers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In one of the videos, Microsoft Web Services VP Antoine Leblond says that prices for apps can be between $1.49 and $999.99. He went on to say that "a thousand bucks is too much for an app." Who exactly is he to say how much is too much for an app? Microsoft's store currently sells &lt;a href="http://www.microsoftstore.com/store/msstore/list/categoryID.50804700?WT.mc_id=pointitsem_US_Google_5-VisualStudio_buy&amp;amp;wt.term=visual%20studio%20price&amp;amp;wt.campaign=*5+-+Visual+Studio&amp;amp;wt.content=VRYOUyHv&amp;amp;wt.source=google&amp;amp;wt.medium=cpc&amp;amp;WT.srch=1" target="_blank"&gt;two editions of Visual Studio&lt;/a&gt; for over $1000 each. Will these not be offered in the app marketplace?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The price a developer charges for their product should not be dictated by any online store. That's a decision the developer should make.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-1369457032853960159?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1369457032853960159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1369457032853960159' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1369457032853960159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1369457032853960159'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/12/how-much-is-too-much.html' title='How much is too much?'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-2777529311857658742</id><published>2011-12-07T10:00:00.000-06:00</published><updated>2011-12-07T10:00:03.954-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Static Variables in Web Edition</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: sans-serif; line-height: 19px;"&gt;Static variables can be a valuable thing, but there is a downside that you should be aware of when using them in Web Edition.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; line-height: 19px;"&gt;The Real Studio documentation for &lt;b&gt;Static&lt;/b&gt; says:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span style="background-color: white; font-family: sans-serif; line-height: 19px;"&gt;"A variable declared with the&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; font-family: sans-serif; line-height: 19px;"&gt;Static&lt;/b&gt;&lt;span style="background-color: white; font-family: sans-serif; line-height: 19px;"&gt;&amp;nbsp;statement and assigned a value retains its value from one invocation of the method to the next." (&lt;a href="http://docs.realsoftware.com/index.php/Static"&gt;Click Here&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;Static variables persist across subclasses as well, so if you have a method in a class that uses a Static variable, all of the subclasses will&amp;nbsp;&lt;i&gt;share&lt;/i&gt;&amp;nbsp;that variable's value.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;So what's so special about Real Studio Web Edition? Well, each end-user session is technically a subclass of the individual Webpages and other items you created in the IDE. Using Static variables may have unintended results.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;For example: If you use a variable as Static in the WebPage1.Resized() event like this:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; line-height: 19px;"&gt;Event Resized()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;span style="color: #cc0000;"&gt; &lt;/span&gt;&lt;span style="color: #990000;"&gt;//Initialize the Static Variables&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Static&lt;/span&gt; LastWidth &lt;span style="color: blue;"&gt;as Integer&lt;/span&gt; = &lt;span style="color: blue;"&gt;Self&lt;/span&gt;.Width&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;Static&lt;/span&gt; LastHeight &lt;span style="color: blue;"&gt;as Integer&lt;/span&gt; = &lt;span style="color: blue;"&gt;Self&lt;/span&gt;.Height&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &lt;span style="color: #990000;"&gt;//Show a message if the window got smaller&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; If Self&lt;/span&gt;.Width &amp;lt; LastWidth &lt;span style="color: blue;"&gt;and Self&lt;/span&gt;.Height &amp;lt; LastHeight &lt;span style="color: blue;"&gt;then&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; MsgBox "The browser window just got smaller!"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; End If&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &lt;span style="color: #990000;"&gt;//Update the Static Variables&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; LastWidth = &lt;span style="color: blue;"&gt;Self&lt;/span&gt;.Width&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; LastHeight = &lt;span style="color: blue;"&gt;Self&lt;/span&gt;.Height&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; line-height: 19px;"&gt;End Event&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;This will work fine as long as there's only &lt;b&gt;one&lt;/b&gt; Session (like if you're testing in debug mode). Once there's more than one, they will all share the LastWidth and LastHeight properties and every time a one user's browser window is resized, LastWidth and LastHeight will be updated for &lt;i&gt;all connected users&lt;/i&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: sans-serif;"&gt;&lt;span style="line-height: 19px;"&gt;Here's what happens:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;If User1 makes their browser smaller and gets the MsgBox and then User2 makes their browser window smaller they will only get the MsgBox if the window is smaller than that of User1. Whichever user resized last, the dimensions of &lt;i&gt;their&lt;/i&gt;&amp;nbsp;browser is what is left in LastWidth and LastHeight.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;While this could lead to a hard to track down bug, imagine what would happen if you used a Static variable for a Password!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;To avoid this problem, you should use properties of the class you are using (in this case WebPage1.LastWidth) or as a property of the Session itself.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: sans-serif; line-height: 19px;"&gt;When writing code for Web Edition, always remember that all&amp;nbsp;of the Sessions are technically running &lt;i&gt;the same exact program&lt;/i&gt;. Properties on Modules and the App class, Shared Class Properties and Static Variables will all be available to all Sessions.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-2777529311857658742?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/2777529311857658742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=2777529311857658742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2777529311857658742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2777529311857658742'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/12/static-variables-in-web-edition.html' title='Static Variables in Web Edition'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5419969618018577014</id><published>2011-12-06T10:00:00.001-06:00</published><updated>2011-12-06T10:00:02.405-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='New Releases'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Cairo'/><title type='text'>Linux &amp; Cairo</title><content type='html'>In Real Studio 2011 Release 4 we upgraded our Graphics drawing on Linux to use Cairo instead of the antiquated GDK drawing system.  For those unfamiliar with Linux, Cairo is akin to GDI+ on Windows, or CoreGraphics on OS X.&lt;br /&gt;&lt;br /&gt;The main benefits to switching to Cairo include: smoother drawing because of anti-aliasing, translucency support and hardware accelerated drawing.  See figure below for a comparison of Cairo drawing (top) and GDK drawing (bottom)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-j6l9-edIcHQ/Tt0jZtVltjI/AAAAAAAAAAo/yphHcdefNDI/s1600/CairoDrawing.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5682737229385283122" src="http://3.bp.blogspot.com/-j6l9-edIcHQ/Tt0jZtVltjI/AAAAAAAAAAo/yphHcdefNDI/s400/CairoDrawing.png" style="cursor: hand; cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 375px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-nmGU6UcZN_M/Tt0jd542acI/AAAAAAAAAA0/Vs6yd7Ngqe4/s1600/GDKDrawing.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5682737301473880514" src="http://1.bp.blogspot.com/-nmGU6UcZN_M/Tt0jd542acI/AAAAAAAAAA0/Vs6yd7Ngqe4/s400/GDKDrawing.png" style="cursor: hand; cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 375px;" /&gt;&lt;/a&gt;&lt;br /&gt;Another important reason for switching to Cairo is because 2011 Release 4 introduces alpha channel support for Pictures.  This would have been excruciatingly painful to do in GDK (and GDI on Windows for that matter), so the upgrade to Cairo was a necessity.&lt;br /&gt;&lt;br /&gt;An additional gain from this upgrade is improved printing support on Linux.  Although we resolved the issue with only being able to print at 72 DPI in a previous release, the fact that we created an offscreen picture and scaled the text was a show stopper for many.  Now that our printing API uses Cairo and our Graphics drawing is also using Cairo, this transitory picture we had to keep around before is essentially out of the picture now, pardon the pun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-5419969618018577014?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5419969618018577014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5419969618018577014' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5419969618018577014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5419969618018577014'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/12/linux-cairo.html' title='Linux &amp; Cairo'/><author><name>William@Real</name><uri>http://www.blogger.com/profile/16943221511084338957</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-j6l9-edIcHQ/Tt0jZtVltjI/AAAAAAAAAAo/yphHcdefNDI/s72-c/CairoDrawing.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-7940434296389917411</id><published>2011-12-02T08:48:00.001-06:00</published><updated>2011-12-06T12:07:45.646-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Steve Jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>The demise of HyperCard</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;John Gruber, the blogger behind &lt;a href="http://www.daringfireball.net/" target="_blank"&gt;Daring Fireball&lt;/a&gt;, has a podcast called The Talk Show. Right at the end of this week's &lt;a href="http://5by5.tv/talkshow/69" target="_blank"&gt;episode&lt;/a&gt;, he and his co-host Dan Benjamin discussed the demise of &lt;a href="http://en.wikipedia.org/wiki/Hypercard" target="_blank"&gt;HyperCard&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;If you're not a Mac user or are too young to remember it, let me give you a little background. HyperCard was a simple development tool provided with the Mac prior to Mac OS X. It had a drag and drop interface builder and a simple programming language similar to AppleScript. I saw the appeal of an English-like programming language but also quickly discovered the concept's Achilles' heal. In English, you can say the same thing many different ways. In HyperTalk (the programming language of HyperCard) there was usually just one way to write the code for a particular function. AppleScript suffers from this same problem which can make it quite frustrating at times. One of our engineers once called AppleScript "a read-only language" which is a great description. It's easy to read AppleScript code, but very frustrating to write. HyperCard also suffered in that it did not support color and could not be used to build standalone applications. If you sent a HyperCard file (called a "stack") to another person, they needed to have HyperCard installed to run it.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Despite these limitations, there was an attractive simplicity to HyperCard.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;So, despite its simplicity and popularity why did HyperCard die? On the show, the hosts suggested that Steve Jobs killed it. One of the things that Jobs did when he returned to Apple was simplify. He very correctly and intuitively understood that Apple needed to focus on a smaller number of projects if they were going to produce great stuff. Also, one of the features of NeXT that Jobs was most proud of was its advanced (at the time) visual development tools and object-oriented language. He believed (correctly as it turned out) that object-oriented programming was the future. So if you consider how important Jobs felt it was to focus and how he felt about the development tools brought to Apple with the acquisition of NeXT, it's easy to see how Jobs would feel that two development tools was one too many.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;But I think the real reason is far simpler. &lt;a href="http://en.wikipedia.org/wiki/Bill_Atkinson" target="_blank"&gt;Bill Atkinson&lt;/a&gt; was the main developer behind HyperCard. He left Apple in 1990. Without Atkinson pushing HyperCard, it was quickly abandoned inside of Apple. There were probably few who knew the code or who had anything like the passion that Atkinson had for it. As a result, updates were released with decreasing frequency and in 2004 Apple finally killed it.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In their podcast, John Gruber and Dan Benjamin discussed what development tools exist today that fill HyperCard's void. I was quite happy to hear John mention &lt;a href="http://realsoftware.com/realstudio/"&gt;Realbasic&lt;/a&gt;. It won't shock you to hear that I think Realbasic/Real Studio fills this gap nicely. One of the big problems John felt HyperCard had was that it couldn't build stand alone apps. Even if it could, Hypercard didn't use native controls so the apps would not have felt like true, native applications. Real Studio of course builds native apps and uses over 40 native interface controls.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;It has always been my vision for Real Studio to be an easy-to-learn and easy-to-use development tool that is powerful enough to build almost any kind of app while supporting all the important platforms. The only platform Real Studio is missing at this point is mobile and that's something we are working towards. It's just never made sense to me that a developer should have to learn lots of different languages and development tools to build different types of applications.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;HyperCard was one of the first visual, integrated development tools. That was a significant innovation. While HyperCard and Real Studio are very different in many ways, they have the same goal: to make programming accessible. I think that Real Studio has done a good job of taking over where HyperCard left off.&amp;nbsp;&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/4349911995767920194-7940434296389917411?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/7940434296389917411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=7940434296389917411' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7940434296389917411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7940434296389917411'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/12/demise-of-hypercard.html' title='The demise of HyperCard'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-7971625585984726115</id><published>2011-11-30T11:00:00.008-06:00</published><updated>2011-11-30T12:34:53.419-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Embossing Effects On-The-Fly</title><content type='html'>Embossing is an effect used to give an object the appearance of being sunk into or raised above a background. They are very easy to create in Photoshop, but today I'm going to show you how you can start with nothing but a shape and build the effect in code. This has the advantage of allowing you to adjust the effect on-they-fly based on parameters you choose.&lt;br /&gt;&lt;br /&gt;We've done exactly this in our new IDE. In fact, I've been given permission to show a very small glimpse of the tray area of our new layout editor. The same object in our current IDE is on the left, the new version is on the right.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img alt="" border="0" height="80" id="BLOGGER_PHOTO_ID_5680838174411298530" src="http://4.bp.blogspot.com/-Q-ogbbzrO0I/TtZkOKRDluI/AAAAAAAAACc/ZxHXgUmj8o4/s320/TrayPreviewOld.png" style="margin-right: 10px;" width="78" /&gt;&lt;img alt="" border="0" height="80" id="BLOGGER_PHOTO_ID_5680837871691487762" src="http://4.bp.blogspot.com/-7nP6AKU3iNA/TtZj8ijB2hI/AAAAAAAAACQ/LgCZzzS4jjc/s320/TrayPreviewNew.png" style="margin-left: 10px;" width="78" /&gt;&lt;/div&gt;&lt;br /&gt;That version on the right is produced in code, starting only with an 8-bit mask to describe the shape:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img alt="" border="0" height="32" id="BLOGGER_PHOTO_ID_5680839084784420994" src="http://4.bp.blogspot.com/-8E_p-4x9p6s/TtZlDJq7CII/AAAAAAAAACo/ucf_3bj0u68/s320/AnimatorMask.png" width="32" /&gt;&lt;/div&gt;&lt;br /&gt;The embossing effect is created using 3 layers. The bottom layer is the drop shadow, the middle layer is the fill, and the top layer is the inner shadow. I created this simple animation to demonstrate how the individual layers build together to create the effect:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img alt="" border="0" height="64" id="BLOGGER_PHOTO_ID_5680839773175520338" src="http://realsoftware.cachefly.net/blog/embossing/BuildAnimation.gif" width="64" /&gt;&lt;/div&gt;&lt;br /&gt;Now, let's get to some actual code. First, you need an image to use as the shape. This image should have no color, only shades of grey. The background can be either white or translucent. We first need to create a method used to draw this shape at any color. For simplicity's sake, we'll call this method IconAtColor:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; border: 1px solid #E4E4E4; margin-left: 20px; margin-right: 20px; overflow: auto; padding: 10px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: blue;"&gt;Private&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; IconAtColor(Icon &lt;span style="color: blue;"&gt;As&lt;/span&gt; Picture, Fill &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Color&lt;/span&gt;) &lt;span style="color: blue;"&gt;As&lt;/span&gt; Picture&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; P &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; Picture(Icon.Width,Icon.Height,&lt;span style="color: #336698;"&gt;32&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;P.Graphics.ForeColor = Fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;P.Graphics.FillRect(&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,P.Width,P.Height)&lt;br /&gt;&amp;nbsp;&amp;nbsp;P.Mask.Graphics.ClearRect(&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,P.Width,P.Height)&lt;br /&gt;&amp;nbsp;&amp;nbsp;P.Mask.Graphics.DrawPicture(Icon,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;Return&lt;/span&gt; P&lt;br /&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Next, the actual embossing. We'll start with the bottom layer, the drop shadow. In our effect, the drop shadow will be used to create a bottom-edge highlight. So we're going to create a picture and fill its contents with white. Purists will argue that a new picture starts white, and they'd be right, but I like to be explicit. By filling it with white, there is no doubt you have a white picture. Next, we're going to clear the mask. A mask defaults to filled black, but we want the opposite, so a simple ClearRect call will handle that. Into the mask, we're going to draw the icon twice. First, we're going to draw the icon using some shade of grey between black (opaque) and white (transparent). This creates the opacity of the shadow. In the example code, we're going to use 75% white (25% opaque, &amp;amp;cBFBFBF). The shadow must be drawn 1 pixel from the top. Then we draw the icon a second time at 100% white (&amp;amp;cFFFFFF) at 0 pixels from the top. This "cuts" the shadow away from where we will actually fill. We do this because the fill may be translucent, and we don't want the shadow to show through. Here's the code to what we just did:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; border: 1px solid #E4E4E4; margin-left: 20px; margin-right: 20px; overflow: auto; padding: 10px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; DropShadow &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; Picture(Icon.Width,Icon.Height,&lt;span style="color: #336698;"&gt;32&lt;/span&gt;)&lt;br /&gt;DropShadow.Graphics.ForeColor = &amp;amp;c&lt;span style="color: red;"&gt;FF&lt;/span&gt;&lt;span style="color: #00bb00;"&gt;FF&lt;/span&gt;&lt;span style="color: blue;"&gt;FF&lt;/span&gt;&lt;br /&gt;DropShadow.Graphics.FillRect(&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,DropShadow.Width,DropShadow.Height)&lt;br /&gt;DropShadow.Mask.Graphics.ClearRect(&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,DropShadow.Width,DropShadow.Height)&lt;br /&gt;DropShadow.Mask.Graphics.DrawPicture(&lt;span style="color: blue;"&gt;Self&lt;/span&gt;.IconAtColor(Icon,&amp;amp;c&lt;span style="color: red;"&gt;BF&lt;/span&gt;&lt;span style="color: #00bb00;"&gt;BF&lt;/span&gt;&lt;span style="color: blue;"&gt;BF&lt;/span&gt;),&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;1&lt;/span&gt;)&lt;br /&gt;DropShadow.Mask.Graphics.DrawPicture(&lt;span style="color: blue;"&gt;Self&lt;/span&gt;.IconAtColor(Icon,&amp;amp;c&lt;span style="color: red;"&gt;FF&lt;/span&gt;&lt;span style="color: #00bb00;"&gt;FF&lt;/span&gt;&lt;span style="color: blue;"&gt;FF&lt;/span&gt;),&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Now we're going to create the fill layer. Because we want the fill to darken the background, we're going to fill a new picture with black, and once again, clear the mask. Then all we have to do is draw the icon into the mask, again at some color between black and white to describe the opacity. In our example, the fill will be 50% opaque (&amp;amp;c7F7F7F):&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; border: 1px solid #E4E4E4; margin-left: 20px; margin-right: 20px; overflow: auto; padding: 10px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; Fill &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; Picture(Icon.Width,Icon.Height,&lt;span style="color: #336698;"&gt;32&lt;/span&gt;)&lt;br /&gt;Fill.Graphics.ForeColor = &amp;amp;c&lt;span style="color: red;"&gt;00&lt;/span&gt;&lt;span style="color: #00bb00;"&gt;00&lt;/span&gt;&lt;span style="color: blue;"&gt;00&lt;/span&gt;&lt;br /&gt;Fill.Graphics.FillRect(&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,Fill.Width,Fill.Height)&lt;br /&gt;Fill.Mask.Graphics.ClearRect(&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,Fill.Width,Fill.Height)&lt;br /&gt;Fill.Mask.Graphics.DrawPicture(&lt;span style="color: blue;"&gt;Self&lt;/span&gt;.IconAtColor(Icon,&amp;amp;c&lt;span style="color: red;"&gt;7F&lt;/span&gt;&lt;span style="color: #00bb00;"&gt;7F&lt;/span&gt;&lt;span style="color: blue;"&gt;7F&lt;/span&gt;),&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;And of course, the final layer is the inner shadow. Like the fill, we want this layer to darken, so we fill a new picture with black, and like the other two layers, we clear the mask. Like the drop shadow, we need to draw the icon twice. Once for the opacity, and once to "cut" the shape away. In this example, the shadow is 75% opaque (&amp;amp;c7F7F7F). This time, the first drawing should be 0 pixels from the top, and the second drawing should be 1 pixel from the top.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; border: 1px solid #E4E4E4; margin-left: 20px; margin-right: 20px; overflow: auto; padding: 10px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: blue;"&gt;Dim&lt;/span&gt; InnerShadow &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; Picture(Icon.Width,Icon.Height,&lt;span style="color: #336698;"&gt;32&lt;/span&gt;)&lt;br /&gt;InnerShadow.Graphics.ForeColor = &amp;amp;c&lt;span style="color: red;"&gt;00&lt;/span&gt;&lt;span style="color: #00bb00;"&gt;00&lt;/span&gt;&lt;span style="color: blue;"&gt;00&lt;/span&gt;&lt;br /&gt;InnerShadow.Graphics.FillRect(&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,InnerShadow.Width,InnerShadow.Height)&lt;br /&gt;InnerShadow.Mask.Graphics.ClearRect(&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,InnerShadow.Width,InnerShadow.Height)&lt;br /&gt;InnerShadow.Mask.Graphics.DrawPicture(&lt;span style="color: blue;"&gt;Self&lt;/span&gt;.IconAtColor(Icon,&amp;amp;c&lt;span style="color: red;"&gt;3F&lt;/span&gt;&lt;span style="color: #00bb00;"&gt;3F&lt;/span&gt;&lt;span style="color: blue;"&gt;3F&lt;/span&gt;),&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;0&lt;/span&gt;)&lt;br /&gt;InnerShadow.Mask.Graphics.DrawPicture(&lt;span style="color: blue;"&gt;Self&lt;/span&gt;.IconAtColor(Icon,&amp;amp;c&lt;span style="color: red;"&gt;FF&lt;/span&gt;&lt;span style="color: #00bb00;"&gt;FF&lt;/span&gt;&lt;span style="color: blue;"&gt;FF&lt;/span&gt;),&lt;span style="color: #336698;"&gt;0&lt;/span&gt;,&lt;span style="color: #336698;"&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;And there we have it, the three layers needed to create the effect. Draw them all directly on top of each other, starting with the drop shadow, then the fill, and finishing with the inner shadow. You can adjust some of the numbers, such as the distances from the top to draw the icon on the drop shadow and inner shadow layers, and choose different colors to create different opacities. Your fill color does not need to be black. You can reverse the inner and drop shadows to create a raised effect. Experiment with this code to achieve new effects.&lt;br /&gt;&lt;br /&gt;A sample project can be &lt;a href="http://realsoftware.cachefly.net/blog/embossing/EmbossingExample.zip"&gt;downloaded here&lt;/a&gt; which includes the artwork and code ready to run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-7971625585984726115?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/7971625585984726115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=7971625585984726115' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7971625585984726115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7971625585984726115'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/11/embossing-effects-on-fly.html' title='Embossing Effects On-The-Fly'/><author><name>Thom McGrath</name><uri>http://www.blogger.com/profile/05135025818950044797</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_-oZ3Nd9coj0/Sa2axP5y4tI/AAAAAAAAAAM/IiZERDhd3dE/S220/photo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Q-ogbbzrO0I/TtZkOKRDluI/AAAAAAAAACc/ZxHXgUmj8o4/s72-c/TrayPreviewOld.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-9215040884751100596</id><published>2011-11-15T10:11:00.001-06:00</published><updated>2011-11-30T12:13:40.840-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><category scheme='http://www.blogger.com/atom/ns#' term='Education'/><title type='text'>More than an Introduction to Programming</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Last week Peter Wayner wrote a nice piece in the New York Times titled "&lt;a href="http://www.nytimes.com/2011/11/10/technology/personaltech/computer-programming-for-children-minus-cryptic-syntax.html?_r=3"&gt;Programming for Children, Minus the Cryptic Syntax&lt;/a&gt;". Anything that gets kids interested in programming is a good thing and the article discusses a few software products designed specifically to teach kids programing logic in a fun and intuitive way.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Real Studio would have a made a great addition to this list. Though most of the software tools Wayner mentions are great for introducing programming to kids, they can't realistically be used for much more than that. On the other hand, Real Studio can be used to introduce programming to kids without limiting what they can do to simplistic programming. Real Studio&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;is really accessible to children and is already used in many schools around the world to teach programming.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Many people feel that you have to choose between something being easy and intuitive or difficult and powerful. I think that choice is a copout- you can have it both ways, though it may require more design and thought to achieve. We add features that make Real Studio easier and we add features that make it more powerful. We work to make it intuitive for those learning programming for the first time and at the same time, make it powerful for experienced developers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;You can have it both ways if you take the time to design your products with this in mind and the result can be a far superior product, one that students would be lucky to get their hands on early.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-9215040884751100596?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/9215040884751100596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=9215040884751100596' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/9215040884751100596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/9215040884751100596'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/11/more-than-introduction-to-programming.html' title='More than an Introduction to Programming'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6463431051830077703</id><published>2011-11-10T12:07:00.000-06:00</published><updated>2011-11-30T12:12:46.227-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>The Winner: HTML5</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Developers have tried for years to deliver applications with desktop-like features and quality through a web browser. In the early days HTML was simply not up to the task. The original solution was to use Java to run an app inside the browser but that, unsurprisingly, resulted in a horrible user experience. Later Flash appeared. Flash provided a much higher quality experience because the Flash browser plugin could do just about anything in terms of the user interface while still providing the benefit of deploying the app through a browser. Java and Flash are similar in concept but one was developed by a company that primarily made servers while the other was developed by a company that exclusively made desktop software. It's not a shock that Flash has a better user experience.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;But Flash is not without downsides. First, the user has to have the Flash plugin installed. Second, the plugin has to load some or all of the application from the server to the user's browser. This often results in the user waiting through an annoying loading progress thermometer. Flash also crashes too often. Over the years, some people have told me that they don't install Flash because their entire system becomes unstable if they do. In addition, Flash and similar technologies like Microsoft's Silverlight are not efficient on mobile devices which are sensitive to battery life. Apple famously chose to not support Flash on iOS because it was felt that Flash was just not efficient enough.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Here at &lt;a href="http://www.realsoftware.com/"&gt;Real Software&lt;/a&gt;, long before there was an iPhone, we considered giving Real Studio users the ability to build applications that could be deployed in a browser via a special plugin we would develop. After much consideration, we decided not to pursue this for many reasons- one of which being we&amp;nbsp;believe&amp;nbsp;that depending on an installed plugin greatly reduces the value of the technology.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Later, AJAX and HTML5 came along making it more possible to build desktop-like applications for the web. This made Adobe Flash and Microsoft Sliverlight less necessary and provided an excellent solution for power-sipping mobile devices.&amp;nbsp;At Real Software,&amp;nbsp;when we decided to investigate building web applications again, the native web technology had caught up with what we wanted to accomplish allowing us to develop our web framework for &lt;a href="http://www.realstudio.com/"&gt;Real Studio&lt;/a&gt;. Real Studio Web Edition has never relied on plugins and instead creates native HTML/HTML5, CSS, JavaScript, etc., on the fly and sends it to the browser.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Now Adobe has&amp;nbsp;&lt;a href="http://www.zdnet.com/blog/perlow/exclusive-adobe-ceases-development-on-mobile-browser-flash-refocuses-efforts-on-html5-updated/19226"&gt;announced&lt;/a&gt;&amp;nbsp;that it's discontinuing the Flash plugin for mobile devices. It also&amp;nbsp;&lt;a href="http://www.zdnet.com/blog/microsoft/will-there-be-a-silverlight-6-and-does-it-matter/11180"&gt;appears&lt;/a&gt;&amp;nbsp;that Microsoft may be putting Silverlight out to pasture as well. Adobe is going to refocus on HTML5. If Microsoft is going to end development of Sliverlight, perhaps they plan to do the same. This will likely be the beginning of the end for Flash as a plugin for desktop browsers as well. If Flash is going to support HTML5 for mobile, where all relevant browsers support HTML5, it's only a matter of time before the majority of desktop users are using an HTML5-compatible browser. At that point, it would not make sense for Adobe to continue to support a Flash browser plugin at all.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;HTML5 has won this fight but it's not a total win for users. Flash is a complete end-to-end solution developed by one company. That allowed Adobe to provide a very consistent user experience. HTML5 (along with CSS, JavaScript, etc.,) is a standard that is then interpreted by the developers of Internet Explorer, Firefox, Chrome and Safari. That's a lot of different people and the result is that these native technologies don't work exactly the same on all browsers, creating extra work for web application developers that have to test and tweak their web apps for each browser. Adobe will have to deal with these inconsistencies.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The &lt;a href="http://www.realstudio.com/web"&gt;Real Studio&lt;/a&gt; web framework already abstracts the developer from these browser differences and from the assembly language of the web (HTML, CSS, JavaScript, AJAX and PHP/Java) as well. This is what web development technologies need to do to make web application development efficient for and accessible to everyone.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;What we are seeing today with this announcement from Adobe and the rumors about Silverlight is technological equivalent of survival of the fittest and this time the winner is HTML5.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6463431051830077703?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6463431051830077703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6463431051830077703' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6463431051830077703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6463431051830077703'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/11/winner-html5.html' title='The Winner: HTML5'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6401805841389305088</id><published>2011-10-27T15:41:00.002-05:00</published><updated>2011-11-30T12:12:02.756-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Safely connecting to a MySQL Database</title><content type='html'>&lt;div class="p1"&gt;You can connect to a MySQL database in a Real Studio web or desktop application using the &lt;a href="http://docs.realsoftware.com/index.php/MySQLCommunityServer"&gt;MySQLCommunityServer class&lt;/a&gt;. If you have built a web application you need to consider &lt;a href="http://en.wikipedia.org/wiki/SQL_injection"&gt;SQL injection&lt;/a&gt; which is a way for someone to get data out of your database that you didn't want them to have or change data that you didn't want changed. The goal is to make sure that user input (such as SQL commands or delimiters) doesn't contain anything to manipulate a database in an unwanted way.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;So, before you upload your web app, take a look at using &lt;a href="http://docs.realsoftware.com/index.php/MySQLPreparedStatement"&gt;prepared statements&lt;/a&gt; to protect your data. Although it uses the Real SQL Database there is example code for this in the Order example project. You can download that project from the about box in the &lt;a href="http://demos.realsoftware.com/cgi-bin/orders/orders.cgi"&gt;Orders example&lt;/a&gt;.&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;Here's some example code from the Real Studio Language Reference:&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p3"&gt;// We'll assume "db" is the MySQL Database object added to your project&lt;/div&gt;&lt;div class="p4"&gt;&lt;span class="s3"&gt;&lt;a href="http://docs.realsoftware.com/index.php/Dim"&gt;Dim&lt;/a&gt;&lt;/span&gt; stmt &lt;a href="http://docs.realsoftware.com/index.php/As"&gt;&lt;span class="s3"&gt;As&lt;/span&gt;&lt;/a&gt; MySQLPreparedStatement&lt;/div&gt;&lt;div class="p5"&gt;&lt;span class="s4"&gt;stmt = MySQLPreparedStatement(db&lt;/span&gt;&lt;span class="s5"&gt;.&lt;/span&gt;&lt;span class="s4"&gt;Prepare(&lt;/span&gt;"SELECT * FROM Persons WHERE Name = ? AND Age &amp;gt;= ?"&lt;span class="s4"&gt;))&lt;/span&gt;&lt;/div&gt;&lt;div class="p4"&gt;stmt&lt;span class="s5"&gt;.&lt;/span&gt;Bind(&lt;span class="s6"&gt;0&lt;/span&gt;, &lt;span class="s7"&gt;"John"&lt;/span&gt;)&lt;/div&gt;&lt;div class="p4"&gt;stmt&lt;span class="s5"&gt;.&lt;/span&gt;BindType(&lt;span class="s6"&gt;0&lt;/span&gt;, MySQLPreparedStatement&lt;span class="s5"&gt;.&lt;/span&gt;MYSQL_TYPE_STRING)&lt;/div&gt;&lt;div class="p4"&gt;stmt&lt;span class="s5"&gt;.&lt;/span&gt;Bind(&lt;span class="s6"&gt;1&lt;/span&gt;, &lt;span class="s6"&gt;20&lt;/span&gt;)&lt;/div&gt;&lt;div class="p4"&gt;stmt&lt;span class="s5"&gt;.&lt;/span&gt;BindType(&lt;span class="s6"&gt;1&lt;/span&gt;, MySQLPreparedStatement&lt;span class="s5"&gt;.&lt;/span&gt;MYSQL_TYPE_SHORT)&lt;/div&gt;&lt;div class="p6"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p4"&gt;&lt;span class="s3"&gt;&lt;a href="http://docs.realsoftware.com/index.php/Dim"&gt;Dim&lt;/a&gt;&lt;/span&gt; rs &lt;a href="http://docs.realsoftware.com/index.php/As"&gt;&lt;span class="s3"&gt;As&lt;/span&gt;&lt;/a&gt; RecordSet = stmt&lt;span class="s5"&gt;.&lt;/span&gt;SQLSelect&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6401805841389305088?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6401805841389305088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6401805841389305088' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6401805841389305088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6401805841389305088'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/10/safely-connecting-to-mysql-database.html' title='Safely connecting to a MySQL Database'/><author><name>jason@real</name><uri>http://www.blogger.com/profile/07648650479087678846</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-7148941542253391635</id><published>2011-10-17T08:51:00.000-05:00</published><updated>2011-10-17T08:51:30.596-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>Siri: The killer app for the iPhone 4S</title><content type='html'>&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;I freely admit that I'm a gadget guy. I often buy new technology when it's first available and I'll admit that has not always worked out. I remember having several "Newton moments" waiting for the Apple Newton to attempt to turn my chicken-scratch handwriting into text. It routinely misunderstood- often to the delight of whomever was watching my demonstration.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;Whenever I want to buy a new gadget, the first step is rationalization. How can I rationalize spending the money on this thing? Well, I don't have any other expensive habits. I don't play golf or gamble. But the real rationalization for buying the new iPhone 4S was my kids. The 8 megapixel camera can shoot 1080p HD video with image stabilization. After all, I can't go back in time and reshoot today’s pictures with a higher quality camera tomorrow. Basically 100% of the photos and video I take of my kids (heck, of anything) are taken with my iPhone; after all they say the best camera in the world is the one you have with you! So I convinced myself (and my wife since we make purchasing decision above $100 together) that the better camera alone was worth it. And it really is.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;But there's another new feature of the iPhone 4S called Siri that I was interested in. For those of you that have somehow managed to still not have heard about Siri, it's a built-in personal assistant that recognizes your voice and can take actions for you. But as much as I attempted to rationalize Siri as a reason to buy the new iPhone 4S, somewhere in the deep recesses of my mind, I couldn't help but think it was going to be more cool than practical. That was, until I tried it.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;Siri can be activated simply by holding your iPhone 4S up to your ear as if you are about to make a call. The very first thing I asked Siri to do was "Tell my wife I'm thinking about her." That is word for word what I said. Siri then sent my wife a text message that read “I’m thinking about her”. Apparently, I should have said, "Tell my wife I'm thinking about you" so that the text message would have been "I'm thinking about you", but that's close enough for me. Next, I asked Siri to call my mom. Siri asked, "What is your mother's name?" and I replied, "JoAnn". "Is your mother JoAnn Perlman?", asked Siri. "Yes", I replied. Siri then asked, "Do you want me to remember that JoAnn Perlman is your mother?" and again I replied, "Yes". Siri then told me it was calling my mom and the call went through. Pretty cool.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;Testing Siri further I asked, "What is the capital of Texas?" Siri responded with a document that had several details about Texas including the fact that the capital is Austin, Texas. On my way home from lunch, I heard a text message come in. I put my iPhone to my ear and asked Siri to read my last message. It read it and asked me if I'd like to reply. I told it what I wanted my reply to say and Siri sent it. Next, I asked it what time my marketing meeting was today. It looked at my calendar and responded correctly. I asked it what I had on my calendar for tomorrow. It read my tasks. I even composed an email message and sent it while driving, though I'm not sure how you tell it which email account to use.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;This is pretty amazing and useful technology and I'm sure Apple will take this much, much further. Siri seems to be &lt;b&gt;the&lt;/b&gt; killer feature of the new iPhone 4S. Someone pointed out to me that technology like this has existed for Android for sometime. Well, in fact Siri has existed for iPhone for some time as well. What Apple did in iOS5 is buy it and deeply integrate it. But it’s interesting that I had never heard of it until now for either platform. Everyone is talking about Siri now but I don’t remember anyone ever mentioning it before for either platform.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Times; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;For an app or feature to be considered “killer” to me, it must be very useful but I also have to know about it. It does no good for a great product or feature to exist if no one ever hears about it.&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/4349911995767920194-7148941542253391635?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/7148941542253391635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=7148941542253391635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7148941542253391635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7148941542253391635'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/10/siri-killer-app-for-iphone-4s.html' title='Siri: The killer app for the iPhone 4S'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5414443358122998106</id><published>2011-10-05T20:26:00.001-05:00</published><updated>2011-10-05T20:26:36.885-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Steve Jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>So long, Steve.</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;When I heard this evening about the death of Steve Jobs, I immediately thought about the huge influence he has had on my life over the last 30 years.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I started learning programming on an Apple II. Actually it was a clone because my dad wouldn't "pay extra for a brand." He paid dearly when we replaced the motherboard three times.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I earned my first computer, a Macintosh 512K, doing custom programming for my brother's company.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I made my living working at an Apple dealer and later writing custom Mac software until I went to work for a Mac development tools company in Silicon Valley. In 1994 I left for Austin, Texas where I founded Real Software because there were no good rapid application development tools for the Mac.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;My kids have been growing up watching Pixar movies. And when I saw the trailer for Finding Nemo, I knew Pixar was something special so I bought Pixar stock and held it until they were bought by Disney.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I watched Steve Jobs bring Apple back from the brink to amazing success. Apple is certainly the greatest corporate turn around in history. From the iMac to the iPod, to the iPhone and the iPad, he has left his mark on the world of technology.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Steve Jobs truly was a visionary. He was often way ahead of his time and never allowed the limits of what others thought possible to stop him. He was a relentless taskmaster (based on what the people I know that worked for him) but that was just what came with the package.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;What I learned from Steve Jobs was to not be afraid to dream big, to be passionate about what you do for a living and to never accept "just good enough."&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I had never really realized until tonight that my entire adult life has been so impacted by the vision of Steve Jobs. This might make me sound like an Apple fanboy, but really, I'm just a fan of great products that enable people to do things they couldn't have done without them. Steve Jobs was always great at making great things.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Whether you liked him or hated him, he was a genius. Only a fool would deny that.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;But now he's gone, far too early and the world is diminished.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;So long, Steve. We'll miss you.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&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/4349911995767920194-5414443358122998106?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5414443358122998106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5414443358122998106' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5414443358122998106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5414443358122998106'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/10/so-long-steve.html' title='So long, Steve.'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1065348405169886010</id><published>2011-10-05T10:24:00.000-05:00</published><updated>2011-10-05T10:24:44.944-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='LLVM'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Real Studio, Cocoa and LLVM</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Our new Cocoa-based framework for Mac OS X made some big leaps forward in Real Studio 2011 Release 3. And we continue to hear good results from our beta testers that their projects are running fine under Cocoa. We have set up a way for beta testers to alert us to any showstoppers that may prevent them from shipping their apps. Needless to say, we are prioritizing these to maximize the number of Real Studio developers that will be able to ship Cocoa-based Mac apps using our next release. This is important because starting in November Apple is placing additional restrictions that will require apps submitted to the Mac App Store to be built with Cocoa. To be clear, it's not that they are requiring Cocoa; it's that Carbon apps don't seem to be stable when built with the new restrictions Apple is requiring. To further our efforts to get Cocoa into the best shape we can for our next release, we are adding additional engineering resources.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Real Studio 2011 Release 4 will ship in November. Our Cocoa support will still be considered beta for that release. Our criteria for it to no longer be beta is that we are comfortable making Cocoa the default option for building for Mac OS X. However, although it's beta, there's a very good chance that your projects will work perfectly using the Cocoa build option so give it a try and give us feedback.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;There will be more Cocoa bugs to fix for 2012 Release 1 and there are two additional features that need to be implemented for that release as well: the movie player and drawers. However, we are quite confident that 2012 Release 1, scheduled to ship in February, will bring our Cocoa support to the point where we can remove the beta label. That will be a real milestone for us (no pun intended) as the transition to Cocoa has been a long one.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Once Cocoa is no longer beta, we will return to working on our transition to &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt; for our compiler backend. While we have been focused on Cocoa, the LLVM team has been improving LLVM - and this is great news for us and you! Hooking up the Real Studio debugger was estimated to take us at least a month, due to a significant amount of work required to parse the LLVM metadata. Fortunately, the LLVM team has done this work for us which means LLVM for Real Studio that much closer.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Finally, I'd like to thank all the beta testers who take their time to help us improve Real Studio. Thank you! We really&amp;nbsp;appreciate&amp;nbsp;your efforts and we look forward to putting out the new releases you need.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-1065348405169886010?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1065348405169886010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1065348405169886010' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1065348405169886010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1065348405169886010'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/10/real-studio-cocoa-and-llvm.html' title='Real Studio, Cocoa and LLVM'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-7234327335487732095</id><published>2011-09-30T08:00:00.003-05:00</published><updated>2011-09-30T08:00:05.634-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>What is "App"?</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;The question what is "App" comes about from a recent Feedback case. This case does report a bug - which we've fixed - but it also points out a limitation in peoples' understanding of the Real Studio runtimes.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;So what does App actually refer to?&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;If you change your app class name why does App.&lt;methodname&gt; still refer to the right method that you wrote on your class called "TestApp"?&lt;/methodname&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;This is  a long standing area of confusion.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;When the runtime starts your program, it creates 1 instance of your app class.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;But, at runtime how do you access that instance?&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;You can't use TestApp as that's the name of the class and not a reference to the one instance.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;So how do you, the end user, get access to this one instance?&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;When the IDE compiles your program it actually inserts a function called App that, if you wrote it, would look something like:&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;     &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px;"&gt;Function App() As TestApp&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px;"&gt;               return mAppSingleton&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: small;"&gt;When the runtime starts, it creates an instance of your app class and saves that reference so it can return it later when needed.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;So the App function always returns an instance of your app class - regardless of what it's called.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Lucida Grande; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;And you can always use App.whatever to refer to methods, properties, constants etc. that you put on your app class.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-7234327335487732095?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/7234327335487732095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=7234327335487732095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7234327335487732095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7234327335487732095'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/what-is-app.html' title='What is &quot;App&quot;?'/><author><name>Norman Palardy</name><uri>http://www.blogger.com/profile/04199995960714147285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-2985868864219412890</id><published>2011-09-29T14:42:00.000-05:00</published><updated>2011-09-29T14:42:27.476-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Using SSL with the ServerSocket Class</title><content type='html'>Using ServerSockets to serve SSLSockets has been problematic at best for anyone wanting to create an application that serves secure TCP sockets. It was recently brought to my attention that even though a critical framework bug was fixed this spring, we still lacked instructions on how to set it up properly.&lt;br /&gt;&lt;br /&gt;The instructions here are for Linux and Mac OS X, and we are actively trying to figure out the right configuration for Windows. As soon as we have that information, it will be added to the &lt;a href="http://docs.realsoftware.com/index.php/SSLSocket"&gt;SSLSocket page&lt;/a&gt;&amp;nbsp;in the Documentation Wiki.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The &lt;u&gt;Secure&lt;/u&gt; Part of Secure Sockets Layer (SSL)&lt;/b&gt;&lt;br /&gt;The first thing you'll need is to get an SSL Certificate. If you'll be testing internally or only connecting to your own apps, a self-signed certificate will do the trick. For simplicity and ease of understanding, open a Terminal window and follow steps 1-4 on &lt;a href="http://www.akadia.com/services/ssh_test_certificate.html"&gt;this site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The second thing you'll need to do is to combine the private and public keys (server.key and server.csr) into a single file. Use your favorite text editor to copy the contents of server.key into server.csr and save. The resulting file should look something like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;-----BEGIN RSA PRIVATE KEY-----&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;MIICXQIBAAKBgQCgdz6vtxQcENpusUzL+aReKYRQv9lYoxYT4l7yK4ylLw&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;PE/qOVx3puQDYZb80WzvDq2Z4t5KyYEEru3f+s4OfMhdUnDEkkOMLrBE1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;…Edited for content...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;-----END RSA PRIVATE KEY-----&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;-----BEGIN CERTIFICATE-----&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;MIICUTCCAboCCQCaEmvwajGn1DANBgkqhkiG9w0BAQUFADBtMQswCQYDV&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;UzETMBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;…Edited for content...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;-----END CERTIFICATE-----&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;The Hookup&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Now that you've got the certificate, you will need to create an app that can listen securely. If you've done any work using ServerSockets with TCPSockets, you know that ServerSocket has an AddSocket event that fires every time the ServerSocket thinks it needs to make more connections available. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Traditionally, you would create a subclass of ServerSocket and then do something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Function AddSocket() As TCPSocket&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Dim ssl As New SSLSocket&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ssl.ConnectionType = ssl.TLSv1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; //If your certificate has a password you'd enter it here&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ssl.CertificatePassword = ""&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ssl.CertificateFile = getfolderitem("certificatefile.crt")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ssl.Secure = True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Return ssl&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;End Function&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Let's say your ServerSocket subclass is called "MyServer". When you call&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;MyServer.Listen&lt;/span&gt; (assuming everything else is set up), you're all ready to go!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-2985868864219412890?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/2985868864219412890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=2985868864219412890' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2985868864219412890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2985868864219412890'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/using-ssl-with-serversocket-class.html' title='Using SSL with the ServerSocket Class'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-4879113628481292864</id><published>2011-09-27T18:36:00.000-05:00</published><updated>2011-09-27T18:36:59.305-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><title type='text'>Two Steps Backward, One Step Forward</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In August, Mozilla introduced &lt;a href="http://hacks.mozilla.org/2011/08/introducing-webapi/"&gt;WebAPI&lt;/a&gt;, a standard API for web applications to communicate with various parts of smartphones such as contacts, dialing, the clock, etc. This would of course be with the user's permission or some other form of security. They want this API to be the same across all browsers, operating systems and devices. I think this is a great idea and it's really needed to make web-based apps "first class citizens" on mobile devices. Of course most apps may not need this level of access but if yours does, then greatly improving access to a mobile device's hardware, especially in a cross-browser way, would be great. We could certainly use it in &lt;a href="http://www.realsoftware.com/web/"&gt;Real Studio Web Edition&lt;/a&gt;.&lt;ask all="" and="" android="" apis="" apps="" at="" for="" if="" ios="" provides="" these="" thom="" web=""&gt;&lt;/ask&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;But why stop there? Web apps running on browsers on desktop/laptop computers need similar levels of access. These types of devices may not be as sexy as mobile devices but I'd guess that more web apps are accessed from desktop/laptop computers than mobile devices. These apps could benefit from many of the same capabilities that are being suggested by Mozilla for WebAPI.&lt;ask about="" div="" thom="" what=""&gt;&lt;/ask&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Web Apps are great because they are easy to access, require no installation and are easy to maintain for the end user. But while this is a step forward in application development, it's also two steps backward because of the limitations browsers impose in the name of security. I'm all for security but the browser can, as mobile browsers do for things like GeoLocation, ask the user's permission so insure security and enable more powerful web applications.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-4879113628481292864?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/4879113628481292864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=4879113628481292864' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4879113628481292864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4879113628481292864'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/two-steps-backward-one-step-forward.html' title='Two Steps Backward, One Step Forward'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total><georss:featurename>Austin, TX, USA</georss:featurename><georss:point>30.267153 -97.7430608</georss:point><georss:box>30.047727000000002 -98.05891779999999 30.486579 -97.4272038</georss:box></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-3240015620501393740</id><published>2011-09-27T16:00:00.000-05:00</published><updated>2011-09-27T16:00:37.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>OS X &amp; Fonts</title><content type='html'>&lt;div&gt;&lt;div style="font: normal normal normal 13px/normal 'Lucida Grande'; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;One thing that surprises people in OS X is that unlike Classic Mac OS, text drawing OS X can't always draw text in italic or bold.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;There's been some discussion on this in the lists &amp;amp; the forums and the reasons seem to all boil down to OS X drawing routines work differently than Classic Mac OS and require the specific variation of a font be installed so it can be used. There may be more technical underpinnings but the upshot is if you want italic or bold, the font has to have that variant or it won't work.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;You can see this effect for yourself in a tool like TextEdit.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;* Create a document and make it rich text. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;* Type a bunch of text then select it all and open the Font panel.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;* Select a font like Lucida Grande and try making the text italic.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;In 10.5.8 this font has no italic variant and so you cannot select the Italic style for the text. It's not even enabled.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;As you might guess, this affects Real Studio as well since we use system level text rendering routines.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;But there are options.&amp;nbsp;&lt;/span&gt;You can always use the "standard fonts" installed with OS X that have the variants you need.&amp;nbsp;Or, if you need a custom font or need to guarantee that the font you use has the variants, you can set up an Application specific font quite easily.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The following is from &lt;a href="http://forums.realsoftware.com/viewtopic.php?f=21&amp;amp;t=32898&amp;amp;p=182626"&gt;this great tutorial&lt;/a&gt; posted by by paulg on the forums:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;1. Download a custom font file from one of the many font sites on the internet. Many are available for free with no restrictions. For example here is a freebie I will use in this tutorial: http://spacefonts.8m.com/fonts/stargate.zip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;2. In a new RS Desktop Application drag a StaticText Field to the window.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;3. Change the TextFont property to "Stargate" or the exact Full Name of the font, not the filename. You can get the Full Name of the font by using the finder to Get Info on the font File and you will see the Full Name. It is Case Sensitive. Note that you will not see the custom font in the IDE as it will only be visible at runtime, instead the default system font will be used. You can get around this by installing the font on your system. But this defeats the test we are trying to run.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;4. Change the text to something other then Untitled. I also increased the size to 16 in my example and used all Caps for this particular font.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;5. Build the application.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;6. Open the built app's contents folder by right-clicking and choosing "Show Package Contents".&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;7. Navigate to the "Resources" folder and create a new folder to hold your font(s). In my example, I created a folder called "AppFonts".&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;8. Copy your font file(s) to this new directory.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;9. In the Contents folder of the package, open the info.plist file in your favorite editor. If you are using the Plist editor add a new Child and add the key ATSApplicationFontsPath. Plist editor will display it as "Application fonts resource path" and set the value to the name of the folder you created in step 7. In my example I called it "AppFonts" so that is what I put as the Value.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Run the app and you will see the StaticText in the font you specified. In 10.6 you may get a warning that your app wants to use a font that is not installed on the system and asks if you wish to continue.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Of course this could use some automation and there may be a security concern if people get a message that your app wants to use a font that is not installed. I have a few other Non-RB apps that use fonts in this manner and I do not get that warning so not sure what that is about, maybe code signing? &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;You can use more then one font in your app, just include them all in the folder you created in step 7 and refer to them by name.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-3240015620501393740?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/3240015620501393740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=3240015620501393740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3240015620501393740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3240015620501393740'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/os-x-fonts.html' title='OS X &amp; Fonts'/><author><name>Norman Palardy</name><uri>http://www.blogger.com/profile/04199995960714147285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-4134303510178637606</id><published>2011-09-20T13:02:00.000-05:00</published><updated>2011-09-20T13:02:43.394-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Saying Goodbye to Mac OS X 10.4 Tiger</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;We generally support a particular version of an OS for about 5 years. &lt;a href="http://en.wikipedia.org/wiki/Mac_os_x_10.4"&gt;Mac OS X 10.4 &lt;/a&gt;is more than 6 years old now.&amp;nbsp;Apple no longer updates 10.4 even for security issues and most of the sites that report version statistics indicate that usage of 10.4 is at about 5% to 10%.&amp;nbsp;The longer we support older versions of any operating system, the fewer resources we have to support the newer, more modern releases.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;With that in mind, Real Studio 2011 R4, due in November, will be the last release to officially support Mac OS X 10.4. We wanted to make sure you knew this ahead of time so you could plan accordingly.&amp;nbsp;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-4134303510178637606?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/4134303510178637606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=4134303510178637606' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4134303510178637606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4134303510178637606'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/saying-goodbye-to-mac-os-x-104-tiger.html' title='Saying Goodbye to Mac OS X 10.4 Tiger'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-3817760093949348536</id><published>2011-09-20T08:38:00.002-05:00</published><updated>2011-09-20T09:32:37.490-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Smartphones'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='User Interface'/><title type='text'>Windows 8, Metro and Real Studio</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Last week Microsoft released the first developer preview of Windows 8. At Real Software, we have done some preliminary testing of &lt;a href="http://www.realstudio.com/"&gt;Real Studio&lt;/a&gt; on it and so far, so good.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;There are a dozen or more reviews of the Windows 8 developer preview along with the new Metro user interface so I'm not going to write another one. But I will give you my overall view of it and where Microsoft stands at this point.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Metro shows that Microsoft understands the problem of taking the current Windows UI and putting it on tablet. Though&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Metro is a step in the right direction,&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;Microsoft continues to display a no longer deserved arrogance. When it comes to smartphones and tablets, Microsoft is in a distant 3rd place yet they act as if they are the clear frontrunner. When they shipped Windows Phone 7, the team at Microsoft had a &lt;/span&gt;&lt;a href="http://www.zdnet.com/blog/apple/microsoft-celebrates-windows-phone-7-with-mock-iphone-funeral/8152" style="font-family: Arial, Helvetica, sans-serif;"&gt;mock funeral for the iPhone&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;. We all know how that turned out. I watched &lt;a href="http://channel9.msdn.com/events/BUILD/BUILD2011/BPS-1004"&gt;one of the Metro presentations&lt;/a&gt;. The presenter talked as if iOS, arguably the premier smartphone OS, had not already done most everything he was showing. And he talked about iOS and Android without mentioning them by name as if they were not worthy competitors.&amp;nbsp;Professionally, that sounds silly.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Like I said, Metro is a good start and there are minor improvements here and there over iOS as it is today. For example, they have made moving an app from one page to another much simpler by allowing you to hold the app and flip though screens with a second finger. The thing is, Metro is not competing with iOS 4 or even the soon to be released iOS 5. It will be competing with iOS 6 which will be shipping when Windows 8 and Metro, which Microsoft has spent the last two years developing, start shipping. There aren't even rumors about iOS 6 yet. And there are large areas of Metro where it's clear that Microsoft just doesn't get it. The simplicity and clean lines are great. But the animation on the Start screen, while it might make for a good demo, is REALLY distracting. The screen has a dozen visible tiles, each representing an app, some of which are changing their content every few seconds. I was instantly reminded of the scene in the movie &lt;a href="http://www.imdb.com/title/tt0387808/"&gt;Idiocracy&lt;/a&gt; where this guy in the future is sitting in his living room watching nine TV screens all at the same time. Don't get me wrong. I LOVE animation. But it should be used sparingly in a user interface or it can become counterproductive.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Microsoft is really behind the eight-ball. They probably felt they needed to show Windows 8, what is likely to be more than a year before its release, to keep Windows developers focused on Windows development. I get that. But what Microsoft needs more than anything is a change of attitude. They continue to act with arrogance when they have been humbled by Apple and Google in the smartphone and tablet market. Microsoft's stock price hasn't really changed in almost ten years!&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Microsoft is still the dominate player on the desktop. But even there, &lt;a href="http://www.gartner.com/it/page.jsp?id=1632414"&gt;PC sales are flat or in decline&lt;/a&gt; (while Mac sales are on the rise) because a portion of the market is shifting to smartphones and tablets. Microsoft is not at all positioned to keep customers, let alone gain new ones in this market shift. Of course, they are keeping customers to some degree because the cost of switching is high but i&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;f Microsoft is going to have any chance of beating the competition, they need to feel hungry and they need to act humble. Shouting "We're number one!" should be reserved for those that actually are number one.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-3817760093949348536?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/3817760093949348536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=3817760093949348536' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3817760093949348536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3817760093949348536'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/windows-8-metro-and-real-studio.html' title='Windows 8, Metro and Real Studio'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6413882958598582071</id><published>2011-09-14T17:09:00.003-05:00</published><updated>2011-09-14T19:06:40.753-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><category scheme='http://www.blogger.com/atom/ns#' term='Platforms'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><category scheme='http://www.blogger.com/atom/ns#' term='Cross-Platform'/><title type='text'>The Rough Edges of HTML5</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In his&amp;nbsp;&lt;a href="http://www.infoworld.com/d/html5/11-hard-truths-about-html5-169665?page=0,0"&gt;post&lt;/a&gt;&amp;nbsp;last month, "The 11 hard truths about HTML5", Peter Wayner points out that HTML5 has some rough edges that prevent it from unseating native apps. I think he's right.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Wayner&amp;nbsp;begins with the&amp;nbsp;inherent&amp;nbsp;security issues of JavaScript, that if you know what you are doing, you can change variables since they are exposed to you. The solution is to code defensively. The example he cites is a user changing their longitude and latitude to make it appear they are somewhere they are not. Developers should request this data any time they need it rather than store it in variables that could be manipulated by the user. However, this does place the burden on the developer.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Further, there are security issues with web apps built with traditional tools like JavaScript that&amp;nbsp;Wayner&amp;nbsp;doesn't mention. In the vast majority of cases, web apps are a bunch of text files on a server somewhere. &lt;a href="http://www.linkedin.com/pub/larry-nedry/0/b49/a"&gt;Larry Nedry&lt;/a&gt;, a friend of mine and an internet security expert, says, "The only way to make a server totally secure is to unplug it." He's right. If a hacker really wants to get on your server, they will. Since the source code is all exposed, it can be manipulated in ways that can easily go undetected by many developers. We solve this problem in &lt;a href="http://www.realstudio.com/"&gt;Real Studio&lt;/a&gt; by &lt;a href="http://realsoftware.com/web/security.php"&gt;compiling web apps to native machine code&lt;/a&gt;. While it's still possible to hack, it's significantly more difficult and most hackers are likely to move on to an easier target.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Wayner&amp;nbsp;also mentions how local data storage is not as useful as many had hoped because the user can switch browsers or computers. And since it's just a SQLite database, it can be easily changed, which means it's no good for storing sensitive data. He points out that local storage is used for creating applications that work off-line but syncing to a server-side database is problematic as well. Heck, if the user can change the data, syncing could get really screwed up.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;He's right that one of the huge benefits of web apps--that the user doesn't have to install and upgrade them--can also be a detriment. Users aren't always ready to upgrade when the developer is. This is another area where the developer has to be extra careful because he or she is upgrading everybody at the same time. Native apps don't suffer from this problem but this is just one of those things developers have to accept about web applications.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Finally,&amp;nbsp;Wayner&amp;nbsp;discusses the fact that there are incompatibilities between browsers with tag formats, varying levels of feature implementation and hardware idiosyncrasies. He says, "...why have I wasted two weeks trying to get basic audio files to play in all of the major browsers?"&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Good point. In the end, he summarizes it all when he says that many JavaScript developers have left it up to libraries like JQuery to abstract the developer from these differences.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;As developers, heck as humans, we long for a silver bullet solution. Those rarely occur and when they do, they are narrow in focus rather than something as broad as HTML. HTML5 is a great step forward in making web applications more desktop-like. But it's just one of many steps toward this end and as a result, native applications will be with us for a long, long time.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Having said that, one of the ways in which we as developers can make use of the increasingly faster processors available today is by having more abstraction from platform details. The details I'm talking about are not just the ones that&amp;nbsp;Wayner&amp;nbsp;mentions but also from HTML, JavaScript, CSS, PHP, and AJAX or what I call the assembly language of the web.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Developers should be able to build their UI via drag and drop like they do on the desktop. And they should be able to use the same language and frameworks they use for the desktop as well. The browser should be nothing more than the delivery system for the app. Why should a developer have to start over from scratch just to build an app for a new platform? Why should they have to abandon so many of the skills they have mastered?&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Our goal for &lt;a href="http://www.realstudio.com/"&gt;Real Studio&lt;/a&gt;&amp;nbsp;as always been&amp;nbsp;to abstract developers from all of this. &lt;a href="http://www.realstudio.com/"&gt;Real Studio&lt;/a&gt; provides developers with a single IDE, language and framework with which to build applications for Mac OS X, Windows, Linux and the web. Yes, there are some differences between these platforms and we can't abstract 100% of them but we abstract enough to let the developer focus on what makes their application unique. This level of abstraction does require developers to give up some control. However, most developers don't need 100% control and will gladly give some of it up for far greater productivity and security.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The long term solution is for development tools to shield developers from platform differences. Computers and mobile devices have the processing power to allow for this. It is the development tool that can provide the layer of abstraction that smooths out the rough edges of both native and web application development.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6413882958598582071?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6413882958598582071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6413882958598582071' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6413882958598582071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6413882958598582071'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/rough-edges-of-html5.html' title='The Rough Edges of HTML5'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5027005840445304234</id><published>2011-09-13T20:07:00.000-05:00</published><updated>2011-09-13T20:07:31.467-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>When a WebLink is not a web link</title><content type='html'>Every once in a while, a situation comes along where you want the appearance of one control, but the behavior of another. A user recently asked me if they could use a WebLink control just to execute some Realbasic code in the MouseUp event, and you can, but there's a trick!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you add a WebLink to a page and then add a Msgbox command to the MouseUp event like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;Sub MouseUp()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;   MsgBox "Hello World!"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;End Sub&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem is that the WebLink is &lt;i&gt;expecting &lt;/i&gt;to have a URL associated with it. Leaving it blank and clicking anywhere on the text of the link causes the page to refresh, clicking &lt;i&gt;outside&lt;/i&gt; of the text (but still on the control) will execute the code in the MouseUp event.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So how do you get the whole control to behave? In the URL field, type this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'courier new';"&gt;javascript:;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This tells the browser that instead of going to a page, you want it to execute a command (in Javascript). Immediately following with a semicolon sends an empty command, so it does nothing, and the MouseUp event fires the way you want it to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Presto!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-5027005840445304234?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5027005840445304234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5027005840445304234' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5027005840445304234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5027005840445304234'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/when-weblink-is-not-web-link.html' title='When a WebLink is not a web link'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6905196231896755628</id><published>2011-09-06T08:55:00.000-05:00</published><updated>2011-09-06T08:55:39.817-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Developer Costs'/><title type='text'>The Cost of Using a Slow Computer</title><content type='html'>This is an interesting &lt;a href="http://foldingair.blogspot.com/2011/08/how-much-does-your-slow-machine-cost.html"&gt;article&lt;/a&gt; about the cost to a company of having developers using less than optimal computers for their work. At &lt;a href="http://www.realsoftware.com/"&gt;Real Software&lt;/a&gt;, I learned this a long time ago. Replacing developer computers every two years or less is better for the developer and doesn't cost as much as you'd think. You can get more for the computer if you sell it sooner or pass it on to another person in the company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6905196231896755628?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6905196231896755628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6905196231896755628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6905196231896755628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6905196231896755628'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/09/cost-of-using-slow-computer.html' title='The Cost of Using a Slow Computer'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1815236319604841765</id><published>2011-08-29T16:35:00.000-05:00</published><updated>2011-08-29T16:35:00.918-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><category scheme='http://www.blogger.com/atom/ns#' term='Conference'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><title type='text'>Vote for the Real Software Panels at SXSW 2012!</title><content type='html'>South By Southwest (SXSW) is an annual event&amp;nbsp;held in Real Software's hometown of Austin, Texas that celebrates what's new and what's next in Music, Film and Technology.&amp;nbsp;For SXSW 2012, Real Software has offered two panels for the Interactive conference.&lt;br /&gt;&lt;br /&gt;Here is Geoff Perlman in a short video of what he's proposing for his panel &lt;i&gt;&lt;a href="http://panelpicker.sxsw.com/ideas/view/12224?return=%2Fideas%2Findex%2F10%2Fcompany%3AReal+Software"&gt;Navigating the Sea of Programming Languages&lt;/a&gt;&lt;/i&gt;.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-11e7400bcfb26a5b" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v9.nonxt8.googlevideo.com/videoplayback?id%3D11e7400bcfb26a5b%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330315724%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D80AC8C41690D8838A72574CBBE62D7AC3D94011B.545CBC358801F6D9587B0823BF5C039FFAAE951D%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D11e7400bcfb26a5b%26offsetms%3D5000%26itag%3Dw160%26sigh%3DHv98ubwYPePOpByLUQyKsWoHjkc&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v9.nonxt8.googlevideo.com/videoplayback?id%3D11e7400bcfb26a5b%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330315724%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D80AC8C41690D8838A72574CBBE62D7AC3D94011B.545CBC358801F6D9587B0823BF5C039FFAAE951D%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D11e7400bcfb26a5b%26offsetms%3D5000%26itag%3Dw160%26sigh%3DHv98ubwYPePOpByLUQyKsWoHjkc&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Not one to shy away from a&amp;nbsp;challenge, the newest member of Real Software's Engineering team, Greg O'Lone offers his panel &lt;i&gt;&lt;a href="http://panelpicker.sxsw.com/ideas/view/12869?return=%2Fideas%2Findex%2F10%2Fcompany%3AReal+Software"&gt;Web App Evolution - From Mainframe chat to Web 3.0&lt;/a&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Open voting for panels ends Friday...&lt;i&gt;this&lt;/i&gt; Friday, September 2nd! Check out the &lt;a href="http://panelpicker.sxsw.com/ideas/index/10/company:Real+Software"&gt;Real Software panels&lt;/a&gt; and vote for your favorite. Full disclosure: You will have to create an account to vote and comment but it only takes a moment!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-1815236319604841765?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1815236319604841765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1815236319604841765' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1815236319604841765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1815236319604841765'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/08/vote-for-real-software-panels-at-sxsw.html' title='Vote for the Real Software Panels at SXSW 2012!'/><author><name>Alyssa</name><uri>http://www.blogger.com/profile/01227961762199194001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-7A_seQwJ2gA/TsFia5sFQ_I/AAAAAAAAABc/ydlYTgzbQ8w/s220/RealOffice.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-3744457046635424845</id><published>2011-08-25T11:50:00.000-05:00</published><updated>2011-08-25T11:50:37.989-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Steve Jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>Steve Jobs</title><content type='html'>&lt;div&gt;Steve Jobs was born of educated parents then adopted by a working class family. While this wasn't by design, it couldn't have been a more perfect beginning. Intelligence and a strong work ethic make for a good shot at success.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He has always been ahead of his time. Apple didn't invent the first computer small enough and inexpensive enough to have at home. But the two Steves did recognize that every home should have a computer and effectively invented the notion of the personal computer. Jobs has never been short on vision- from the original Apple computer to the Macintosh to NeXT to Pixar to the iMac, iPod, iTunes, iPhone and iPad. But his vision is even greater than that. Every thread of the fabric of Apple is scrutinized by Jobs. I heard that when the first Apple stores were opening, Jobs personally chose the songs that would be playing in the store. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jobs has always been a man of great vision and focus. The vision part, in some ways, is the easy part. You either have it or you don't. I think Job's vision is to make things as easy as possible for the customer and not let the current limitations of technology and others' lack of imagination get in the way. If you ever find yourself interviewing for the job of CEO somewhere, you'd better walk into that interview with your well-thoughtout vision of the future of the company. The board will either love it or thank you for your time but you'd better have it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Focus, on the other hand, is much more difficult. When you are in the role of CEO and you have lots of great ideas for growing the business, it's easy to want to try just about everything you can think of. Having the discipline to focus very intentionally and directly on your value proposition is rare. I remember Jobs once saying, after being praised for the work Apple had done on some product, "I'm more proud of what we have not put into our products than what we have." Jobs believes that you should only put in features that 80% of your customers will use. Anything else distracts the user, making the product harder to understand and less elegant.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At All Things Digital Jobs was asked what it felt like now that Apple was bigger (in market value) than Microsoft. Jobs responded (and I'm paraphrasing here), "It's sort of surreal. But it's not what gets me up in the morning." That really says it all. Jobs doesn't spend much time thinking about Apple's competitors. His focus, and the focus on Apple, is on what is best for their consumer, their customer. Jobs believes that if you focus on your customer, you will win. I think he's right.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have been guilty in years past of wanting to put every feature I could think of into &lt;a href="http://realsoftware.com/realstudio/"&gt;Real Studio&lt;/a&gt;. But I have learned by careful study that that's a mistake. I've grown more focused over the years. That's something I have learned from watching Jobs: focus is an extraordinarily valuable thing. And of course that technology can be beautiful.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jobs has made his share of mistakes. He's an extraordinary demanding CEO which is a nice way of saying that he's not an easy person to work for. He has very high expectations and if you don't see things the way he does, he will tell you, bluntly, rudely and in no uncertain terms. I think he has mellowed over the years a bit, but still, this is who he is. I think perhaps this comes, hand in hand, with his vision, focus and work ethic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;You probably already know the reason for this post today. Steve Jobs has resigned as Apple's CEO. He has formalized what has been the case for the last few years. How will this affect Apple? In the short term, not much. Jobs is going to continue to be as involved as he can at Apple. It's his baby after all. If he has imprinted himself on Apple (and I believe he has) then Apple will continue to be the great company that Jobs always knew it would be.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope Jobs is with us for many more years because I believe he still has a lot to contribute. But if that's not the case, he will certainly be going out at the top of this game.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-3744457046635424845?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/3744457046635424845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=3744457046635424845' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3744457046635424845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3744457046635424845'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/08/steve-jobs.html' title='Steve Jobs'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6675796783308354229</id><published>2011-08-23T11:07:00.011-05:00</published><updated>2011-08-24T16:28:38.632-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Can a programming language be completely visual?</title><content type='html'>&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-cHrYXmc1Hb4/TlVrlRqB-FI/AAAAAAAAACg/NWobzgvJXYQ/s1600/DoubleHelix.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 101px;" src="http://2.bp.blogspot.com/-cHrYXmc1Hb4/TlVrlRqB-FI/AAAAAAAAACg/NWobzgvJXYQ/s320/DoubleHelix.gif" alt="" id="BLOGGER_PHOTO_ID_5644535996117809234" border="0" /&gt;&lt;/a&gt;Google recently abandoned their &lt;a href="http://appinventor.googlelabs.com/about/"&gt;App Inventor for Android&lt;/a&gt; development tool. To be totally accurate they open-sourced it, but it's clear they won't be investing it in any longer. App Inventor was designed to make it possible to build apps (though certainly not every kind of app) for Android without having any background in programming. It didn't take off to the degree that would be required for it to stay within Google's focus, so they dumped it. It might not be a popular move (especially with App Inventor users) but it's still likely the correct one.&lt;br /&gt;&lt;br /&gt;There have been many attempts to make a programming language that is completely visual. The idea is that rather than type in lines of code, you would drag and drop icons that each represent an object or function and then chain them together to create your application's logic. It sounds great in theory and it demos very well. But does it work in reality?&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;If you are as old as I am, you've seen visual programming a few times before. There was a database development tool for the Mac back in the 1980's called Double Helix. Its programming language was completely visual and it was very easy to get started. However, as your functions became larger and more complex, the code became unwieldy. I remember visiting a friend who was building an application in Double Helix for his company. He had printed out some of his functions but they were so large (because icons simply consume more space than the equivalent text-based code) that he had literally covered an entire wall of his office. It was quickly becoming impractical.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-B45zMCZpWLY/TlVrsKSCkJI/AAAAAAAAACo/L7_t-9YTILQ/s1600/scratch.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 217px;" src="http://2.bp.blogspot.com/-B45zMCZpWLY/TlVrsKSCkJI/AAAAAAAAACo/L7_t-9YTILQ/s320/scratch.png" alt="" id="BLOGGER_PHOTO_ID_5644536114397221010" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;There was also a series of products called VIP (Visual Interactive Programming) that attempted visual programming. And there was &lt;a href="http://en.wikipedia.org/wiki/AppWare"&gt;AppWare&lt;/a&gt; as well, which eventually failed. I looked at another one called Prograph which used a wiring diagram model which I'm sure made a lot of sense if you were an electrician or electrical engineer. The database development tool I used back in the 1980's through the mid-1990's, 4D, had a flowchart-based option (as opposed to the more popular text-based option) for writing methods but it wasn't very popular and I believe they eventually abandoned it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's an interesting Wikipedia article about &lt;a href="http://en.wikipedia.org/wiki/Visual_programming_language"&gt;visual programming languages&lt;/a&gt;. As I looked down the list of languages, I was surprised to see so many of them but I didn't recognize many names.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Why aren't visual programming languages more popular? Probably for the same reasons that visual instructions aren't always used in daily life. They can and do work just fine for simple things but the more complex and intricate the instructions need to be, the more difficult it becomes to describe them visually. We spend so much time reading and writing that it's really the only way we receive and communicate complex instructions. Of course there are times where visual instructions make sense but they are usually for dealing with physical things like Legos or building Ikea furniture.&lt;div&gt; &lt;div&gt; &lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-kgyGowuut94/TlVrJ0PRLhI/AAAAAAAAACY/pi6sSilTGL4/s1600/IkeaImage.jpeg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 122px; height: 117px;" src="http://4.bp.blogspot.com/-kgyGowuut94/TlVrJ0PRLhI/AAAAAAAAACY/pi6sSilTGL4/s320/IkeaImage.jpeg" alt="" id="BLOGGER_PHOTO_ID_5644535524364463634" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;/div&gt; &lt;/div&gt; &lt;div&gt; &lt;div&gt;   &lt;/div&gt; &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;   &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I will continue to investigate future attempts at visual programming because I think it's an interesting area to research but I don't hold out much hope for a solution that can really be scaled to solve large, complex problems. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6675796783308354229?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6675796783308354229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6675796783308354229' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6675796783308354229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6675796783308354229'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/08/can-programming-language-be-completely.html' title='Can a programming language be completely visual?'/><author><name>Geoff Perlman</name><uri>http://www.blogger.com/profile/11524976523539738000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-cHrYXmc1Hb4/TlVrlRqB-FI/AAAAAAAAACg/NWobzgvJXYQ/s72-c/DoubleHelix.gif' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6704816105007932652</id><published>2011-08-17T16:25:00.000-05:00</published><updated>2011-08-17T16:25:07.311-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Stack Trace'/><category scheme='http://www.blogger.com/atom/ns#' term='Exceptions'/><title type='text'>Ok who did it?</title><content type='html'>Like solving a tough mystery, debugging software can be challenging too, especially if you plan on targeting multiple platforms and even then you have multiple versions of multiple platforms (i.e. XP, Vista, Snow Leopard, Lion, Ubuntu, KUbuntu, etc.).  Real Studio makes this task easier as you can run your app and debug it locally on each platform or with our remote debugger.  However, there comes a time when you release your app to the masses, and you are faced with the possibility of some users who do things that you don't expect and crash your app.  For simplicity sake we'll consider these two types of crashes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a RealBasic exception (stack overflow, accessing a Nil Object, etc.)&lt;/li&gt;&lt;li&gt;an OS exception (memory corruption, buffer overflows, invalid operations, etc.)&lt;/li&gt;&lt;/ul&gt;Luckily a RealBasic exception is something that we generate and can be caught easily.  An OS exception however, is more fatal and can usually be attributed to poorly written declares, invalid pointer manipulation, plug-ins, performing GUI operations in a separate thread, or something in our framework.&lt;br /&gt;&lt;br /&gt;In most cases when a user encounters a RealBasic exception you can catch this and continue with your program execution.  However, if the user encounters a RealBasic exception that you're not expecting, you can create a stack trace (also referred to as the call stack) to help you narrow this down.  I'm not going to go into details about catching exceptions as Geoff's &lt;a href="http://www.realsoftwareblog.com/2010/07/exceptional-exceptions.html"&gt;blog post&lt;/a&gt;&amp;nbsp;explains it very well, but being able to receive a stack trace from your user(s) can help you locate the problem.&lt;br /&gt;&lt;br /&gt;So what is a stack trace?  In short, it's a stack of method calls.  All apps begin at a main entry point and starting from there it calls other methods.&lt;br /&gt;&lt;pre&gt;[   etc.  ]&lt;br /&gt;[ Method2 ]&lt;br /&gt;[ Method1 ]&lt;br /&gt;[   Main  ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Knowing in which method the exception occurred will help you narrow down the issue.  Great, so how do I get this stack information?  &lt;begin details="" gory=""&gt; Those familiar with compilers and using debug symbols know that this information must be stored in the built app.  Consider that a method call is really just a pointer to some executable memory location, we need a way to map that address to a human readable method name.   To be able to generate a readable stack trace you will need to enable App.IncludeFunctionNames, which defaults to off.  With this enabled, RuntimeException.Stack will now contain a readable stack trace.&lt;br /&gt;&lt;br /&gt;Since the exception isn't handled by your app, you'll probably want to record the stack information in App.UnhandledException.  Consider this less than real world example:&lt;br /&gt;&lt;/begin&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;Sub Window.Open()&lt;br /&gt;Call Test&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Sub Test()&lt;br /&gt;// This will cause a NilObjectException&lt;br /&gt;Dim f As FolderItem&lt;br /&gt;f.Visible = True&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Function App.UnhandledException(error As RuntimeException) As Boolean&lt;br /&gt;MsgBox Join( error.Stack, EndofLine )&lt;br /&gt;End Function&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;When you build and run this app, assuming you enabled App.IncludeFunctionNames, you should see something like this appear:&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;Window1.Window1.test%%o&amp;lt;Window1.Window1&amp;gt;&lt;br /&gt;Window1.Window1.Event_Open%%o&amp;lt;Window1.Window1&amp;gt;&lt;br /&gt;:&lt;br /&gt;[additional stack trace snipped for brevity]&lt;br /&gt;:&lt;br /&gt;%main&lt;br /&gt;&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, the output is a bit mangled, but being able to record the stack trace can help you track down the issue when debugging isn't possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6704816105007932652?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6704816105007932652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6704816105007932652' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6704816105007932652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6704816105007932652'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/08/ok-who-did-it.html' title='Ok who did it?'/><author><name>William@Real</name><uri>http://www.blogger.com/profile/16943221511084338957</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5519612959191119380</id><published>2011-08-02T08:00:00.003-05:00</published><updated>2011-08-22T12:18:50.057-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='UK'/><category scheme='http://www.blogger.com/atom/ns#' term='Leicester'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><title type='text'>A Breath Of Fresh Air</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-rwwfG5I0ljI/TlKOuc0k3aI/AAAAAAAAABo/LJTDQZEQuCM/s1600/Looking%2BAt%2BIssues.jpeg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-rwwfG5I0ljI/TlKOuc0k3aI/AAAAAAAAABo/LJTDQZEQuCM/s320/Looking%2BAt%2BIssues.jpeg" alt="" id="BLOGGER_PHOTO_ID_5643730211710492066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style=";font-family:Verdana;font-size:12px;"  &gt;Being a Real Studio &lt;/span&gt;&lt;span class="Apple-style-span" style=";font-family:Verdana;font-size:12px;"  &gt;developer can be lonely work, especially if you work on your own like many of us do. We often go to cli&lt;/span&gt;&lt;span class="Apple-style-span" style=";font-family:Verdana;font-size:12px;"  &gt;ent sites, but the project work we do is usually done at home on our own.&lt;/span&gt;&lt;span class="Apple-style-span" style=";font-family:Verdana;font-size:12px;"  &gt; We are all used to having to work problems out ourselves using the forums, or occasionally by asking questions on the NUG.&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-knaJcytQ2t0/TlKO2nkxzoI/AAAAAAAAABw/uYVX8AjK5eM/s1600/Christian.jpeg"&gt;&lt;/a&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"&gt; &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;In May, a client using several of my bespoke Real Studio databases asked me to recommend someone who could support them should I become unable in future. I found another experienced developer and we met a couple of times. It went so well we decided to form a user group in the midlands, UK. We planned to hold an event in Leicester on July 28&lt;span style="font: 8.0px Verdana"&gt;th&lt;/span&gt; to get some UK-based developers together.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"&gt; &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;After getting the word out through Real Software and Christian Schmitz from MonkeyBread Software, and on the NUG, we hoped to get ten people from England to attend our event. The response was overwhelming and the event quickly sold out. One guy even asked if we had plans to stream the event live so he could watch from the USA! There is clearly a demand for Real Studio developer events and networking meetings. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"&gt; &lt;/p&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;The event was last Thursday. About ten of us socialized together in the hotel the evening before, which was a nice icebreaker. The event went very well. Seventeen developers from England, Germany and Belgium came for the day. The three guys from Belgium found they worked about two miles from each other and lived about seven miles apart! &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"&gt; &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;The main reason people wanted to come was to meet other Real Studio developers, to socialize, to discuss technical issues and get help, and meet people who could maybe help in future projects.  &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"&gt; &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;The presentations were well received. We also had a video chat with Geoff Perlman, who demonstrated the latest Web Edition and also answered our technical questions and talked about the future direction of the IDE.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"&gt; &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;The benefits for me have been great. I discovered lots of simple but very useful things I didn’t know. I’ve also made useful contacts and have new development and training opportunities to explore. I learned how to make some of my coding quicker and easier, and got fresh ideas for my own projects. I now know how to get around some technical issues I had been struggling with and I helped a few other developers get over a technical problem too.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"&gt; &lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;It’s been a breath of fresh air. I have new contacts and feel energized. &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana; min-height: 15.0px"&gt; &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;You don’t have to be alone if you work for yourself. You can get involved with a user group, and go to meetings. You can work out answers to your issues with others, find out how to do things better, and help others with their issues. You never know where it could lead.&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;Eric Gibbon (eric@mactasks.com) &lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;MacTasks Limited&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;Co-Founder, RSDevsUK&lt;/p&gt;&lt;meta charset="utf-8"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;&lt;meta charset="utf-8"&gt;@RSDevsUK and &lt;span class="Apple-style-span" style="color: rgb(68, 68, 68);   line-height: 22px; font-family:'Helvetica Neue', Arial, Helvetica, 'Liberation Sans', FreeSans, sans-serif;font-size:13px;"  &gt;&lt;a target="_blank" rel="me nofollow" href="http://rsdevs.org.uk/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 132, 180); text-decoration: underline; "&gt;http://rsdevs.org.uk&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Verdana"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&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/4349911995767920194-5519612959191119380?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5519612959191119380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5519612959191119380' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5519612959191119380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5519612959191119380'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/08/breath-of-fresh-air.html' title='A Breath Of Fresh Air'/><author><name>Eric Gibbon</name><uri>http://www.blogger.com/profile/00336681701283243890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-rwwfG5I0ljI/TlKOuc0k3aI/AAAAAAAAABo/LJTDQZEQuCM/s72-c/Looking%2BAt%2BIssues.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-7151416546987110417</id><published>2011-08-01T06:30:00.002-05:00</published><updated>2011-08-01T10:50:23.777-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Events'/><category scheme='http://www.blogger.com/atom/ns#' term='announcements'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL World'/><title type='text'>Announcing Real World 2012!</title><content type='html'>&lt;meta charset="utf-8"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;We are &lt;i&gt;very&lt;/i&gt; pleased to announce Real World 2012, the biggest Real Studio event of the year! &lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;At Real World 2012 you can attend informative, educational sessions, network with other Real Studio users, meet the Real Software team and gain industry insight...Oh, and since it's in Orlando you will certainly have a bit of fun too! &lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;The conference will be held May 24-25, 2012 in Orlando, Florida, at the &lt;a href="http://www.royalplaza.com/"&gt;Royal Plaza Hotel&lt;/a&gt;! Save the date, registration will open soon.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;meta charset="utf-8"&gt;Just think, "I'm going to Real World 2012...and Disneyworld!"&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; "&gt;For details visit the &lt;a href="http://www.realsoftware.com/community/realworld.php"&gt;Real World website&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-7151416546987110417?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/7151416546987110417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=7151416546987110417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7151416546987110417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7151416546987110417'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/08/announcing-real-world-2012.html' title='Announcing Real World 2012!'/><author><name>Alyssa</name><uri>http://www.blogger.com/profile/01227961762199194001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-7A_seQwJ2gA/TsFia5sFQ_I/AAAAAAAAABc/ydlYTgzbQ8w/s220/RealOffice.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6556294014654031608</id><published>2011-07-28T13:31:00.003-05:00</published><updated>2011-07-28T14:49:47.049-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Setting up Control Arrays in Real Studio Web Apps</title><content type='html'>&lt;meta equiv="Content-Type" content="text/html; charset=UTF-8"&gt; &lt;meta equiv="Content-Style-Type" content="text/css"&gt; &lt;title&gt;&lt;/title&gt; &lt;meta name="Generator" content="Cocoa HTML Writer"&gt; &lt;meta name="CocoaVersion" content="1038.36"&gt; &lt;style type="text/css"&gt; p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px} &lt;/style&gt;   &lt;p class="p1"&gt;The way that you set up a control array in a web app is a little different than the way you create one in a desktop app.&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;Let's say that you have put a Label control named Label1 on a window and you want to make a copy of it. First you set the Index property of Label1 to 0 in the properties pane.&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;I put this code in the Action event of a push button but it could go a number of different places.&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;  dim myLabel as Label1 = self.AddLabel1&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;  myLabel.top = 160  //now move the new label so that we can see it&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;That's it! Now you have a copy of the Label. If you want to set the text in both labels the code looks like this:&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;  Label1(0).text = "Real Studio"&lt;/p&gt; &lt;p class="p1"&gt;  Label1(1).text = "Web App"&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;Of course, you have more than one copy of this Label and other controls in Real Studio. &lt;/p&gt;&lt;p class="p1"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6556294014654031608?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6556294014654031608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6556294014654031608' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6556294014654031608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6556294014654031608'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/07/setting-up-control-arrays-in-real.html' title='Setting up Control Arrays in Real Studio Web Apps'/><author><name>jason@real</name><uri>http://www.blogger.com/profile/07648650479087678846</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-2214628050871642349</id><published>2011-07-25T13:54:00.004-05:00</published><updated>2011-07-25T16:40:08.013-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac App Store'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Real Studio, Sandboxing, and the Mac App Store</title><content type='html'>&lt;span class="Apple-style-span" style="  border-collapse: collapse; "&gt;&lt;div class="im"&gt;&lt;div class="im"&gt;As some of you have heard, Apple is going to require all applications submitted to the Mac App Store to be &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;sandboxed&lt;/span&gt;&lt;/span&gt; starting in November.&lt;/div&gt;&lt;div class="im"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="im"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Sandboxing&lt;/span&gt;&lt;/span&gt; is a security feature that limits the amount of damage your application can do if it was to be exploited. The way this works is that an application, by default, is unable to see or manipulate any of the world around it. Not only does this mean that there are fewer attack vectors to compromise your application, but also that it would be unable to harm the user if it was.&lt;/div&gt;&lt;div class="im"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="im"&gt;However, applications running in complete isolation would not be very useful. What Apple has done is added controlled holes in the sandbox called entitlements. These entitlements let your application access only the bits of the outside world that it absolutely has to. For example, there are entitlements that allow you access the computer's video camera, access the user's address book, or make outgoing network connections.&lt;/div&gt;&lt;div class="im"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="im"&gt;One entitlement in particular is interesting: the ability to use open and save dialogs. Since the application does not have access to the entire &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;file system&lt;/span&gt;, normal open and save dialogs would be completely useless. So what Apple has done is design a system they call &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Powerbox&lt;/span&gt;&lt;/span&gt; that seamlessly shows the open box in another process. When the user selects a file from the dialog, it then pokes a hole in your application's sandbox and then you can use that file.&lt;/div&gt;&lt;div class="im"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="im"&gt;Unfortunately &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Powerbox&lt;/span&gt;&lt;/span&gt; is very broken in Carbon applications. We've filed all of the appropriate bug reports with Apple (rdar://9695639, rdar://9695604, rdar://9695574) but it is unclear if they will ever be fixed. It is our opinion that Apple is moving Carbon into a maintenance mode and is only doing updates to keep applications fitting the look and feel of Mac OS X as it changes.&lt;/div&gt;&lt;div class="im"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="im"&gt;What does this mean for your application built with Real Studio? Basically, it means that the Real Studio Carbon framework cannot be used for applications targeting the Mac App Store. By November, you must switch to using the Real Studio Cocoa framework to submit applications to the Mac App Store.&lt;/div&gt;&lt;div class="im"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="im"&gt;We realize that our Cocoa framework, in its current state, may not be stable or complete enough for some of your applications. However, we have not stopped working on it and it is improving with each release.&lt;/div&gt;&lt;div class="im"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="  border-collapse: collapse; "&gt;&lt;div class="im"&gt;&lt;div class="im"&gt;We hope to have addressed all of your important Cocoa framework issues by November. In order to do that we need your feedback. So please test your projects under Cocoa and report issues in Feedback so we can ensure a seamless release.&lt;/div&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/4349911995767920194-2214628050871642349?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/2214628050871642349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=2214628050871642349' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2214628050871642349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2214628050871642349'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/07/real-studio-sandboxing-and-mac-app.html' title='Real Studio, Sandboxing, and the Mac App Store'/><author><name>Joe Ranieri</name><uri>http://www.blogger.com/profile/08524614329732033775</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5732323589939991383</id><published>2011-07-21T07:00:00.002-05:00</published><updated>2011-07-21T12:10:34.413-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><title type='text'>Real Studio July Upgrade Sale</title><content type='html'>&lt;div&gt;Good news everyone! Now through July 31st you can get 20% off any Real Studio upgrade to Pro or Enterprise editions. Just use Promo Code UPSALE and get access to more powerful Real Studio features &amp;amp; functionality! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Working in Personal but want to cross compile? Using Pro but want Web Edition or the Profiler? This is your opportunity to upgrade at a 20% discount!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For a comparison of Real Studio editions visit this &lt;a href="http://realsoftware.com/realstudio/compare.php"&gt;chart&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/4349911995767920194-5732323589939991383?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5732323589939991383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5732323589939991383' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5732323589939991383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5732323589939991383'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/07/real-studio-july-upgrade-sale.html' title='Real Studio July Upgrade Sale'/><author><name>Alyssa</name><uri>http://www.blogger.com/profile/01227961762199194001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-7A_seQwJ2gA/TsFia5sFQ_I/AAAAAAAAABc/ydlYTgzbQ8w/s220/RealOffice.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-2585315982128420317</id><published>2011-07-20T10:09:00.000-05:00</published><updated>2011-07-20T10:09:54.937-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><title type='text'>Now Forming! Real Studio User Groups</title><content type='html'>If you get the &lt;a href="http://realsoftware.com/support/listmanager/"&gt;Real Software newsletter&lt;/a&gt; or follow us on Facebook or Twitter, you know that Real Studio User Groups are really taking off - we now have user groups in four countries and on three continents! User groups can be great resources for new and long-time Real Studio users; they offer unique networking opportunities, training and technical assistance. In June the &lt;a href="http://groups.google.com/group/rsbaug?pli=1"&gt;San Fransisco Bay Area&lt;/a&gt; user group held a virtual Web Edition demo + question &amp;amp; answer session with Geoff Perlman. On July 28th, the UK group (&lt;a href="http://www.rsdevs.org.uk/"&gt;RSDevUK&lt;/a&gt;) will host a sold out event in Leicester, UK and the Auckland, New Zealand group is preparing for their first meeting!&lt;br /&gt;&lt;br /&gt;These groups are further proof of the extensive and active user community surrounding Real Studio. Our community is easily one of Real Studio's greatest resources. If you are interested in starting or just participating in a user group in your area, please let us know.&lt;br /&gt;&lt;br /&gt;For a full list of Real Studio User Groups visit our updated &lt;a href="http://realsoftware.com/community/"&gt;Community page.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-2585315982128420317?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/2585315982128420317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=2585315982128420317' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2585315982128420317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2585315982128420317'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/07/now-forming-real-studio-user-groups.html' title='Now Forming! Real Studio User Groups'/><author><name>Alyssa</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_1AO2sCoOwGo/TEiHnLAAK8I/AAAAAAAAAAM/mKuDxLSVQRc/S220/Photo+3.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-3664827444132315883</id><published>2011-07-07T07:00:00.002-05:00</published><updated>2011-07-07T12:07:31.166-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>An update on Mac App Store compatibility</title><content type='html'>&lt;div&gt;We have gotten some reports that people can't submit their applications to the Mac App Store with Application Loader 1.4.1. Specifically, it would give an error about missing required architectures. It is possible to work around this by using Application Loader 1.4. However, it is likely that Application Loader 1.4 will stop working in the near future.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;At WWDC we spoke with an Apple engineer about this and we are pleased to announce that this issue has been fixed in Real Studio 2011r2. We highly encourage all users who are currently submitting or intend to submit their applications to the Mac App Store to upgrade to the most recent release.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;In terms of technical details, the problem was that the Real Studio linker was not emitting the &lt;a href="http://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html#//apple_ref/c/tag/uuid_command"&gt;LC_UUID load command&lt;/a&gt; in generated Mach-O binaries. This load command is essentially a unique identifier for your program and allows Apple to group together crash logs (and other information we don't even know about). We now generate the proper information, which can be verified by running 'otool -l', like so:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;[joe@Mac-Pro.local ~] otool -l "/FancyApp.app/Contents/MacOS/FancyApp"&lt;br /&gt;...&lt;br /&gt;Load command 11&lt;br /&gt;cmd LC_UUID&lt;br /&gt;cmdsize 24&lt;br /&gt;uuid 15416171-690E-4D46-B15F-AD456B1EA572&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-3664827444132315883?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/3664827444132315883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=3664827444132315883' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3664827444132315883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3664827444132315883'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/07/update-on-mac-app-store-compatibility.html' title='An update on Mac App Store compatibility'/><author><name>Joe Ranieri</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-4742977329394665737</id><published>2011-07-06T15:29:00.001-05:00</published><updated>2011-07-06T15:30:39.913-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cross-Platform'/><title type='text'>The multi-platform era</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;In a &lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.asymco.com/2011/07/06/the-post-pc-era-will-be-a-multi-platform-era/"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;blog post&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt; today, Horace Dediu explains that the Post-PC era will be a multi-platform era:&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: x-small; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;"So the very reasons which are driving developers to spread their bets across all and any new platforms should indicate the potential for new platforms and the sustainability of small platforms. The thesis that one dominant platform wins the mobile “war” is naive. The post-PC era will be a multi-platform era. Developers already understand this. Platform vendors know this. It’s time to unlearn the lessons of the PC era."&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: small; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span"&gt;I agree with him and our vision for &lt;/span&gt;&lt;/span&gt;&lt;a href="http://realsoftware.com/realstudio/"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span"&gt;Real Studio&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span"&gt; has always been to allow developers to learn one set of tools to leverage as many platforms as possible. We started with the three major desktop platforms (Mac, Windows and Linux) then added the web in 2010, mobile platforms will be next.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: small; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-style-span"&gt;Providing platform abstraction is how we maximize the value of Real Studio- letting Real Studio developers focus on what makes their solutions unique rather than the details of so many diverse platforms.&lt;/span&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/4349911995767920194-4742977329394665737?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/4742977329394665737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=4742977329394665737' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4742977329394665737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4742977329394665737'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/07/multi-platform-era.html' title='The multi-platform era'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1266532058589582760</id><published>2011-06-29T12:40:00.000-05:00</published><updated>2011-06-29T12:40:33.636-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>The challenges of HTML5</title><content type='html'>Ed Silverstein of the HTML5 Report published an interesting &lt;a href="http://html5.tmcnet.com/topics/html5/articles/191178-html5-face-many-challenges-ahead.htm"&gt;article&lt;/a&gt; yesterday about the benefits of HTML5 to developers. He mentioned Real Studio's new HTML5 features as well. It's great to see people outside of the Real Studio community recognizing Real Studio as alternative to traditional tools for building web applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-1266532058589582760?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1266532058589582760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1266532058589582760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1266532058589582760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1266532058589582760'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/06/challenges-of-html5.html' title='The challenges of HTML5'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5911889028372203278</id><published>2011-06-27T10:56:00.008-05:00</published><updated>2011-07-27T17:01:57.079-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='10.7'/><category scheme='http://www.blogger.com/atom/ns#' term='Carbon'/><category scheme='http://www.blogger.com/atom/ns#' term='LLVM'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Lion'/><title type='text'>The Future of PowerPC and Carbon Support</title><content type='html'>&lt;div&gt;Next month, Apple will ship OS X Lion (10.7). In order for our engineers to be able to develop and test on Lion, we must upgrade to the latest version of Apple's development tools. The new version does not support PowerPC. Therefore we will have to drop PowerPC support entirely for Real Studio 2011 Release 4 due this Fall. &lt;a href="http://update.omnigroup.com/"&gt;Less than 5% of Mac users&lt;/a&gt; are still using PowerPC-based Macs and by the time we ship R4 it will have been five years since Apple switched to the x86 Intel processor. I know for some of you this will cause some grief but you can still use 2011 Release 3 and earlier builds to support PowerPC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you know, we are moving our Mac framework from Carbon to Cocoa. Real Studio 2011 R2 includes greatly improved support for Cocoa. Many users are telling us they can ship their apps built with our current Cocoa-based framework. We believe that our Cocoa support will be complete enough to no longer be considered beta starting with Real Studio 2011 R4. At that time, Carbon will be deprecated. That means we will not be fixing any Carbon-specific bugs except for the most egregious. We will continue to support Carbon as a build option until we ship a release of Real Studio that includes a LLVM-based compiler as the default build option. In that release, Carbon will no longer be available as a build option.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Transitions are not always easy, but sometimes they are necessary in order for us to move forward. I know that for some of you these transitions will cause some grief but I think you can see that they are necessary if we are to keep making Real Studio better.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-5911889028372203278?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5911889028372203278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5911889028372203278' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5911889028372203278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5911889028372203278'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/06/future-of-powerpc-and-carbon-support.html' title='The Future of PowerPC and Carbon Support'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5874767857264670631</id><published>2011-06-24T08:55:00.000-05:00</published><updated>2011-06-24T10:55:09.686-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Key events of web browser KeyEvents</title><content type='html'>One area of Web Edition which has been confusing to our users has been the data that is returned from a user's browser with the two keyboard events — KeyDown and KeyUp. In Real Studio 2011r2, we've changed some things around to make the data more consistent from browser to browser and simpler to implement.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First of all, instead of two events, there is now only one, KeyPressed. This event fires &lt;i&gt;after&lt;/i&gt; a key has been pressed and the Details parameter now includes several more pieces of information:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;4 Booleans that indicate the state of the different meta keys — AltKey, CtrlKey, MetaKey and ShiftKey.&lt;/li&gt;&lt;li&gt;Character contains the character that the user typed, assuming the key that was pressed has a glyph associated with it.&lt;/li&gt;&lt;li&gt;CharCode contains the ascii character code associated with the key.&lt;/li&gt;&lt;li&gt;KeyCode contains the keyboard code associated with the key (note: this &lt;i&gt;may&lt;/i&gt; be different than CharCode, but not always). 28 KeyCode Constants to help you figure out which non-character key has been pressed.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Note: Some browsers even include the key &lt;i&gt;names&lt;/i&gt; in the Character property. For instance, if you pressed the down arrow key, Character might be set to "Down". Don't rely on this functionality, it's not consistent from browser to browser.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-5874767857264670631?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5874767857264670631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5874767857264670631' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5874767857264670631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5874767857264670631'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/06/key-events-of-web-browser-keyevents.html' title='Key events of web browser KeyEvents'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-3489985907305021349</id><published>2011-06-21T06:00:00.000-05:00</published><updated>2011-06-21T08:02:02.212-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='New Releases'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Real Studio 2011 Release 2 has arrived!</title><content type='html'>Real Studio 2011 Release 2 is available for &lt;a href="http://realsoftware.com/download/"&gt;download&lt;/a&gt; today.&amp;nbsp; Here is a &lt;a href="http://www.realsoftware.com/movies/2011r2_sneak_peek.php"&gt;quick video&lt;/a&gt; demonstrating some of the key new features in this release.&lt;br /&gt;&lt;br /&gt;With new HTML5 features like WebSockets, GeoLocation and WebMoviePlayer, as well as &lt;a href="http://www.realsoftwareblog.com/2011/05/json-new-kid-on-block.html"&gt;JSON support&lt;/a&gt;, Real Studio 2011r2 gives you the essential tools to communicate with online services like Google, Flickr and Twitter.&amp;nbsp; The new release contains 42 new features and 184 improvements, you can read the full release notes &lt;a href="http://docs.realsoftware.com/index.php/What%27s_new_in_REAL_Studio_2011_R2%3F"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-3489985907305021349?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/3489985907305021349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=3489985907305021349' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3489985907305021349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3489985907305021349'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/06/real-studio-2011-release-2-has-arrived.html' title='Real Studio 2011 Release 2 has arrived!'/><author><name>Alyssa</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_1AO2sCoOwGo/TEiHnLAAK8I/AAAAAAAAAAM/mKuDxLSVQRc/S220/Photo+3.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5307054411341596062</id><published>2011-06-20T12:30:00.000-05:00</published><updated>2011-06-20T14:35:28.764-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><title type='text'>JSON: A New Kid on the Block</title><content type='html'>With Web Edition coming along and more and more feature requests coming in, one of the essentials to making external services work was to add JSON support (&lt;a href="http://www.json.org/"&gt;http://www.json.org&lt;/a&gt;). This nifty protocol written by &lt;a href="http://www.crockford.com/"&gt;Douglas Crockford&lt;/a&gt; is a way to represent objects as a string so they can be transmitted across the internet. As it turned out, interfacing with Google's Geocoding engine was the perfect opportunity to add JSON to the upcoming Real Studio 2011 Release 2.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Building on an open-source library from &lt;a href="http://www.charcoaldesign.co.uk/"&gt;Charcoal Design&lt;/a&gt;, we created a new class named &lt;b&gt;JSONItem&lt;/b&gt;. For those of you that don't already know, JSON objects can either contain named items (like a dictionary) or indexed items (like an array). To make these objects a little easier to create, we've added methods so you can manipulate them either way. Values can be Strings, Numbers, Booleans, Nil &lt;i&gt;or another JSONItem&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For instance:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;//Like a Dictionary&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Dim Person as new JSONItem&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Person.Value("Name") = "John Doe"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Person.Value("Married") = True&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Person.Value("Age") = 35&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Person.Value("Spouse") = "Jane Doe"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;//Like an array&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Dim Kids as new JSONItem&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Kids.Append "James"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Kids.Append "Julie"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Kids.Append "Joe"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Kids.Append "Jessica"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;//Add the Kids JSONItem to the parent JSONItem&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Person.Value("Kids") = Kids&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;//Create a JSON string from the defined object&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Dim JSONString as String = Person.ToString()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;JSONString = {"Name":"John Doe","Married":true,"Age":35,"Spouse":"Jane Doe","Kids":["James","Julie","Joe","Jessica"]}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In addition to creating JSON Strings, JSONItem can parse them. Once loaded, you can walk through the object as if you were traversing a folderitem tree. Using the example above:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Person = new JSONItem(JSONString) //From the example above&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Dim MyKids as JSONItem = Person.Child("Kids")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;For i As Integer = 0 to MyKids.Count-1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;   MsgBox MyKids.Value(i)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;Next i&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;Services that you can communicate with using JSON include Google, WordPress, Twitter, YouTube and Flickr.&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/4349911995767920194-5307054411341596062?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5307054411341596062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5307054411341596062' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5307054411341596062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5307054411341596062'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/05/json-new-kid-on-block.html' title='JSON: A New Kid on the Block'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-4224683673056614202</id><published>2011-06-16T07:49:00.001-05:00</published><updated>2011-06-16T09:50:03.142-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Avoid the "default" language</title><content type='html'>Avoid the "default" language, at least as far as the language a project is built in.&lt;br /&gt;&lt;div&gt;Why should you avoid "default"?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you compile a project "default" means "whatever language the current user is running in". On some OSes this is not a problem as you only have one available language. But on something like OS X where it's dead easy to switch between English, French, or any other installed language, it can be horribly confusing. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You might work in English and your partner might work in French, for example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now when you compile the "default" language for dynamic constants it's considered to be English, and when your partner compiles it's considered to be French. What this means is that depending on who builds the project, you or your French partner may be surprised by the results.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ideally, if a user has their preferences set to list German, French or English, then that user would see the application in French. And if someone else has them set to German, English, French they'd see it in English.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So far so good.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But now when you edit the "default" value for a constant what language do you write them in?&lt;/div&gt;&lt;div&gt;If you write in English and your partner writes in French, you'll have problems. Our first German example above will see some default values in French and some in English and so will the second. Why?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It works this way because "default" is ambiguous  for each developer. For the English developer it's English and for the French developer it's French. So which is it for the entire project? The answer is that "it depends".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When "default" is the selected language the created plist for the application requires an entry for the "development region" - what the OS should consider the "default language". And since the project is set to "default" the value used has to be derived from somewhere - and that is the language that the OS is currently using.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can avoid this in one of two ways.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;always explicitly set the language that a project is built in (see Build Settings &amp;gt; Language)&lt;/li&gt;&lt;li&gt;always put in values for each localization in the listing for each localized constant&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Ideally you should do both.&lt;/div&gt;&lt;div&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/4349911995767920194-4224683673056614202?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/4224683673056614202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=4224683673056614202' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4224683673056614202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4224683673056614202'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/06/avoid-default-language.html' title='Avoid the &quot;default&quot; language'/><author><name>Norman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-2965622664368981649</id><published>2011-06-09T12:47:00.002-05:00</published><updated>2011-06-09T13:04:43.728-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSX'/><category scheme='http://www.blogger.com/atom/ns#' term='iCloud'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>No more Mac?</title><content type='html'>Since 1984, the operating system for the Mac has always begun with the "Mac" prefix. First it was Mac OS and later, Mac OS X. Apple has been very consistent about that. They never called is "OS 9" or "OS X". Apple always used the "Mac" prefix. But if you look at Apple's &lt;a href="http://www.apple.com/macosx/"&gt;page&lt;/a&gt; for the next version of the Mac operating system, for the first time, that's no longer the case. Lion is called "OS X Lion" all over their website.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why? I think Apple is trying to transition to a single brand for their mobile and desktop operating systems. Certainly, many of the features in Lion were inspired by features in iOS. And it would make sense for Apple to want their users have a common user experience between their iPhone, iPad and iMac or MacBook. &lt;a href="http://events.apple.com.edgesuite.net/11piubpwiqubf06/event/"&gt;Steve Jobs said&lt;/a&gt; that the Mac and PC have been "demoted" by iCloud to being "just another device." Apple is not content for the desktop to be the digital hub because the desktop digital hub is not always available. The cloud is, so by keeping all of your devices in sync via iCloud, they make it easier for you to own more devices. At least, they make it easier to own more Apple devices. And that only makes sense because Apple is a hardware company.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So the rebranding of Mac OS X to simply OS X is Apple's first step towards a single name for their two operating systems. One day you will see all the devices they sell as being so similar in user experience that there will be few barriers to stop you from buying more of them. And that's the point, removing the barriers that prevent prospects from becoming customers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What do you think? Why would Apple remove the "Mac" prefix from Mac OS X?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On a related note, in this &lt;a href="http://www.cringely.com/2011/06/iclouds-real-purpose-is-to-kill-windows/"&gt;blog post&lt;/a&gt;, Bob Cringely stated that the iCloud's real purpose is to kill Windows. iCloud might indeed be the final missing ingredient that makes the iPad a realistic option for Windows users looking to replace their current PC. After all, when considering a new Windows PC versus an iPad, price is no longer an issue. However, I don't think Apple spends time thinking about killing Windows. I think Apple spends its time thinking about creating great products. Anything else that happens is nothing more than a byproduct of that thinking.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This all may make me sound like an Apple fanboy. I'm certainly a fan of theirs. However, I'm a fan because they have consistently made great products. There are plenty of companies for which I'm a fan for the same reason.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-2965622664368981649?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/2965622664368981649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=2965622664368981649' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2965622664368981649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2965622664368981649'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/06/no-more-mac.html' title='No more Mac?'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1661607005256348479</id><published>2011-06-06T11:53:00.005-05:00</published><updated>2011-06-06T14:52:01.816-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><title type='text'>Pushing Pixels</title><content type='html'>&lt;div&gt;At some point, many of us end up writing routines that will make changes to a picture. You might need to rotate the image, change the color scheme, etc. You can use the &lt;a href="http://docs.realsoftware.com/index.php/Graphics.Pixel"&gt;Graphics.Pixel&lt;/a&gt; property but &lt;a href="http://realsoftware.com/realstudio/?lang=en"&gt;Real Studio&lt;/a&gt; offers another, faster way: the &lt;a href="http://docs.realsoftware.com/index.php/RGBSurface"&gt;RGBSurface class&lt;/a&gt;. This class has a Pixel method that works just like Graphics.Pixel, but RGBSurface is significantly faster than using Graphics.Pixel! In my test, RGBSurface averaged &lt;b&gt;14 times faster&lt;/b&gt; on the Mac and about &lt;b&gt;70 times faster&lt;/b&gt; on Windows. That means of course that Graphics.Pixel is pretty slow on Windows since RGBSurface on the Mac and on Windows are roughly the same.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can change pixels using the RGBSurface class using almost identical code to what you'd write when using Graphics.Pixel. For example, my test code simply copies an entire picture pixel by pixel.&lt;br /&gt;&lt;br /&gt;Here's the code using Graphics.Pixel:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dim copy as new Picture(beach.width, beach.height, 32)&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim beachGraphics as Graphics = beach.Graphics&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim copyGraphics as Graphics = copy.Graphics&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim lastX as Integer = g.Width - 1&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim lastY as Integer = g.Height - 1&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; for x as Integer = 0 to lastX&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   for y = 0 to lastY&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     copyGraphics.Pixel(x, y) = beachGraphics.pixel(x, y)&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   next&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; next&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And here's the same code using the RGBSurface class:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim copy as new Picture(beach.width, beach.height, 32)&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim sr as RGBSurface = beach.RGBSurface&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim cr as RGBSurface = copy.RGBSurface&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim lastX as Integer = beach.Width - 1&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim lastY as Integer = beach.Height - 1&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; for x as Integer = 0 to lastX&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   for y as Integer = 0 to lastY&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;     cr.Pixel(x, y) = sr.pixel(x, y)&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   next&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; next&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only big difference is that you just need to get an RGBSurface object for the source and the destination and then copy pixels between them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So when you need to do pixel-level changes, make sure you are using RGBSurface!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;EDIT: Charles Yeomans found an optimization for both examples. It didn't speed up the first example but it made a big difference for the RGBSurface example making it even faster.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-1661607005256348479?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1661607005256348479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1661607005256348479' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1661607005256348479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1661607005256348479'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/06/pushing-pixels.html' title='Pushing Pixels'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-4170016449889979925</id><published>2011-06-01T17:22:00.001-05:00</published><updated>2011-06-01T21:26:48.186-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='LLVM'/><title type='text'>Hello World: An update on LLVM</title><content type='html'>When learning programming, the most common first program one writes is "Hello World" which basically just displays that message. It's a small but significant milestone to be able to produce this simple message. When we were working on adding support for Windows to Real Studio, it was exciting to see "Hello World" on Windows 98! We experienced the same excitement during the development of support for Mac OS X, Linux and the web.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We reached a similar milestone today with our work to replace the backend of our compiler with &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt;. First, a quick summary of how our compiler works and how LLVM will be an important part of the future of our compiler:&lt;/div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5613366697605598418" src="http://4.bp.blogspot.com/-8_i9KrC1-4M/TeavRUTKDNI/AAAAAAAAADU/EMAb8H-rLDY/s400/Compiler%2BDiagram.png" style="cursor: hand; cursor: pointer; float: left; height: 370px; margin: 0 10px 10px 0; width: 400px;" /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When your choose Run or Build in &lt;a href="http://realsoftware.com/"&gt;Real Studio&lt;/a&gt;, all of the code you wrote is passed to the Real Studio compiler which is represented by the items in grey in this diagram. The &lt;i&gt;front end&lt;/i&gt; is the part of the compiler that understands the Realbasic syntax. It converts your code to a sort of meta-assembly language. That meta-code is then passed to the compiler backend which turns it into x86 assembler which your computer can understand. All this compiled code is then passed to the linker which puts it all together and produces the actual application you can distribute. Of course all of this is hidden behind the scenes but it's helpful (or at least mildly interesting) to understand how it works.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have written two different backends for the compiler: one that produces x86 assembler and the other that produces PowerPC assembler. The latter is no longer supported since Apple has stopped making Macs using PowerPC processors.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;LLVM is an open-source compiler backend that has a lot of advantages over the ones we have written:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;It's an optimizing compiler which means it can make your code run faster.&lt;/li&gt;&lt;li&gt;It does dead-code stripping which means it can leave out the parts of the Realbasic framework that your project isn't using resulting in a smaller application.&lt;/li&gt;&lt;li&gt;It may enable us to return to a single-file executable on Windows.&lt;/li&gt;&lt;li&gt;It supports the ARM processor used in mobile devices such as iPhone/iPad.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Last year we took the first step of &lt;a href="http://www.realsoftwareblog.com/2010/03/compiler-better-stronger-faster.html"&gt;making RBScript compile with LLVM&lt;/a&gt;. The next step is to replace it for building entire applications. We have spent a bit of time on this next step recently. Today we were able to compile and run a "Hello World" console app and a desktop app as well. This is a significant milestone but it's only the first of many.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is still a lot of work to do before you will be building your projects with LLVM but reaching this important "Hello World" milestone is an important one.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;EDIT:  For the sake of clarity, it's possible that some issue might prevent us from achieving single-file executables for Windows. So I have changed "will" to "may" in item #3 above. Also, I have removed mention of Android from item #4 because LLVM doesn't help (or hinder) us when it comes to supporting Android. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-4170016449889979925?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/4170016449889979925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=4170016449889979925' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4170016449889979925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4170016449889979925'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/06/hello-world-update-on-llvm.html' title='Hello World: An update on LLVM'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-8_i9KrC1-4M/TeavRUTKDNI/AAAAAAAAADU/EMAb8H-rLDY/s72-c/Compiler%2BDiagram.png' height='72' width='72'/><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-3084366470891666983</id><published>2011-05-20T09:27:00.004-05:00</published><updated>2011-05-24T13:38:48.592-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><title type='text'>Digital Evolution</title><content type='html'>65 million years ago, environmental conditions on Earth changed radically when an asteroid collision made it impossible for the dinosaurs to survive. They couldn't adapt and natural evolution is too slow a process to even have given them a chance. In contrast, transitions in technology can change the landscape just as dramatically as an asteroid though they usually give us more time in which to adapt and evolve.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the mid 1980's I bought a compact disc player along with about 10 discs. I never bought another vinyl record again. Movies went digital about a decade later and after buying a DVD player, I never bought another VHS movie. Last year I bought a Blu-Ray player and I only buy Blu-Ray DVDs now. And of course I already know that eventually I won't even be buying physical media at all. I certainly don't buy music on CD anymore. Print however, has been much slower to go digital but it appears that it's finally reached a tipping point.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yesterday, Amazon &lt;a href="http://www.cnn.com/2011/TECH/gaming.gadgets/05/19/kindle.outsells.books/index.html?iref=allsearch"&gt;announced&lt;/a&gt; that they are now selling more ebooks than printed books. Amazon is a very smart company. They knew this transition was going to happen and if they weren't prepared for it, they would be left behind. They went a step further and even decided to help make it happen by creating the Kindle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Barnes &amp;amp; Noble is trying to make this same transition and offer their own ebook reader, the Nook. However, I think it really only appeals to the hardcore Barnes &amp;amp; Noble fans and they are almost certainly more interested in printed books since Barnes &amp;amp; Noble has such a big retail presence. Of course Barnes &amp;amp; Noble is also going through a transition as they have recently received an &lt;a href="http://www.bizjournals.com/mobile/dayton/news/2011/05/19/liberty-media-bids-1b-barnes-noble.html?ana=yfcpc"&gt;offer&lt;/a&gt; to by acquired for a $1 billion. For a chain that has over 1300 stores, that doesn't seem like a lot of money. Barnes &amp;amp; Noble has about $4 billion in assets and $3 billion in liabilities. Subtract one from the other and you get $1 billion, so they are being bought for their book value. That looks like a fire sale to me and could mean the beginning of the end for Barnes &amp;amp; Noble. It feels to me that their effort to transition to ebooks (if they even looked at it as a transition rather than just some additional way to sell books) was half-hearted at best. Don't get me wrong. I like Barnes &amp;amp; Noble and if they go away I will miss browsing the bookshelves. But books and magazines are transitioning to digital and it's looking more and more like digital is the asteroid that will take out Barnes &amp;amp; Noble. An &lt;a href="http://www.huffingtonpost.com/2011/04/13/barnes-noble_n_848661.html"&gt;article&lt;/a&gt; on the Huffington Post from April suggests that Barnes and Noble should go all digital and close their stores.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Borders was too late and &lt;a href="http://www.huffingtonpost.com/2011/02/16/borders-files-for-bankruptcy_n_823889.html"&gt;filed for bankruptcy&lt;/a&gt; last February.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Blockbuster Video should have seen the transition coming for video and bought Netflix when they had the chance years ago. By the time they realized their mistake and tried to create their own online copy of Netflix, it was too late. That mistake has cost them everything.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These types of transitions happen in every business but they happen most and quickest in the information business and that's what music, video, books and magazines are: information. Here at &lt;a href="http://www.realsoftware.com/"&gt;Real Software&lt;/a&gt; we are constantly looking at what we need to do to transition as well. We have recently added the ability to build web applications and are making preparations to support mobile platform as well. You have to be constantly on the lookout for how things are changing so you can adapt and evolve.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What changes are going on in your environment? How are you evolving and adapting? Share your thoughts.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-3084366470891666983?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/3084366470891666983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=3084366470891666983' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3084366470891666983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/3084366470891666983'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/05/digital-evolution.html' title='Digital Evolution'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-828392541299214764</id><published>2011-05-18T11:10:00.006-05:00</published><updated>2011-05-18T12:04:28.349-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><title type='text'>Another way to enter a property declaration</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;You probably add new properties to a class, module, window or webpage by typing the name, pressing the tab key, typing the property type, etc. But did you know that you can do all of that in the name field? Just type the entire declaration ("Status as Boolean" for example) into the field where you type the property name and the IDE will parse out the declaration and put everything in the right fields for you.&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So you can type:&lt;/div&gt;&lt;div&gt;&lt;img style="text-align: left;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 400px; height: 48px; " src="http://2.bp.blogspot.com/-HCStIbOTSpk/TdP766tBKgI/AAAAAAAAADE/Gc-ai1xiU0s/s400/Before.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5608102950615460354" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And then get this after you press tab:&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 47px;" src="http://3.bp.blogspot.com/-gqHVc1HG-ZI/TdP8DABJ1xI/AAAAAAAAADM/WmgSYmRqnIs/s400/After.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5608103089481045778" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-828392541299214764?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/828392541299214764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=828392541299214764' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/828392541299214764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/828392541299214764'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/05/another-way-to-enter-property.html' title='Another way to enter a property declaration'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-HCStIbOTSpk/TdP766tBKgI/AAAAAAAAADE/Gc-ai1xiU0s/s72-c/Before.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-8975185133692664360</id><published>2011-05-16T15:53:00.000-05:00</published><updated>2011-05-16T15:53:09.135-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Inline IFs</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Have you ever wanted to be able to conditionally add something to the middle of a statement without lots of if-then or select statements? Here's a trick that I've used in many of my own projects.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;In a module, define a method (IIF = Inline IF):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Name: IIF&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Parameters: Condition as Boolean, TrueValue as Variant, FalseValue as Variant&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Returns: Variant&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;If Condition Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Return TrueValue&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Else&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Return FalseValue&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Here's a quick example of how you might use this in your code. Imagine you wanted to display a different confirmation message based on how many records the program was about to delete:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Dim msg as String = "Are you sure you want to delete " + IIF(n=1,"this record","these records") + &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt; "?"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;If MsgBox(msg,4) = 6 Then&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;//…Delete Record(s) here…&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;End If&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;If n=1, the message displayed will be:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;"Are you sure you want to delete this record?"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Otherwise, it will read:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;"Are you sure you want to delete these records?"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-8975185133692664360?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/8975185133692664360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=8975185133692664360' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8975185133692664360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8975185133692664360'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/05/inline-ifs.html' title='Inline IFs'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1142124258368275713</id><published>2011-05-13T16:33:00.001-05:00</published><updated>2011-05-16T09:48:32.291-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Skype'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Cross-Platform'/><title type='text'>So why did Microsoft buy Skype?</title><content type='html'>Since we create cross-platform development tools and our customers build cross-platform software, I tend to closely follow other cross-platform software products. Here at &lt;a href="http://www.realsoftware.com/"&gt;Real Software&lt;/a&gt;, we use Skype daily so when it was announced that Microsoft is buying Skype, my interest was piqued.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think &lt;a href="http://www.cringely.com/2011/05/why-microsoft-bought-skype/"&gt;Bob Cringely&lt;/a&gt; got it right. Microsoft needs to transform itself and buying Skype is one of many ways it can do this. It's not clear if there is a specific strategy at Microsoft however. In this particular case, the strategy may very well be to simply keep Google from buying Skype. There's never only one prospective buyer and the reason Microsoft paid such a high price is no doubt related to Google's interest in Skype. The fact that the &lt;a href="http://www.reuters.com/article/2011/05/12/us-microsoft-antitrust-idUSTRE74B4R520110512"&gt;Microsoft antitrust decree ended&lt;/a&gt; on Wednesday with little fanfare is more evidence that Microsoft just isn't what it used to be.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But since we use Skype daily, my biggest concern is what will become of Skype. Microsoft has not had great successes with purchasing a product and then improving upon it. If you're were a FoxPro user, you know what I'm talking about.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-1142124258368275713?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1142124258368275713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1142124258368275713' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1142124258368275713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1142124258368275713'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/05/so-why-did-microsoft-buy-skype.html' title='So why did Microsoft buy Skype?'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-8026836724893606313</id><published>2011-05-11T17:03:00.000-05:00</published><updated>2011-05-13T10:23:17.883-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Are web apps the key to cross-device access?</title><content type='html'>This is an interesting &lt;a href="http://www.pcmag.com/article2/0,2817,2385035,00.asp?kc=PCRSS03079TX1K0000585%3E"&gt;article&lt;/a&gt; by Tim Bajarin on the idea of apps running on multiple devices. If you need an app to run on multiple devices, a web app is a really good solution in many cases.  There are certainly times when a native app is a better solution but for a lot of apps, especially business applications, a web-based application saves development time and money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-8026836724893606313?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/8026836724893606313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=8026836724893606313' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8026836724893606313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8026836724893606313'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/05/are-web-apps-key-to-cross-device-access.html' title='Are web apps the key to cross-device access?'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-8896308899132342482</id><published>2011-05-02T11:58:00.000-05:00</published><updated>2011-05-02T11:58:43.459-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Shell Differences on Windows</title><content type='html'>I ran across a bug report a while back which claimed that the Shell class on Windows was broken.  Thankfully, the reporter was nice enough to enter what client app he was running which made him think the Shell class was broken on Windows.  The culprit in this case was Microsoft's ftp app.  The issue was that no output could be read from the app, even though it appeared that sending input to it worked just fine.  The short answer to this issue is Microsoft's ftp app uses Console Input/Output. The technical details are...&lt;br /&gt;&lt;br /&gt;On Windows there are two approaches to console I/O.  In Microsoft's terms, there's the high-level approach which enables simple character stream I/O, or the low-level approach which gives the app more flexibility and access to the console's input and screen buffers.  Microsoft's ftp app uses low-level console I/O which means it is directly poking the characters to the console instead of streaming it through the standard I/O mechanism.  There is no way for our Shell class to pick up the low-level console output that the ftp app is sending so what you get back is nothing, which is what this particular user was encountering.  Notice that Microsoft's telnet app also uses low-level console I/O.&lt;br /&gt;&lt;br /&gt;So what's the solution?  Well for those adventurous enough to explore this further you could spawn the ftp app in a hidden console window and read its input using the low-level console I/O functions as described here: &lt;a href="http://msdn.microsoft.com/en-us/library/ms684965%28VS.85%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms684965(VS.85).aspx&lt;/a&gt;&lt;br /&gt;However, for most people I'd suggest finding some good REALbasic ftp classes or adjust the way you're using the ftp client (maybe you don't need it to be interactive.  Microsoft's ftp app can be scripted quite easily).  You could also try to find a different ftp app that doesn't use low-level console I/O.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-8896308899132342482?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/8896308899132342482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=8896308899132342482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8896308899132342482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8896308899132342482'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/05/shell-differences-on-windows.html' title='Shell Differences on Windows'/><author><name>William@REAL</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-305041107676892076</id><published>2011-04-29T10:40:00.000-05:00</published><updated>2011-04-29T10:40:06.638-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='WebPageSource'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>CSS in a Web Application</title><content type='html'>&lt;span style="font-size: small;"&gt;With Real Studio Web Edition you can use the WebPageSource class to insert CSS, HTML or JavaScript into a Web Application in a couple of easy steps. For example, to use CSS to add a red square to the lower right corner of your web page add a WebPageSource class to the window. Next, set the Location property to 3- After Content. Then, enter this code for the Source property:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;style type="text/css"&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#redrect {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;position: absolute;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;width: 100px;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;height: 100px;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;right: 20px;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bottom: 20px;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;background-color: #FF0000;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;div id="redrect"&amp;gt;&amp;amp;nbsp;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now Run the project and you should see a red square in the lower right corner or your page. Quick and easy customization of your web application is just one of the powerful features of Web Edition.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-305041107676892076?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/305041107676892076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=305041107676892076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/305041107676892076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/305041107676892076'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/04/css-in-web-application.html' title='CSS in a Web Application'/><author><name>Jason@REAL</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-8366613065362011041</id><published>2011-04-25T08:21:00.000-05:00</published><updated>2011-04-26T10:21:56.369-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Optional Parameters</title><content type='html'>Did you know that the parameters you create for methods can be optional? There are two easy ways to do this and they can even be combined. The simplest way to make a parameter optional is to add the &lt;i&gt;Optional&lt;/i&gt; keyword:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MyMethod(x as integer, &lt;b&gt;Optional&lt;/b&gt; y as integer)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the above example, the keyword &lt;i&gt;Optional&lt;/i&gt; makes the "y" parameter optional. If only one parameter is passed, y will have the default value for an integer which is zero. You can also include the default value if you want it to be different that the default value for the data type you are using:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MyMethod(x as integer, Optional y as integer &lt;b&gt;= 5&lt;/b&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you provide a default value, the &lt;i&gt;Optional&lt;/i&gt; keyword is, well, optional. But it's good to use it because it makes your code a bit more explicit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can even have the same parameter use two different data types by making two methods with the same name but with different parameters. For example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Foo(x as integer)&lt;/div&gt;&lt;div&gt;Foo(x as boolean)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Both methods can have their own code or you could have one call the other. So as you can see, there's a lot you can do with parameters.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-8366613065362011041?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/8366613065362011041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=8366613065362011041' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8366613065362011041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8366613065362011041'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/optional-parameters.html' title='Optional Parameters'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-52503583972156716</id><published>2011-04-20T11:12:00.000-05:00</published><updated>2011-04-20T11:12:13.210-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='New Releases'/><title type='text'>Real Studio Release 1.1 now available</title><content type='html'>Real Studio Release 1.1 is now available. This release includes 10 improvements, you can read the full release notes in the product download. Download Real Studio 2011r1.1 at our downloads page &lt;a href="http://realsoftware.com/download/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-52503583972156716?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/52503583972156716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=52503583972156716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/52503583972156716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/52503583972156716'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/04/real-studio-release-11-now-available.html' title='Real Studio Release 1.1 now available'/><author><name>Alyssa</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_1AO2sCoOwGo/TEiHnLAAK8I/AAAAAAAAAAM/mKuDxLSVQRc/S220/Photo+3.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-910876804405950364</id><published>2011-04-17T12:00:00.000-05:00</published><updated>2011-04-17T12:00:41.229-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Why does it take a crisis?</title><content type='html'>The organization that hands out IP addresses to ISPs in Asia just ran out of IPv4 addresses. You can read more about it &lt;a href="http://www.zdnet.com/blog/networking/it-8217s-official-asia-8217s-just-run-out-of-ipv4-addresses/948?tag=mantle_skin;content" target="_self"&gt;here&lt;/a&gt;. That means that soon, perhaps very soon, some Internet users in Asia are going to start having problems getting on the Internet. That's because the current scheme (IPv4) wasn't designed for as many IP addresses as it turns out we need. Why not? For the same reason that back in the 1940's the CEO of IBM said the total world market for computers was six. Sometimes even people with vision lack vision. &lt;br /&gt;&lt;br /&gt;Thankfully, the answer to the IP address shortage doesn't involve waiting in long lines. In fact, the answer was developed years ago: IPv6. It uses much longer IP addresses along with some hexidecimal to provide more IP addresses than we will ever need. No, really. I think it's totally safe to say that this time. In fact, the number of IP addresses available under IPv6 is so big, I had actually never heard of the number before. It sounds like one of those numbers my kids make up when they want something to sound really big. "Dad, there are like a bazillion frogs in the backyard." I think that long before we run out of IPv6 addresses, we will have replaced the Internet with whatever it will be replaced with. Will you take the red pill or the blue pill?&lt;br /&gt;&lt;br /&gt;Unfortunately, switching to IPv6 isn't as simple as typing in a new IP address. Behind your Internet connection is a lot of hardware that needs to be replaced in order to support IPv6. This is great news for companies like Cisco (who make such equipment) in the same way that the meltdown of nuclear reactors in Japan is great news for Toshiba who makes very safe 4S reactors that will no doubt now see speedy approval.  As other continents start running out of IP addresses as Asia has, ISPs and the upstream backbone providers will finally switch to IPv6 and once again all will be right in the world.&lt;br /&gt;&lt;br /&gt;If you are reading this, you are likely a Real Studio user. If that's the case, you will be happy to know that supporting IPv6 is relatively easy for us and you will, for the most part, be abstracted from it. Abstracting you from the gory details is, after all, our job. &lt;br /&gt;&lt;br /&gt;But why does it always take a crisis for us ("us" being society in this case) to act? These problems are not like the asteroid in the movie, Armageddon, where we get just a few months notice that we are all going to die unless Bruce Willis can save us. These problems are ones we have years and years of warning about and have known solutions that don't involve sending oil workers into space. &lt;br /&gt;&lt;br /&gt;I hope that the appropriate organizations that provide Internet access to the rest of the world will learn from Asia's cautionary tale.&lt;br /&gt;&lt;br /&gt;As an unrelated note, for the very first time, I wrote this entire blog post on my iPad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-910876804405950364?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/910876804405950364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=910876804405950364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/910876804405950364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/910876804405950364'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/04/why-does-it-take-crisis.html' title='Why does it take a crisis?'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-335399652947156804</id><published>2011-04-15T16:30:00.006-05:00</published><updated>2011-04-26T10:54:36.886-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Building demo apps using in-memory databases</title><content type='html'>&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;A lot of web applications access a database as a primary function. If the user can make changes to that database, it can  complicate your ability to provide a demonstration mode for your web app. You probably want the demo user to be able to make changes but since they are not official users yet, you don't want them altering real data. You could duplicate records and give them a demo status of some kind or have a separate demo database, but you still end up having to track the user to undo changes that they made. Fortunately, there's an easier way. &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;As you probably know, RealSQLDatabase is based on SQLite. SQLite has the ability to create a database, on disk of course, but it also has the ability to create a database that is in-memory only. An in-memory database can be modified but it can't be saved to disk.  Using an in-memory database is a great way to allow a demo user to try all the features of your app without giving them the ability to make permanent changes.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;To create an in-memory database you simply create a new database object without creating a database file or attaching an existing database file:&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Dim Orders as RealSQLDatabase&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Orders = New RealSQLDatabase&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;if Orders.Connect then&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;//continue&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;//Check Orders.Error&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;end if&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;Presto! You've got an in-memory database. You can create tables, add records, perform queries and basically do anything you can do with an on-disk database. If you want to pre-populate the database with tables and records, it's really quite easy to copy the tables and records from an existing RealSQLDatabase into the in-memory database. First, you attach the source database to your in-memory database using the Database.AttachDatabase method:&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Dim source as Folderitem = GetFolderItem("Orders.sdb")&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;If Orders.AttachDatabase(source,"Source") Then&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;Then, you use SQLExecute to create a table and use a SELECT statement to specify the table and records from the source database. For example, the following code copies a table called “Invoices” and all of its records from the source database into the in-memory database (which in his case is the Orders property):&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Orders.SQLExecute("CREATE TABLE Invoices As SELECT * FROM Source.Invoices")&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;Now you’ve got an in-memory database with a table and data copied from your source database! Pretty sweet huh? When using this with a web project, if you create the Orders property on the Session class, each user can have their own in-memory database that they can change as much as you allow without affecting other users. As soon as the user leaves the application and the session ends, the in-memory database will vanish. Of course, you can use this technique with desktop applications as well.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;In-memory databases, along with the ease with which you can copy tables and records into them from another source database, make for a really powerful and easy way to provide demo apps for the web and the desktop.&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/4349911995767920194-335399652947156804?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/335399652947156804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=335399652947156804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/335399652947156804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/335399652947156804'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/04/buiding-demo-apps-using-in-memory.html' title='Building demo apps using in-memory databases'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-2935670750107235902</id><published>2011-04-08T12:10:00.001-05:00</published><updated>2011-04-08T14:38:40.933-05:00</updated><title type='text'>Feedback Tips</title><content type='html'>Back in &lt;a href="http://www.realsoftwareblog.com/2009/09/our-new-feedback-system.html"&gt;September of 2009 we introduced Feedback&lt;/a&gt;, our tool for reporting bugs and requesting features that is built in Real Studio. Since then we have updated and improved Feedback significantly, tailoring it to our users' and our engineers' needs. Though there are many features we look forward to adding in the future, there are probably a few really handy ones you may not know are already there.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Search by Creator: &lt;/b&gt;You can search for reports by the creator's email address using syntax like "email:test@123.com" where "test@123.com" is the creator's email address.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Search Using old Fogbugz ID's&lt;/b&gt;: Use "fb:xxxx" where xxxx is the original Fogbugz ID number.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Removing yourself from emails: &lt;/b&gt;To stop getting emails about a specific bug simply remove that report from your favorites list.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Read-Only Mode:&lt;/b&gt; Read-only mode allows users with expired license keys to search and check the status of exisiting reports. To exit Read-Only mode, simply go to Preferences, click on the Applications tab, then click the "Change" button in the Editions group.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating New Bug Reports: &lt;/b&gt;And last but certainly not least...can't create a new bug report?&lt;b&gt; &lt;/b&gt;Just a reminder that before you can enter a new bug report you must first do a search to see if the report has been entered already. Feedback will not let you enter a new report until you have first searched. This feature was designed to save both you and our engineers time.&lt;br /&gt;&lt;br /&gt;Hopefully this helps you to use Feedback to its fullest. If you have a tip on improving Feedback please enter a feature request. And don't forget about the Feedback Help on the start page or the &lt;a href="http://docs.realsoftware.com/index.php/Feedback_Hints_%26_Tips"&gt;Documentation Wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-2935670750107235902?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/2935670750107235902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=2935670750107235902' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2935670750107235902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/2935670750107235902'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/04/feedback-tips.html' title='Feedback Tips'/><author><name>Alyssa</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_1AO2sCoOwGo/TEiHnLAAK8I/AAAAAAAAAAM/mKuDxLSVQRc/S220/Photo+3.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-8950547097690195984</id><published>2011-04-02T15:53:00.004-05:00</published><updated>2011-04-04T08:19:05.407-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Web Site or Web Application?</title><content type='html'>When we announced Real Studio was going to support building web applications, many of you started asking if Real Studio could be also used to build web sites. Our initial response was no; Our web framework was designed for building web applications, not web sites. But as the discussions on our forums and email lists continued, it became obvious that the answer is not that clear...and you were going to use it to build whatever you wanted anyway!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Web sites are generally, mostly static content without a whole lot of user interaction whereas web applications are usually designed to create content dynamically and are highly interactive. But there is a ever changing gray area in between. So is our new web framework meant for building web sites?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If your web site (or a part of your web site) is very dynamic then it might actually behave more like an application than a web site. If that's the case, then Real Studio might be appropriate. If, on the other hand, your web site is very static, then Real Studio is almost certainly &lt;b&gt;not&lt;/b&gt; appropriate.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Is Real Studio designed for building web sites? No, it's not. But your web site might function more like a web application than a website, in which case perhaps Real Studio's web application support &lt;i&gt;is&lt;/i&gt; a good solution for you.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-8950547097690195984?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/8950547097690195984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=8950547097690195984' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8950547097690195984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8950547097690195984'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/04/web-site-or-web-application.html' title='Web Site or Web Application?'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6677704812487265186</id><published>2011-03-30T10:39:00.000-05:00</published><updated>2011-03-30T10:39:35.792-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Memory Management in REALbasic</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Many times we see the question asked "when does REALbasic's garbage collector run" or something to this effect.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;REAlbasic does NOT use a garbage collector like Java's VM does.&lt;a href="http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29"&gt;(see Garbage collection on wikipedia)&lt;/a&gt; It uses reference counting (also mentioned on this same wikipedia page) and when the reference count drops to 0 the object is destroyed immediately. Not some time later but right then and there.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Note that this has certain implications. If you have circular references where one object has a reference to another and that object has a reference back to the first then the reference counts may never drop to zero. And, if for some reason you lose your original references to these objects then you can "leak" - or have objects that will never be destroyed but that you can no longer access or reference (well not easily at least).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;There are some &lt;a href="http://www.declaresub.com/article/7/iDeclare"&gt;excellent resources&lt;/a&gt; that cover this in plain language and that give you some excellent tips on how to avoid common pitfalls.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;The recent Atlanta conference had a session on Advanced Language features and Charles Yeomans covered this fairly well in his talk. I'd suggest that you find the video from this session when they are available on the ARBP site. &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/4349911995767920194-6677704812487265186?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6677704812487265186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6677704812487265186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6677704812487265186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6677704812487265186'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/memory-management-in-realbasic.html' title='Memory Management in REALbasic'/><author><name>Norman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-8964229953238242107</id><published>2011-03-29T09:09:00.000-05:00</published><updated>2011-03-29T09:09:26.196-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><category scheme='http://www.blogger.com/atom/ns#' term='WebPopupMenu'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Web Edition Updates</title><content type='html'>Today we're introducing a new update mechanism for Web Edition that allows us to provide patches to the Web Framework without having to release a whole new version of the IDE.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It works like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Download a PageSource object from the Extras section of the Downloads page.&lt;/div&gt;&lt;div&gt;2. Drag it into the project that needs the bug fix.&lt;/div&gt;&lt;div&gt;3. Add it to any pages that need the bug fix.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If we release another Web Edition Update, you can just delete the old class from your project and add the new one. All of the subclasses on each page will automatically be updated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When the next major version of the Real Studio IDE is released, all of this code will be included in the Web Edition framework and the patches are automatically disabled.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today's update includes two bug fixes:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. GotFocus and LostFocus events have been fixed for Firefox&lt;/div&gt;&lt;div&gt;2. Touch events have been greatly improved for iOS devices&lt;/div&gt;&lt;div&gt;3. Fixed a bug in WebPopupMenu where changing the menu using the List(index) method caused a Javascript error.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The file is available in the Extras section of our &lt;a href="http://www.realsoftware.com/downloads"&gt;Downloads&lt;/a&gt; page or you can download it directly by clicking &lt;a href="http://realsoftware.cachefly.net/REALStudio2011r1/WEUpdate201103.zip"&gt;here&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/4349911995767920194-8964229953238242107?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8964229953238242107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8964229953238242107'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/web-edition-updates.html' title='Web Edition Updates'/><author><name>Greg O'Lone</name><uri>http://www.blogger.com/profile/13210963633619055608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-4096843169743956103</id><published>2011-03-25T16:11:00.006-05:00</published><updated>2011-03-25T17:29:17.015-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL World'/><category scheme='http://www.blogger.com/atom/ns#' term='Conference'/><title type='text'>The Real Studio Atlanta Summit</title><content type='html'>This past weekend was the Real Studio Atlanta Summit hosted by the Association of Realbasic Professionals. Four of us from Real Software, Thom, Greg, Norman and myself attended, and Thom and I presented sessions. The conference lasted two days with lots of sessions aimed at various levels of Real Studio proficiency.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Getting so many Real Studio users together in one place is always a great thing. Those of us at Real Software who attended really enjoyed talking to long-time users and meeting new ones as well. The speakers all did a great job. The wide range of experiences both speakers and attendees had was amazing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm sure there will be Real Studio conferences in the future and I highly recommend attending. You will learn from the sessions and the hallway conversation with other users, as well as gain valuable networking opportunities. It's a lot of fun too!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-4096843169743956103?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/4096843169743956103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=4096843169743956103' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4096843169743956103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/4096843169743956103'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/real-studio-atlanta-summit.html' title='The Real Studio Atlanta Summit'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1515685901398680214</id><published>2011-03-24T09:20:00.000-05:00</published><updated>2011-03-24T09:20:31.253-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic applications'/><title type='text'>Attack of the Clones</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;For a long time now (perhaps since the very beginning) the Realbasic &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;framework has allowed you to have a menu item appear in multiple &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;locations. For example, you might have a menu that appears in your &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;menubar but also appears in a contextual menu somewhere else in your&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt; project. In order for the Realbasic framework to allow this, the &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;entire menubar is rebuilt every time you open it or type a keyboard &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;shortcut.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;This has led to problems in the past. For example, plug-ins cannot &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;modify menus nor can declares. These limitations have been around for &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;quite some time and we have all grown accustomed to them, even if we &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;prefer they didn't exist. It also has a considerable runtime cost to&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt; continually rebuild the menubar during typing. In our transition to &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;Cocoa we would like to take the opportunity to move to a system where &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;the menubar is stable and does not have to be dynamically updated.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;While the end result is much nicer, there is a downside: backwards &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;compatibility. If you are using a menu item object in multiple &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;locations once we make this change your code will break. Specifically, &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;it will raise a MenuHasParentException.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;Fortunately, updating your code will be pretty straightforward. Rather &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;than having the menu item be in two or more places at once, you will &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;instead clone the menu item using the newly added Clone() method.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;To make this transition less painful, this behavior will be required &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;only for the Cocoa framework starting with Real Studio 2011 R2. All &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;desktop frameworks (Mac OS X Carbon, Windows and Linux) will support &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;it but the others will initially continue to support the old behavior &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;as well. Beginning with Real Studio 2011 R4 it will be required for &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;all desktop frameworks so that there is a single, standard technique &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;(cloning) for dealing with menu items that appears in multiple&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;locations.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;We don't make changes that will break code without a lot of thought. &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;But a little bit of pain now will save a lot of it down the road. It's &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;really better that we allow the OS to handle as much as possible so &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;that when OS changes occur, they have minimal impact on your projects.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt; And in this case, you will even gain some functionality because &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;plugins and declares will be able to modify menus.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;If you are not using menu items in multiple locations, this will have &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;no impact on you. If you are, I think you can see that the gain will &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: georgia;"&gt;be well worth the effort.&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/4349911995767920194-1515685901398680214?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1515685901398680214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1515685901398680214' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1515685901398680214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1515685901398680214'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/attack-of-clones.html' title='Attack of the Clones'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6011440585153791996</id><published>2011-03-23T15:44:00.000-05:00</published><updated>2011-03-23T15:44:31.092-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Server'/><title type='text'>Using links in your comments</title><content type='html'>Ever find that you had to read a set of online documentation or specifications in order to implement something and thought it would be really nice to put a reference to that material in your code just in case you or someone who maintained the code might need it later?&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One handy feature in the IDE is that if you put a full URL in a comment the IDE will actually recognize it as a URL and highlight it so it's clickable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And it works with several URL schemes&lt;/div&gt;&lt;div&gt;In a code editor, if you put in code like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;// this came from code at http://developer.apple.com/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;the URL for developer.apple.com highlights and appears as a clickable URL&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or you can use mailto if you've sent source code to others so they can easily mail you back&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;// mailto:blah@example.com&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And yes, you can add subject lines as follows:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;// mailto:blah@example.com?subject=Hey%20there&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you click on a mailto link, like above that is in your RB code, it starts your email client &amp;amp; addresses it to "blah@example.com" with a subject if you had one.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is really handy when you need to refer to documentation from Apple, GTK, MSDN, etc. so you or the person who comes along later can see where you got the reference material from.&lt;/div&gt;&lt;div&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/4349911995767920194-6011440585153791996?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6011440585153791996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6011440585153791996' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6011440585153791996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6011440585153791996'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/using-links-in-your-comments.html' title='Using links in your comments'/><author><name>Norman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5617930771413255215</id><published>2011-03-22T09:48:00.005-05:00</published><updated>2011-03-22T10:41:33.620-05:00</updated><title type='text'>Plugging IDE Memory Leaks</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; "&gt;During the development of Real Studio 2011r1, we spent some time analyzing the compiler's memory usage. What we noticed was that the compiler was leaking memory. A memory leak occurs when code uses memory but then does not release this memory when it’s finished with it. The result is that the amount of memory the application uses continues to increase until the user quits the application or the application uses up all available memory and crashes.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;font: normal normal normal 12px/normal Helvetica; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;During the development of 2011r1 we fixed every memory leak in the compiler. In fact, we went beyond that and fixed every leak we could find in the IDE. We fixed leaks in some framework classes as well such as:&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;Shell&lt;/span&gt;&lt;/li&gt;&lt;li style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;RealSQLDatabase&lt;/span&gt;&lt;/li&gt;&lt;li style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;TabPanel&lt;/span&gt;&lt;/li&gt;&lt;li style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;VirtualVolumes&lt;/span&gt;&lt;/li&gt;&lt;li style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;PopupMenus&lt;/span&gt;&lt;/li&gt;&lt;li style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;MemoryBlocks&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;font: normal normal normal 12px/normal Helvetica; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;As you may know, the Real Studio IDE is created with Real Studio and the Realbasic language. We create it in the same way you create your projects. The chart below compares running the Real Studio IDE project in 2010r5.1 (blue) versus 2011r1(green). All tests were performed by running the project in the debugger and then closing the project. Incremental compilation was disabled.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 294px;" src="http://4.bp.blogspot.com/-zo7xb24_UjM/TYjC--P6OBI/AAAAAAAAAAM/YXgiyBt8SxE/s400/image.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5586929724870506514" /&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;You can see that after five runs of the project, Real Studio 2010r5.1 leaked over 45 megabytes of memory. Compare that to Real Studio 2011r1 (green) where after five runs, not a single extra byte of memory was leaked.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;This is a huge improvement in the performance of the IDE. Before 2011r1, if you were using the IDE for long periods of time, you probably found that it would slow down to the point where you had to restart it. By doing this you were releasing the memory that had not been released by the IDE. This is no longer an issue in 2011r1 which means you can now run the IDE for very long periods of time without having to restart due to memory leaks.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;While we believe we have found every leak in the IDE, it is possible there are others and there are certainly leaks that remain in some framework classes. Should you believe you have found a memory leak, create a simple sample project and include it with a new case in our Feedback system.&lt;/span&gt;&lt;/div&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/4349911995767920194-5617930771413255215?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5617930771413255215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5617930771413255215' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5617930771413255215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5617930771413255215'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/plugging-ide-memory-leaks.html' title='Plugging IDE Memory Leaks'/><author><name>Joe Ranieri</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-zo7xb24_UjM/TYjC--P6OBI/AAAAAAAAAAM/YXgiyBt8SxE/s72-c/image.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1008527097289080800</id><published>2011-03-17T14:00:00.000-05:00</published><updated>2011-03-17T14:00:31.402-05:00</updated><title type='text'>5% of Next Week's Sales will be Donated to Japan’s Relief Efforts</title><content type='html'>Real Software will donate 5% of our total sales for the week of March 20-26 to the American Red Cross’ earthquake and tsunami relief fund for Japan. All products including new Real Studio licenses, renewals, upgrades and support plans will be applicable.&amp;nbsp; This is one small way we can help our friends in Japan after this devastating disaster.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-1008527097289080800?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1008527097289080800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1008527097289080800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1008527097289080800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1008527097289080800'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/5-of-next-weeks-sales-will-be-donated.html' title='5% of Next Week&apos;s Sales will be Donated to Japan’s Relief Efforts'/><author><name>Alyssa</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_1AO2sCoOwGo/TEiHnLAAK8I/AAAAAAAAAAM/mKuDxLSVQRc/S220/Photo+3.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-8971266104265856614</id><published>2011-03-16T09:38:00.004-05:00</published><updated>2011-03-16T11:18:10.154-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Tablets'/><category scheme='http://www.blogger.com/atom/ns#' term='LLVM'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><title type='text'>I want my iPadTV!</title><content type='html'>When my daughter was eight, she started asking if she could have a computer in her room. When she turned nine, I decided that an iPad would be a nice compromise and she loves it. She's about to turn 10 years old and lately has been asking if she can have a TV in her room. That's not going to happen.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yesterday, Time Warner Cable released a free application for the iPad that lets TWC customers watch 30 channels of TV on the iPad. It's a very nice app that works very well. I was happy to see that at least for the moment, the Disney Channel is &lt;b&gt;not&lt;/b&gt; among the available iPad channels. However, Food Network is and my daughter loves that. So it looks like she's going to get a TV in her room (and in fact, anywhere in the house she takes her iPad) after all. You might think that watching TV on a iPad-sized screen wouldn't be all that great. But considering that you quite literally watch TV at an arm's length on the iPad, the viewing size actually works very well. Rather than spend money on another TV, you can now just use your iPad.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was a very smart move on the part of Time Warner Cable. People are spending more and more time in front of their iPads (and computers) and less and less time watching TV. So what they have done is put themselves in front of those iPad users with an app. It will likely increase viewing and give their customers another reason to keep their cable and internet service with TWC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's great for Apple as well because at least some people will decide to spend their money on an iPad instead of buying yet another TV. Why buy a TV when you can have an iPad that does so much more for about the same price?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is yet another sign of how important the iPad (and tablets in general) will be to the future of computing. We are committed to supporting these and are working on the prerequisite steps needed to do so. The most important of those is completing our support for LLVM. We already have support for LLVM in RBScript. Next, we need to support it for stand-alone applications. Once this is done, we will have the ARM processor support we need to begin building an iOS framework and possibly support other mobile devices.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mobile devices are going to be critical to the future of computing and to the future of Real Studio.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-8971266104265856614?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/8971266104265856614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=8971266104265856614' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8971266104265856614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/8971266104265856614'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/i-want-my-ipadtv.html' title='I want my iPadTV!'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-6421529134867000458</id><published>2011-03-09T09:34:00.002-06:00</published><updated>2011-03-09T10:09:46.361-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Using Mac OS X tools to manipulate the Info.Plist</title><content type='html'>There are several tools and ways to edit the property list, or plist, that's part of every Mac OS X bundle.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You might need to do this as part of getting your application ready for the Mac Application Store or because your application requires a newer version of Mac OS X than the default required by most Real Studio applications. Real Studio will, by default, set the entry for LSMinimumSystemVersion to 10.4 for Carbon apps or 10.5 for Cocoa applications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have the Apple developer tools installed you can, as part of any build or run, use the Property List Editor in Developer &amp;gt; Applications &amp;gt; Utilities &amp;gt; Property List Editor to edit your plist. This is a nice GUI tool that Apple supplies that makes editing an applications plist very easy.&lt;/div&gt;&lt;div&gt;You can use this tool whether you are debugging or not by making use of Run Paused. &lt;/div&gt;&lt;div&gt;When you use Run Paused you can then locate the application, open the bundle and use the Apple Property List Editor to change/update whatever you need and then, when done, run the debug application and it will connect to the IDE that is waiting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have an edition that supports Build Automation, you could script the change as a post build step using Apple's included Mac OS X tool called PlistBuddy located in /usr/libexec/PlistBuddy. (see &lt;a href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html"&gt;http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As part of a post build step you could run a command like the following to set the minimum OS X version to 10.6.6. (This is only a sample to show you how it can be done.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; dim dbg as String&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  if debugBuild then dbg = ".debug"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dim appNameForShell as string &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  appNameForShell = PropertyValue("App.MacOSXAppName")+ dbg +".app" + "/Contents/Info.plist"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  // there are several other special characters that you might need to escape&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  appNameForShell = replaceall(appNameForShell, " ", "\ ")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  dim s as string&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  s = DoShellCommand("/usr/libexec/PlistBuddy -c ""Set :LSMinimumSystemVersion \""10.6.6\"" "" " + CurrentBuildLocation + "/" + appNameForShell )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  print s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This saves you having to do this change in the Property List Editor manually every time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Making it easier to adjust the plist is frequently requested but in the meantime you can use either of these mechanisms to update the property list generated by Real Studio.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-6421529134867000458?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/6421529134867000458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=6421529134867000458' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6421529134867000458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/6421529134867000458'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/using-os-x-tools-to-manipulate.html' title='Using Mac OS X tools to manipulate the Info.Plist'/><author><name>Norman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-7395888658036744711</id><published>2011-03-08T08:40:00.000-06:00</published><updated>2011-03-08T08:40:44.663-06:00</updated><title type='text'>Real Studio 2011 Release 1 is now available</title><content type='html'>Real Studio 2011 Release 1 is now shipping.&amp;nbsp; Adding 35 new features and 114 improvements, this release features easier deployment of web applications, improved HTMLViewer support and major advancements in Cocoa support.&lt;br /&gt;&lt;br /&gt;* Web application deployment with Real Studio is now just as easy as creating the app itself!&amp;nbsp; We are now offering a new CGI build option that outputs a Perl script.&amp;nbsp; This script is placed in the cgi-bin folder, allowing for easier web deployment and more hosting service options.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;* RealSQLDatabase now has a new MultiUser property that lets web applications allow multiple users to access a RealSQLDatabase file at the same time. This may eliminate the need for some web applications to require a database server.&lt;br /&gt;&lt;br /&gt;* A new, native Microsoft SQL Server plugin has been added. This plugin supports Windows only.&lt;br /&gt;&lt;br /&gt;* This release includes a huge number of improvements to Real Studio’s Cocoa framework.&lt;br /&gt;&lt;br /&gt;* Improved HTMLViewer support offers the options to get/set custom user agent strings and increase/decrease the font size.&lt;br /&gt;&lt;br /&gt;* The WebListBox now has a CellClick event (just like the desktop Listbox). It also now has Cell and Column Style properties allowing or greater control over the look and behavior of cells.&lt;br /&gt;The new DragPicture property lets you use an image for dragging. &lt;br /&gt;&lt;br /&gt;Real Studio 2011 Release 1 is now available for download at, our &lt;a href="http://www.realsoftware.com/download"&gt;Downloads page&lt;/a&gt;.&amp;nbsp; For full details about what’s in this release view the product &lt;a href="http://docs.realsoftware.com/"&gt;Release Notes&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-7395888658036744711?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/7395888658036744711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=7395888658036744711' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7395888658036744711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/7395888658036744711'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/real-studio-2011-release-1-is-now.html' title='Real Studio 2011 Release 1 is now available'/><author><name>Alyssa</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_1AO2sCoOwGo/TEiHnLAAK8I/AAAAAAAAAAM/mKuDxLSVQRc/S220/Photo+3.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-5617810937187823653</id><published>2011-03-08T07:54:00.004-06:00</published><updated>2011-03-08T09:28:25.395-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio Web Edition'/><title type='text'>Issue for Web Edition Projects Going From 2011 R1 back to 2010 R5</title><content type='html'>&lt;div style="text-align: center;"&gt;If you are creating web applications and are going back and forth between Real Studio 2010 R5 (or R5.1) and 2011 R1, there is the potential for project corruption but there is also a solution.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you save a project in 2011 R1 then reopen it in 2010 R5, the project will open but it will &lt;b&gt;not&lt;/b&gt; run. When you run the project, you will get a fatal error:&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 191px;" src="http://1.bp.blogspot.com/-yIWJkgMSCJU/TXY8_601QcI/AAAAAAAAAC4/xEpi98W0hY4/s400/Fatal%2BError.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5581715856992584130" /&gt;&lt;/div&gt;&lt;div&gt;Just as Real Studio warns when you opened the project, there is the potential for data loss. In this case, the likelihood is very high. In R1 there is now a TargetWeb constant which you can use to write code in classes and modules you share between your web and desktop projects. This constant can be used to include code in shared classes and modules that should &lt;b&gt;only&lt;/b&gt; be compiled into your web projects. Unfortunately in order to support this, the project format is no longer backwards compatible. Again, this is only for web projects. Desktop and console projects are not affected. Once you save a project in R1 it will no longer run in R5.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The good news is that there's a relatively easy way to fix your project should this happen. To fix your project:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Using R1, save your project in XML format by choosing Save As from the File menu and then choosing the XML Project option from the Format popup menu.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. Quit Real Studio and open the XML version of the project in a text editor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Search for &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;projecttype&gt;3&lt;/span&gt; and then change the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;3&lt;/span&gt; to a &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;1&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. Search for &lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;propertyval name="ImplicitInstance"&gt;True&lt;/propertyval&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;and delete this line.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&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="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;5. Search for &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;webport&gt;-1&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt; and change the &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;-1 &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;to &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;9000&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&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="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;6. Save your project. Now you can reopen it in 2010 R5 and it will run. You will still get the warning when you open it but this will go away once you save the project in R5.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&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="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;If you are using the Version Control Format for your project, do the following:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&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="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;1. Open your project in a text editor.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&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="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;2. Change &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Type=Web&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt; to &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Type=Console&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&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="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;3. Change &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;WebLivePort=-1&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt; to &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;WebLivePort=9000&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium; "&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="font-size: medium; "&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;4. Save your project. It will now open and run in 2010 R5.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Again this particular issue only affects web projects that were saved in R1 and need to be opened and run in R5.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We apologize for this inconvenience. We really try to keep the project format as compatible as possible when you move back and forth between versions but that's not always possible. However, we are going to add something in a future release of Real Studio so that you don't accidentally find yourself in situations like this one.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-5617810937187823653?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/5617810937187823653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=5617810937187823653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5617810937187823653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/5617810937187823653'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/issue-for-web-edition-projects-going.html' title='Issue for Web Edition Projects Going From 2011 R1 back to 2010 R5'/><author><name>Geoff Perlman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/_Gz2r2sBT2sQ/TEOYkLbZCxI/AAAAAAAAACI/v7TNlIdagA8/S220/n1376430297_7208.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-yIWJkgMSCJU/TXY8_601QcI/AAAAAAAAAC4/xEpi98W0hY4/s72-c/Fatal%2BError.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-1653181352710178244</id><published>2011-03-02T08:56:00.000-06:00</published><updated>2011-03-02T08:56:31.321-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Detecting Modifier Keys</title><content type='html'>&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;Sometimes it is necessary, or at least user-friendly, to adjust your interface when the user holds down modifier keys. For example, iTunes changes its "Create Playlist" button from a plus icon to a gear icon when the option key is held down. The goal is to inform the user that option-clicking the button will perform a different task.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-kyI0lJlO2ec/TW0uLiwGDII/AAAAAAAAABg/D4Z1Ed_8n70/s1600/itunes.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5579166289223879810" src="http://4.bp.blogspot.com/-kyI0lJlO2ec/TW0uLiwGDII/AAAAAAAAABg/D4Z1Ed_8n70/s320/itunes.png" style="cursor: pointer; display: block; height: 165px; margin: 0px auto 10px; text-align: center; width: 269px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At first glance you might think that simply looking for the option key in a KeyDown event will do the trick. The problem is KeyDown/KeyUp does not fire for modifier keys. The solution is to use a Timer, which I'll show you how to setup. In this tutorial we'll be creating a timer to detect the option/alt key, though this class could be adapted to read any of the modifiers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First of all, we need to decide whether to create a timer embedded on a Window, or to create a subclass. Either technique will work, but the subclass creates reusable code which I always recommend. Also, the subclass will allow us to trigger events which will come in handy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Start by creating a new class called "OptionTimer" whose super is "Timer". Next, add a property "Pressed As Boolean", an event "KeyDown", and a second event "KeyUp" to OptionTimer. In the Action event insert the following code:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;If Keyboard.AsyncAltKey = True And Pressed = False Then&lt;br /&gt;Pressed = True&lt;br /&gt;RaiseEvent KeyDown&lt;br /&gt;Else If KeyBoard.AsyncAltKey = False And Pressed = True Then&lt;br /&gt;Pressed = False&lt;br /&gt;RaiseEvent KeyUp&lt;br /&gt;End If&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;That's it, nothing more the class needs to do. So go to your Window and place a Timer on it. Set the super to "OptionTimer" and now you can insert code into the events for that timer. You'll also want to adjust the period of the timer to something small such as 250 to make sure the events are responsive.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To test it we could use a MsgBox in each event but MsgBoxes are blocking and require user interaction. Since this test is about user interaction, we should avoid the MsgBox. So instead, in the KeyDown event insert a single "Beep" command. And in the KeyUp event insert two "Beep" commands. When you run your project, you should hear a beep when you press the option key and two beeps when you release it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4349911995767920194-1653181352710178244?l=www.realsoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.realsoftwareblog.com/feeds/1653181352710178244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4349911995767920194&amp;postID=1653181352710178244' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1653181352710178244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4349911995767920194/posts/default/1653181352710178244'/><link rel='alternate' type='text/html' href='http://www.realsoftwareblog.com/2011/03/detecting-modifier-keys.html' title='Detecting Modifier Keys'/><author><name>Thom McGrath</name><uri>http://www.blogger.com/profile/05135025818950044797</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_-oZ3Nd9coj0/Sa2axP5y4tI/AAAAAAAAAAM/IiZERDhd3dE/S220/photo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-kyI0lJlO2ec/TW0uLiwGDII/AAAAAAAAABg/D4Z1Ed_8n70/s72-c/itunes.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4349911995767920194.post-736992667194996370</id><published>2011-02-25T10:28:00.001-06:00</published><updated>2011-02-25T10:29:57.831-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='REAL Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Plugins'/><title type='text'>How REAL Studio gives you more power with the use of plugins</title><content type='html'>&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;The REALbasic language excels when you need to go beyond the default options, allowing you access to System and third parties libraries and plugins.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 0px;"&gt;&lt;span style="font-size: small; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 0px;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Two years ago or so I wrote a utility to test Apple’s laptops battery autonomy under several processing loads and tasks. Additionally, I also needed the computer “awake” during the tests but didn’t want to change the Energy Preferences Panel settings.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The REALbasic language doesn’t include these kind of classes or properties by default; but we are developers, aren’t we? So I turned my head to the REAL Studio plugins API where I found how truly simple it is to wrap your own functions in C, C++ or Objective-C to access the underlying features of Mac OS X system.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Everything you need is under the Extras &amp;gt; Plugins SDK folder, inside the REAL Studio folder. And you can also find the documentation online at http://docs.realsoftware.com/index.php/REAL_Studio_Plugin_SDK&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If you have never written in C or C++ before, you’ll probably find the documentation and the approach to REAL Studio plugins development a bit tough. But if you know how to write programs using such languages, then the provided documentation is enough to get a basic plug-in ready to interact with your REALbasic code in a matter of hours.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YljBAxnNSy0/TWdPbi6TOjI/AAAAAAAAAAM/L6uopUWuneY/s1600/Main_menu.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5577513998168046130" src="http://3.bp.blogspot.com/-YljBAxnNSy0/TWdPbi6TOjI/AAAAAAAAAAM/L6uopUWuneY/s320/Main_menu.png" style="float: left; height: 202px; margin: 0pt 10px 10px 0pt; width: 320px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2SiYeP-TFCA/TWdQLSt7IZI/AAAAAAAAAAk/RhHkoghSkrg/s1600/Running_application.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5577514818454888850" src="http://2.bp.blogspot.com/-2SiYeP-TFCA/TWdQLSt7IZI/AAAAAAAAAAk/RhHkoghSkrg/s320/Running_application.png" style="display: block; height: 194px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Helvetica; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 0px; min-height: 14px;"&gt;&lt;span style="font-size: small; letter-spacing: 0px;"&gt;In fact that is what I did, finishing the whole project (pluging writting included) in no more than four hours! Below is the code involved, so feel free to use it in your own projects in case you also need to access Apple’s laptop battery information, or to give it a shot of caffeine!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 0px; min-height: 14px;"&gt;&lt;span style="font-size: small; letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 0px;"&gt;&lt;span style="font-size: small; letter-spacing: 0px;"&gt;And next time someone tells you something about “basic” in REALbasic language... don’t be fooled!&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 0px; min-height: 14px;"&gt;&lt;span style="font-size: small; letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 0px;"&gt;&lt;span style="font-size: small; letter-spacing: 0px;"&gt;These are the files you have to write in Apple Xcode for the plugin side (as a module):&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Georgia,serif; font-weight: normal;"&gt;&lt;a href="http://3.bp.blogspot.com/-R0O9cugNYrI/TWdP0zfKMmI/AAAAAAAAAAc/xfwDQHKNg-4/s1600/Compiled_plugin.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5577514432114340450" src="http://3.bp.blogspot.com/-R0O9cugNYrI/TWdP0zfKMmI/AAAAAAAAAAc/xfwDQHKNg-4/s320/Compiled_plugin.png" style="cursor: pointer; display: block; height: 160px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;b&gt;file &amp;gt; infobateria.h&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;#ifndef _inforbateria&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;#define _inforbateria&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;typedef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;struct&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; infoBateria {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;tiempoCargaCompleta;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;tiempoRestante;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;capacidadActual;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;capacidadMaxima;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;voltajeActual;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;amperaje;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;mAhOriginales;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;mAhMaximo;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;mAhActuales;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;ciclosOriginales;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;contadorDeCiclos;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;numeroDeSerie;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;char&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;serieBateria[&lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;100&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;char&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;estadoBateria[&lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;100&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;char&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;fuenteDeAlimentacion[&lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;100&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;unsigned&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;char&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;diaDeFabricacion;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;unsigned&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;char&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;mesDeFabricacion;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;unsigned&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;short&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;anoFabricacion;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;temperatura;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;SInt32&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;estaCargando;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;} infoBateria_t;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;#endif&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;b&gt;File PMInfoRB.c (or cpp)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;"rb_plugin.h"&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;iokit iopowersources.h="" ps=""&gt;&lt;/iokit&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;iokit iopskeys.h="" ps=""&gt;&lt;/iokit&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;mach mach_port.h=""&gt;&lt;/mach&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;mach mach_interface.h=""&gt;&lt;/mach&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;mach mach_init.h=""&gt;&lt;/mach&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;iokit iopmlib.h="" pwr_mgt=""&gt;&lt;/iokit&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;iokit iomessage.h=""&gt;&lt;/iokit&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;"infoBateria.h"&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;"infoBateriaRB.h"&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;#include &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;sys sysctl.h=""&gt;&lt;/sys&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#3f6e74" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;static&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;infoBateria_t&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; *&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div color="#3f6e74" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;static&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;bool&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;reposoForzado&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div color="#3f6e74" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;static&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;REALstring&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;modeloPortatil&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;static&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IOPMAssertionID&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;assertionID&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;io_connect_t&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;  &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;root_port&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;IONotificationPortRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;  &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;notifyPortRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div color="#3f6e74" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;io_object_t&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;            &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;notifierObject&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;void&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;*                  &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;refCon&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;void&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; trataNotificaciones( &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;void&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; * &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;refCon&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;io_service_t&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; service, &lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;natural_t&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; messageType, &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;void&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; * messageArgument )&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;switch&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; ( messageType )&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;    {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;        &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;case&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kIOMessageCanSystemSleep&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;            &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;IOCancelPowerChange&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;( &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;root_port&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, (&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;long&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)messageArgument );&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;            &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;break&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;        &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;case&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kIOMessageSystemWillSleep&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFShow&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;"Reposo forzado"&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div color="#3f6e74" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;reposoForzado&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; = &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;true&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;            &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;IOAllowPowerChange&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;( &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;root_port&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, (&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;long&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)messageArgument );&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;            &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;break&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;        &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;case&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kIOMessageSystemWillPowerOn&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFShow&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;"Saliendo del reposo"&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div color="#3f6e74" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;reposoForzado&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; = &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;false&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;            &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;break&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;        &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;case&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kIOMessageSystemHasPoweredOn&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div color="#aa0d91" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;break&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;        &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;default&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;            &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;break&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;static&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;bool&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; registraNotificacionSleep()&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;IOReturn&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; success = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;IOPMAssertionCreate&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kIOPMAssertionTypeNoDisplaySleep&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;          &lt;/span&gt;   &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kIOPMAssertionLevelOn&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;assertionID&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;); &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; (success == &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kIOReturnSuccess&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#3f6e74" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;root_port&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;IORegisterForSystemPower&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;( &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;refCon&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;notifyPortRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, trataNotificaciones, &amp;amp;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;notifierObject&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; );&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; ( &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;root_port&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; == &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; )&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;    {&lt;/span&gt;&lt;/div&gt;&lt;div color="#aa0d91" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;        &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;return&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;false&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFRunLoopAddSource&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;( &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFRunLoopGetCurrent&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(),&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;   &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IONotificationPortGetRunLoopSource&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;notifyPortRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;), &lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;kCFRunLoopCommonModes&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; ); &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#aa0d91" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;return&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;true&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;static&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;bool&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; desactivaNotificaciones()&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;IOReturn&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; success = &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IOPMAssertionRelease&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;assertionID&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div color="#643820" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; (success == &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kIOReturnSuccess&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFRunLoopRemoveSource&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;( &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFRunLoopGetCurrent&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(),&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;  &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IONotificationPortGetRunLoopSource&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;notifyPortRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;  &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kCFRunLoopCommonModes&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; );&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IODeregisterForSystemPower&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;( &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;notifierObject&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; );&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IOServiceClose&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;( &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;root_port&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; );&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IONotificationPortDestroy&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;( &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;notifyPortRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; );&lt;/span&gt;&lt;/div&gt;&lt;div color="#aa0d91" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;return&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;true&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;static&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;bool&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; obtenvalores (&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;void&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;    &lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFTypeRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; blob;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFArrayRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; array = &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFDictionaryRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; diccionario;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;size_t&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; buffer = &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;SInt32&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; fechaFabricacion, temperatura = &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;int&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; error;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;char&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; nombre[&lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;100&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;Boolean&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; b;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;kern_return_t&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; errorIO = &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFMutableDictionaryRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; diccionarioObjeto;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#5c2699" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;io_registry_entry_t&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt; registroIO = &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#c41a16" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;registroIO = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;IORegistryEntryFromPath&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;kIOMasterPortDefault&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;"IOService:/AppleACPIPlatformExpert/SMB0/AppleECSMBusController/AppleSmartBatteryManager/AppleSmartBattery"&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;errorIO = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;IORegistryEntryCreateCFProperties&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(registroIO, &amp;amp;diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;kCFAllocatorDefault&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; (!errorIO)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; (&lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryContainsKey&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"DesignCapacity"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)))&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"DesignCapacity"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;mAhOriginales&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; (&lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryContainsKey&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"DesignCycleCount"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)))&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"DesignCycleCount"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;ciclosOriginales&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"ManufactureDate"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;fechaFabricacion);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; (&lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryContainsKey&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"SerialNumber"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)))&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"SerialNumber"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;numeroDeSerie&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;b = &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFStringGetCString&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFStringRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(diccionarioObjeto,&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"BatterySerialNumber"&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;serieBateria&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;255&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kCFStringEncodingUTF8&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"Temperature"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;temperatura);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"MaxCapacity"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;mAhMaximo&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"Voltage"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;voltajeActual&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"CurrentCapacity"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;mAhActuales&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"CycleCount"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;contadorDeCiclos&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"Amperage"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;amperaje&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;diaDeFabricacion&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; = fechaFabricacion &amp;amp; &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;31&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;mesDeFabricacion&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; = (fechaFabricacion &amp;amp; &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;480&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &amp;gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;5&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;anoFabricacion&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; = ((fechaFabricacion &amp;amp; &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;65024&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &amp;gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;9&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) + &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;1980&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;temperatura&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; = (( temperatura &amp;amp; &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;255&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; ) - &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;32&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) / &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;1.8&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFRelease&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionarioObjeto);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;error = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;sysctlbyname&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"hw.model"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;NULL&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;buffer, &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;NULL&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;error = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;sysctlbyname&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"hw.model"&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, nombre, &amp;amp;buffer, &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;NULL&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;modeloPortatil&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; = &lt;/span&gt;&lt;span style="color: #26474b; letter-spacing: 0px;"&gt;REALBuildString&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(nombre, &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;strlen&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(nombre));&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;blob = &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IOPSCopyPowerSourcesInfo&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; (blob != &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;NULL&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;array = &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IOPSCopyPowerSourcesList&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(blob);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;if&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt; (array != &lt;/span&gt;&lt;span style="color: #aa0d91; letter-spacing: 0px;"&gt;NULL&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;diccionario = &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;IOPSGetPowerSourceDescription&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(blob, &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFArrayGetValueAtIndex&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(array, &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;0&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionario, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;kIOPSTimeToEmptyKey&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;tiempoRestante&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionario,&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;kIOPSCurrentCapacityKey&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;capacidadActual&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionario, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;kIOPSMaxCapacityKey&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;capacidadMaxima&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;b = &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFNumberGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFNumberRef&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="color: #2e0d6e; letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(diccionario, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;kIOPSTimeToFullChargeKey&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;3&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;, &amp;amp;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;tiempoCargaCompleta&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;b = &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFStringGetCString&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFStringRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(diccionario,&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;kIOPSPowerSourceStateKey&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;fuenteDeAlimentacion&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;100&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kCFStringEncodingUTF8&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;fuenteDeAlimentacion&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;[&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;strlen&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFStringGetCStringPtr&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFStringRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(diccionario, &lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;kIOPSPowerSourceStateKey&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;kCFStringEncodingUTF8&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;)) + &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;1&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;] = &lt;/span&gt;&lt;span style="color: #1c00cf; letter-spacing: 0px;"&gt;'0'&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 10px Monaco; margin: 0px; min-height: 14px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div color="#2e0d6e" style="font: 10px Monaco; margin: 0px;"&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;b = &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFStringGetCString&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;((&lt;/span&gt;&lt;span style="color: #5c2699; letter-spacing: 0px;"&gt;CFStringRef&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;) &lt;/span&gt;&lt;span style="letter-spacing: 0px;"&gt;CFDictionaryGetValue&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(diccionario,&lt;/span&gt;&lt;span style="color: #643820; letter-spacing: 0px;"&gt;CFSTR&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;(&lt;/span&gt;&lt;span style="color: #c41a16; letter-spacing: 0px;"&gt;"BatteryHealth"&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;)), &lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;laBateria&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #3f6e74; letter-spacing: 0px;"&gt;estadoBateria&lt;/span&gt;&lt;span style="color: black; letter-spacing: 0px;"&gt;, &lt;/span&gt;&lt;span styl
