<?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:blogger='http://schemas.google.com/blogger/2008' 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-3697832350934094119</id><updated>2024-09-07T01:37:40.915+01:00</updated><category term="Nokia"/><category term="Hewlett Packard"/><category term="S60"/><category term="HP-41C"/><category term="Casio"/><category term="FOTA"/><category term="Firmware Over-The-Air"/><category term="N9"/><category term="NSU"/><category term="Nokia Software Updater"/><category term="Swiss Micros"/><category term="Canon"/><category term="DM41"/><category term="DM42"/><category term="E72"/><category term="HP-71"/><category term="Harmattan"/><category term="MeeGo"/><category term="Numerical"/><category term="OVI Maps"/><category term="SIM-free"/><category term="Sharp"/><category term="branded"/><category term="free"/><category term="generic"/><category term="restriction code"/><category term="social media"/><category term="wifi"/><category term="3G"/><category term="5800 XpressMusic"/><category term="Access Gateway"/><category term="BASIC"/><category term="CDOWN"/><category term="CalDAV"/><category term="Calculator"/><category term="DSLR"/><category term="Deebot"/><category term="EOS"/><category term="EOS 800D"/><category term="Ecovacs"/><category term="Euclidean"/><category term="Euler"/><category term="Facebook"/><category term="G2"/><category term="Google"/><category term="HP-42S"/><category term="HP10s+"/><category term="Integration"/><category term="JavaScript"/><category term="Karmic Koala"/><category term="Linux"/><category term="N79S"/><category term="N900"/><category term="N950"/><category term="OVI Suite"/><category term="PB-410F"/><category term="PC-1360"/><category term="PIN"/><category term="PR1.3"/><category term="PUK"/><category term="Prime"/><category term="Printer"/><category term="RPN"/><category term="RUNSW"/><category term="Raphson"/><category term="Riemann"/><category term="SETSW"/><category term="SIM"/><category term="SIP"/><category term="Simpson"/><category term="Spotify"/><category term="Texas Instruments"/><category term="Time Module"/><category term="Timer"/><category term="Ubuntu"/><category term="V40"/><category term="V51"/><category term="Virgin Mobile"/><category term="VoIP"/><category term="Vodafone"/><category term="WINE"/><category term="WomWorld"/><category term="XYZALM"/><category term="Zeta"/><category term="account"/><category term="algorithm"/><category term="alpha"/><category term="benchmark"/><category term="calendar"/><category term="caller ID"/><category term="camera"/><category term="charger"/><category term="deception"/><category term="digital"/><category term="energy profiler"/><category term="expedition field chronograph"/><category term="exploding battery"/><category term="failure"/><category term="femtocell"/><category term="firmware"/><category term="flashing envelope"/><category term="flickr"/><category term="fring"/><category term="identity theft"/><category term="intro"/><category term="kinetic scrolling"/><category term="language"/><category term="location based"/><category term="lock code"/><category term="logic"/><category term="messages"/><category term="method"/><category term="namespace"/><category term="navigation"/><category term="newton"/><category term="nimbuzz"/><category term="number theory"/><category term="object"/><category term="photo ID"/><category term="photography"/><category term="power bank"/><category term="queens"/><category term="quiz"/><category term="robot"/><category term="scam"/><category term="security"/><category term="security code"/><category term="silence"/><category term="solar cell"/><category term="solver"/><category term="stack"/><category term="startup"/><category term="sync"/><category term="synchronisation"/><category term="timex"/><category term="truphone"/><category term="turn by turn"/><category term="unlock code"/><category term="unread"/><category term="update"/><category term="vacuum cleaner"/><category term="vlingo"/><category term="voipfone.co.uk"/><category term="voiptalk.org"/><category term="watch"/><category term="π"/><title type='text'>Techy odds and ends</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://techy.horwits.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-3014996886265346800</id><published>2022-06-06T17:05:00.013+01:00</published><updated>2022-06-06T18:08:13.910+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="charger"/><category scheme="http://www.blogger.com/atom/ns#" term="exploding battery"/><category scheme="http://www.blogger.com/atom/ns#" term="power bank"/><category scheme="http://www.blogger.com/atom/ns#" term="solar cell"/><title type='text'>How are retailers still allowed to sell these?</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBFUnz7y49ylUZtiZ6Jy22bvrTBvgRRaUnO4Db6NDYyek1JxLXfoXMpYVpglVwCACwlZpE34Dn327vj9jnbqV2-l1rHAZQu1wJ63yyeg0jwsSElyBHKZLVCCTy8_z0FrG8gsr-C0YsrU_KQ1VnNJXx1aIPRqmlYtMIfN9oFQt-fdX-1xrAnMNBXYj4rA/s640/pbank.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Image of a power bank&quot; border=&quot;0&quot; data-original-height=&quot;604&quot; data-original-width=&quot;640&quot; height=&quot;302&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBFUnz7y49ylUZtiZ6Jy22bvrTBvgRRaUnO4Db6NDYyek1JxLXfoXMpYVpglVwCACwlZpE34Dn327vj9jnbqV2-l1rHAZQu1wJ63yyeg0jwsSElyBHKZLVCCTy8_z0FrG8gsr-C0YsrU_KQ1VnNJXx1aIPRqmlYtMIfN9oFQt-fdX-1xrAnMNBXYj4rA/w320-h302/pbank.png&quot; title=&quot;Power bank showing its built-in solar panel&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;I don&#39;t mean power banks in general, they&#39;re useful devices and I use a few myself. What I&#39;m referring to specifically here is the type of power bank that includes a small solar panel on it to &quot;charge&quot; the power bank using nothing but light.&lt;p&gt;&lt;/p&gt;&lt;p&gt;These devices are actually quite dangerous, which explains why the only companies manufacturing them are brands, usually Chinese, with a brand name that looks like a Scrabble hand, who use the cheapest components possible.&lt;/p&gt;&lt;p&gt;There&#39;s a reason why more reputable brands don&#39;t make these bombs waiting to explode.&lt;/p&gt;&lt;p&gt;The capacity of the batteries is significant. OK, you can&#39;t always trust the published specifications of these things from less reputable brands, but even so, you&#39;re going to end up with a battery pack with a capacity of several thousand milliampere-hours. Let&#39;s assume we&#39;re working with a 20,000 mAh pack here. Let&#39;s also assume that the capacity that the manufacturer is boasting is actually honest and that it really is the advertised 20,000 mAh. Note that this does not mean that you can draw 1000 mA from the USB output for 20 hours, the figure of 20,000 refers to the capacity of the batteries, which are usually lithium-polymer batteries with a nominal voltage of 3.7V. Expressing the battery capacity in milliwatt-hours rather than milliampere-hours gives us a quantity that&#39;s much closer to the actual amount of energy stored in the battery. To get that, we simply multiply the capacity in mAh by the nominal voltage, which gives us 74,000 mWh.&lt;/p&gt;&lt;p&gt;What does this mean for the device that I&#39;m trying to charge with a power bank?&lt;/p&gt;&lt;p&gt;The electronics inside the power bank that convert the 3.7V from the Li-Po cells into 5V for the USB outputs are never 100% efficient; some of the energy from the battery is lost in Joule effect mostly (heat dissipation), usually around 15%, on the way out, so the efficiency is closer to 85%. This means that you only get 85% of your 74,000 mWh back out of the pack when you&#39;re charging your mobile phone, i.e. roughly 63,000 mWh. At a voltage of 5V, that works out at 12,600 mAh. You only get around 12.6 hours at 1000 mA under 5V, not 20 hours. So, as a general rule, when a manufacturer says that the capacity of their power bank is &#39;x&#39; number of mAh, you take 63% of that value to get an idea of what you can actually get out of it through its USB port(s).&lt;/p&gt;&lt;p&gt;Now let&#39;s look at the charging circuitry. It&#39;s never 100% efficient either. It suffers the same losses as the output inverters for the same reasons (it&#39;s actually the same kind of circuit), meaning that only 85% of the energy put into the pack actually makes it into the batteries. In reality, this means that we need to pump some 87000 mWh into the pack to charge it fully.&lt;/p&gt;&lt;p&gt;OK, so how much energy do these small solar panels actually provide?&lt;/p&gt;&lt;p&gt;Quoting&amp;nbsp;&lt;a href=&quot;https://www.theecoexperts.co.uk/solar-panels/how-much-electricity&quot;&gt;https://www.theecoexperts.co.uk/solar-panels/how-much-electricity&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;i&gt;&quot;The standard solar panel has an input rate of around 1000 Watts per square metre, and the majority of solar panels available have [an efficiency of] around 15-20%&quot;&lt;/i&gt;. Note that this is referring to the kind of solar panel that you put on your roof to generate power for your home, and these are much more efficient than the cheap photovoltaic cells to be found on these power banks or on dual power calculators etc. but let&#39;s be charitable and just work at the lower end, assuming 15% efficiency, so 150 W/m&lt;sup&gt;2&lt;/sup&gt;.&lt;/p&gt;&lt;p&gt;How big are the cells? I had such a power bank until I decided to get rid of it. The photovoltaic cell on it was 12cm by 6.5cm. That&#39;s 0.0078m&lt;sup&gt;2&lt;/sup&gt;, meaning that the thing should be able to produce around 1.17 Watts when in direct sunlight. Far less than that if you live in a part of the world that never really gets direct sunlight, so let&#39;s halve that for normal, everyday conditions: 0.585 W, i.e. 585 mW.&lt;/p&gt;&lt;p&gt;I therefore have a photovoltaic cell providing 585 mW and I need 87,000 mWh of energy to charge the battery pack. This means that I&#39;d need to wait almost 150 hours for the PV cell to charge the pack. At an average of 12 hours of daylight per day throughout the year, we&#39;re talking 12 days charging time.&lt;/p&gt;&lt;p&gt;Conclusion: the cheap and minute PV cells put on these devices don&#39;t really make any significant difference to the battery life of these packs. All they do is look &quot;good&quot; (because &quot;renewable energy&quot; and all that) and drive the cost up.&lt;/p&gt;&lt;p&gt;This leads to the other phenomenon that really makes these things dangerous.&lt;/p&gt;&lt;p&gt;What is someone who doesn&#39;t know about Li-Po battery technology and its limitations (i.e. most consumers) going to do? They&#39;re going to put the battery pack in direct sunlight to maximise the PV cell&#39;s power output. What&#39;s going to happen then? The battery pack is going to heat up. Significantly. It can conceivably become too hot to touch.&lt;/p&gt;&lt;p&gt;What happens to Li-Po batteries when you try to charge them hot? There are two possibilities here. The first possibility is that the charge-limiting circuitry built into the pack will kick in and prevent the PV cell from charging the batteries any further. In other words, the PV cell becomes totally ineffective and it&#39;ll take even longer than 12 days to charge up your battery pack.&lt;/p&gt;&lt;p&gt;The second possibility is a result of the manufacturer cutting corners to make the device as cheap as possible. They don&#39;t bother with the thermal shut-off and continue charging the batteries, the cheapest and least reliable ones they could find to throw in the pack, regardless. What happens then?&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOPtGtlda8olVRExqDlG8Lug2PKt2RbOMw3ktxrtoHYkoP78dz6rtM0LgMBfqJF1IvgnWwfcElTG_fGWLYia9uamx3B8QbzJOg-Df7daVMlmH-yf6Q-X6WgkQcaRSce8-0XTK89m6ZFmYUF5diMNoHpqQYVgN7JARXUOhGLSG2-AlYjKCfAD_zndAzvw/s765/lithium-ion-battery.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;518&quot; data-original-width=&quot;765&quot; height=&quot;217&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOPtGtlda8olVRExqDlG8Lug2PKt2RbOMw3ktxrtoHYkoP78dz6rtM0LgMBfqJF1IvgnWwfcElTG_fGWLYia9uamx3B8QbzJOg-Df7daVMlmH-yf6Q-X6WgkQcaRSce8-0XTK89m6ZFmYUF5diMNoHpqQYVgN7JARXUOhGLSG2-AlYjKCfAD_zndAzvw/s320/lithium-ion-battery.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/3014996886265346800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/3014996886265346800'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2022/06/how-are-retailers-still-allowed-to-sell.html' title='How are retailers still allowed to sell these?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBFUnz7y49ylUZtiZ6Jy22bvrTBvgRRaUnO4Db6NDYyek1JxLXfoXMpYVpglVwCACwlZpE34Dn327vj9jnbqV2-l1rHAZQu1wJ63yyeg0jwsSElyBHKZLVCCTy8_z0FrG8gsr-C0YsrU_KQ1VnNJXx1aIPRqmlYtMIfN9oFQt-fdX-1xrAnMNBXYj4rA/s72-w320-h302-c/pbank.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-3871753477406889705</id><published>2022-01-01T17:22:00.012+00:00</published><updated>2023-08-07T08:18:48.271+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Deebot"/><category scheme="http://www.blogger.com/atom/ns#" term="Ecovacs"/><category scheme="http://www.blogger.com/atom/ns#" term="N79S"/><category scheme="http://www.blogger.com/atom/ns#" term="robot"/><category scheme="http://www.blogger.com/atom/ns#" term="vacuum cleaner"/><title type='text'>Ecovacs Deebot N79S</title><content type='html'>&lt;h2 style=&quot;text-align: left;&quot;&gt;Cheap and Cheerful and gets the job done.&lt;/h2&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;965&quot; data-original-width=&quot;916&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh7mv_i7ITYKKssGqaYALX9wGpbviMeeYhZxSJiOmE2yJXZAvQ39VyfoMUUJDCuO5r5vlWer-4jmwNsycff05uFChVBpN1WKzQn9CZ6ehk1g1DiUTMQ0jSLFVs__nh14Mc3Pm24ZUb7o5XiW7O4eeBqIWXe5xIad33Ux8JUDSyF1dYiB_HvQKaWMD9XGQ=w304-h320&quot; width=&quot;304&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Edit 07-Aug-2023: 19 months after buying this robot and using it every few days, it is dead. Mechanical failure means that one of the wheels is no longer connected to the motor that drives it, so the robot basically goes round in small circles.&lt;/p&gt;&lt;p&gt;If you&#39;re looking for a smart appliance with all the bells and whistles then this is not it, but it doesn&#39;t pretend to be it anyway. This is an entry-level vacuum cleaner robot that fumbles around more or less randomly, cleaning up whatever is in its path.&lt;/p&gt;

&lt;p&gt;The reason I bought this is because I wanted to see how well the technology coped with a small home on one floor that really is quite cluttered to be honest. If it doesn&#39;t cope well, then no great loss. If it does, then I know I can invest a bit more when this one comes to the end of its life.&lt;/p&gt;

&lt;p&gt;The robot comes with an infra-red remote control allowing you to access its basic features: auto clean, room clean, edge clean, spot clean and return to dock. It also allows you to set up the Wi-Fi link and to program the timer to get it to start cleaning automatically at a set time every day. Then there&#39;s an app (there are both Android and iPhone versions) that provides a bit more control. Finally, there&#39;s an Amazon Alexa skill allowing you to give basic commands by voice. Presumably, there&#39;s an equivalent for the Google smart home ecosystem as well, I honestly don&#39;t know. I&#39;m an Alexa user myself.&lt;/p&gt;

&lt;p&gt;What I think we can take home from a few days of using this robot is that it&#39;s a good piece of hardware for the price that is let down by some poor software. Atrociously poor software, to be honest. The vacuum cleaner part of it works really surprisingly well for something in this price range (nominal price is around £200 but it can be found for as little as £150 or even less if you look around&amp;nbsp;−&amp;nbsp;as of 1/1/2022 &lt;a href=&quot;https://smile.amazon.co.uk/gp/product/B07F3Q25LJ/&quot; target=&quot;_blank&quot;&gt;Amazon UK are selling it for £129&lt;/a&gt; for the next 8 days). The robot is fairly quiet despite suction power that is really not bad. The dust receptacle is large enough to do the entire flat with capacity to spare and the various consumables (filter, beater, brushes etc.) are easy enough to replace. Clearly it&#39;s going to be a lot slower than a traditional vacuum cleaner because it&#39;s less powerful and smaller, but does that matter? You just start it and let it get on with the job while you&#39;re doing something else with your time. You don&#39;t even need to worry about the battery going flat because the robot will sense this condition and simply return to its charging dock.&lt;/p&gt;

&lt;h3&gt;Navigation&lt;/h3&gt;

&lt;p&gt;Firstly, let me stress that this is &lt;em&gt;not&lt;/em&gt; one of those fancy robots with lasers that map out the environment and show you a floor plan on your phone or tablet on which you can define zones, no-go areas etc. This thing is dumb and nearly blind. If you&#39;re looking for the really smart kind of robot then you&#39;re going to be disappointed with this model. Then again, what do you expect for less than £200?&lt;/p&gt;

&lt;p&gt;There are four cleaning modes with this robot: auto, single room, edge and spot. All can be engaged either using the remote control or the mobile app.&lt;/p&gt;

&lt;h4&gt;Auto clean mode&lt;/h4&gt;

&lt;p&gt;This is the simplest of the four modes. The robot really does mill around randomly, sucking up dust in its path. It&#39;ll set off in a random direction until its optical sensors detect an obstacle close ahead, until the fall detectors on the underside tell it that it&#39;s about to walk off an edge (e.g. staircase) or until it bumps into something low down that was below the optical sensors&#39; line of sight. It then sets off from that point in another random direction until it encounters another obstacle. If it bumps into obstacles in quick succession, i.e. if it gets itself into a very confined space, then it attempts to edge around the obstacles until it reaches an opening through which it can make good its escape. The mobile app lets you switch between &quot;standard&quot; and &quot;max&quot; suction power in auto clean mode.&lt;/p&gt;

&lt;h4&gt;Single room clean mode&lt;/h4&gt;

&lt;p&gt;This is similar to auto mode except that the robot limits itself to a single room. In auto mode, if setting off in a random direction makes it wander out of the room into another then so be it, it&#39;ll just clean there too. Not in single room mode. However, for it to work in single room mode, the room needs to be sealed anyway so the robot can&#39;t escape. I&#39;m not really sure how this differs from auto mode (cough, splutter, marketing ploy, cough cough). I wouldn&#39;t be surprised if the firmware does exactly the same thing in both modes.&lt;/p&gt;

&lt;p&gt;Again, just like in auto clean mode, you can switch between &quot;standard&quot; and &quot;max&quot; suction power.&lt;/p&gt;

&lt;h4&gt;Edge clean mode&lt;/h4&gt;

&lt;p&gt;This one does actually differ from the other two. I find it useful in the kitchen, where crumbs, bits of onion skin etc. get dropped near the work surfaces, which are on the periphery of the kitchen. The robot makes its way to the edge of the room and then feels its way around the edge anticlockwise while operating at full suction. There are rotating brushes at the front of the robot, a bit like the antennae on an insect, that reach to the very edge of the floor and feed particles into the path of the main beater under the robot&#39;s belly. Part of my morning routine now includes letting the robot loose in the kitchen after I&#39;ve had breakfast so it can clean up the mess of crumbs I inevitably leave.&lt;/p&gt;

&lt;p&gt;If you want the robot to concentrate on the edge of a single room then that room clearly needs to have its exits blocked, or the robot will happily travel around the periphery of your entire living space.&lt;/p&gt;

&lt;h4&gt;Spot clean mode&lt;/h4&gt;

&lt;p&gt;Again, this differs from the other modes. You basically plonk (or drive) the robot right into the middle of a patch that has a lot of dirt to clean up and then fire up &quot;spot&quot; clean mode. For the next 3 minutes or so, the robot will clean at maximum suction power, starting by spinning on itself and then moving in concentric circles with increasing radii.&lt;/p&gt;

&lt;h4&gt;Going home&lt;/h4&gt;

&lt;p&gt;Remember, this robot isn&#39;t as smart as some. It doesn&#39;t actually have a clue where it is in relation to the charging dock or what the topology is of your rooms, so whenever it needs to go home for a power top-up, it has to &quot;look&quot; for the dock. This can actually be quite hilarious watching the thing wander off in the complete opposite direction to where it should be going, not to be seen again for the next 5 minutes while it&#39;s looking for the dock under the bed or in the bathroom. There is &lt;em&gt;some&lt;/em&gt; kind of optical guidance system at play as far as I can tell because as soon as the robot has the dock in its line of sight, it homes in on it very accurately. Until then, it&#39;s really just dumb luck.&lt;/p&gt;

&lt;p&gt;The dock must be against the wall or skirting board, placed nice and perpendicular to the wall and with sufficient clearance either side. The manual recommends 1 metre either side but it has a good deal less than that here, closer to 40cm. It had even less than that where I initially placed it but the robot did get confused and had a hard time aiming for it, kind of like it was trying to park after a few too many...&lt;/p&gt;

&lt;h4&gt;Caveats&lt;/h4&gt;

&lt;p&gt;As with any vacuum cleaner, whether automatic or manual, you need to make sure that you take any objects that can potentially damage the robot off the floor.&lt;/p&gt;

&lt;p&gt;Things like wires, pieces of string, carrier bags, frilly bits on the edge of rugs (you can fold those under the edge of the rug) and the like could easily get tangled up with the robot&#39;s moving parts. Don&#39;t leave them hanging around on the floor. You would see them and move them while you&#39;re working with a traditional vacuum cleaner but you don&#39;t necessarily think of them when using an autonomous appliance like this.&lt;/p&gt;

&lt;p&gt;Don&#39;t use this on deep pile carpets either. The pile will just wrap around the beater.&lt;/p&gt;

&lt;p&gt;This is not one of those robots that also mops. It does not like water. If you have pets, lift their food/water bowls off the floor so that the robot doesn&#39;t bump into them and slosh water and/or wet food over itself.&lt;/p&gt;

&lt;h3&gt;Battery life&lt;/h3&gt;

&lt;p&gt;This robot is powered by a replaceable Li-ion battery that is charged either by plugging the supplied charger&#39;s barrel connector directly into the robot itself or by plugging the charger into the charging dock that the robot &quot;drives&quot; into when it&#39;s finished working.&lt;/p&gt;

&lt;p&gt;Battery life will depend on many factors including the type of surface you&#39;re cleaning, the number of obstacles to navigate around and the suction power. The manual doesn&#39;t mention battery life, although the Amazon page I linked to above gives 90-120 minutes. The ballpark range you can expect is more likely to be 60 to 90 minutes after adjusting for the fact that the manufacturer&#39;s figures are more than likely theoretical figures in perfect conditions. Again, this doesn&#39;t really matter a whole lot because the robot will carry on doing its thing until it thinks the battery needs recharging, at which point it&#39;ll make its way back to the charging dock anyway (via the bathroom and under the bed).&lt;/p&gt;

&lt;p style=&quot;font-style: italic;&quot;&gt;&lt;u&gt;Update 3/1/22:&lt;/u&gt; I let the robot start at the preprogrammed time today and continue until it sensed a low battery condition and returned to its dock. It docked &lt;strong&gt;86 minutes&lt;/strong&gt; after starting its cycle.&lt;/p&gt;

&lt;h3&gt;Controlling the robot&lt;/h3&gt;

&lt;p&gt;One positive feature of this robot&#39;s design is that the app, the dock and the remote control all add features that don&#39;t actually prevent you from using the robot if you don&#39;t have them. If all you have is the robot and the charger, then you can plug the charger directly into the robot and, when you need to use the robot, you just unplug it, press the &quot;Auto&quot; button on it and let it do its thing. When you&#39;re done with it, you press the &quot;Auto&quot; button again to stop it, carry it back to the charger and plug it back in again. As long as the robot is charging, it&#39;s not going to try and run away unless you tell it to move.&lt;/p&gt;

&lt;p&gt;If you have the charging dock then you plug the charger into that. Just press the &quot;Auto&quot; button on the robot and it&#39;ll leave the dock, start vacuuming and return to the dock when it needs charging. Or you can pick it up and put it in the dock yourself.&lt;/p&gt;

&lt;h4&gt;Remote control&lt;/h4&gt;

&lt;p&gt;One of the first things you&#39;ll do with the remote control is use it to connect the robot to your Wi-Fi router. More on that in the next section dedicated to the mobile app, but suffice it to say that this is where the problems start.&lt;/p&gt;

&lt;p&gt;The remote also has buttons to drive the robot manually, to start all of the four cleaning modes, to pause or resume cleaning and to tell the robot to return to the charging dock. It also features an LCD screen showing the time of day and the current status of the robot. Finally, it has buttons to set the current time of day on the remote, to program an automatic starting time and to cancel the programming. If an automatic start time is programmed, the robot starts cleaning in auto clean mode until the battery gets low and then returns to the dock. This sounds practical, but in fact it&#39;s where more problems start.&lt;/p&gt;

&lt;p&gt;No programming of any kind is stored in the robot. It&#39;s all stored in the remote and when the programmed time is reached, the remote transmits the &quot;auto clean&quot; command via its IR transmitter. This means that the remote must always be placed pointing at the robot&#39;s charging dock. If the remote is in a different room or just pointing in the wrong direction, the robot won&#39;t see the &quot;auto clean&quot; command and, predictably, won&#39;t start cleaning. Bummer.&lt;/p&gt;

&lt;p&gt;Assuming the remote is pointing correctly at the robot, remember that it must be set to the correct time of day. If it isn&#39;t, then the robot will start cleaning when the &lt;em&gt;remote&lt;/em&gt; thinks it&#39;s the time that you programmed, not necessarily when it actually &lt;em&gt;is&lt;/em&gt; that time.&lt;/p&gt;

&lt;h4&gt;Mobile app&lt;/h4&gt;

&lt;p&gt;Where to begin...&lt;/p&gt;

&lt;p&gt;The robot only works on 2.4GHz Wi-Fi, which is fair enough. It doesn&#39;t need to transmit/receive large amounts of data so it doesn&#39;t need the speed advantages of 5GHz Wi-Fi. However, this is where the first (huge!) bug in the app rears its ugly head. The process for adding the robot to your network involves pressing a button on the remote for 3 seconds and following directions on the screen in your mobile app. If you have a Wi-Fi router that operates on both the 2.4GHz band and the 5GHz band (nearly all do these days) and if your phone/tablet is connected on the 5GHz band (like most do these days), then the app considers that your router is 5GHz only, claims that the robot can&#39;t connect to it and doesn&#39;t allow you to proceed any further.&lt;/p&gt;

&lt;p&gt;Why not just allow the robot to attempt to connect? Duh!&lt;/p&gt;

&lt;p&gt;There is a solution to this conundrum. Most Wi-Fi routers let you manage the 2.4GHz and 5GHz networks independently, so the idea is to deactivate the 5GHz network on the router while setting the robot up (your phone or tablet will still connect to the 2.4GHz network to complete the setup), then to reactivate it. Once this is done, your robot is linked to the account you set up with Ecovacs.&lt;/p&gt;

&lt;p&gt;The robot goes into low power mode once it has finished charging and hasn&#39;t been used for a while. Great for saving power but not so great for the app. Once this happens, the app doesn&#39;t &quot;see&quot; the robot any more and it remains unreachable for about 30 seconds. If you try and drive the robot using the app while it&#39;s in this status, you get error messages saying that the app &quot;failed to retrieve data&quot; or some such. This is pretty sucky if you ask me.&lt;/p&gt;

&lt;p&gt;Using the remote does wake the robot up and bring it back online immediately.&lt;/p&gt;

&lt;p&gt;Note that the remote and the app don&#39;t know what the other is doing. If you command the robot to start auto cleaning, for example, via the app when it was in the dock, the remote continues to show that the robot is in the dock. It doesn&#39;t know that the app told the robot to start cleaning. A lack of synchronisation in this direction is, however, understandable. The remote has an IR &lt;u&gt;transmitter&lt;/u&gt; in it, no receiver, so it has no way to receive feedback from the robot.&lt;/p&gt;

&lt;p&gt;The same lack of synchronisation also occurs the other way round. If the robot is in the dock and you use the remote to tell it to start cleaning, the app still shows the robot in the dock. Now, &lt;em&gt;that&lt;/em&gt; is something that should be updated in real time.&lt;/p&gt;

&lt;p&gt;On the positive side, the app does allow you to program auto start times with more flexibility than the remote. You can set up multiple programs that repeat on one or more days of the week and there&#39;s no need to have anything in line of sight of the robot for them to work.&lt;/p&gt;

&lt;h4&gt;Amazon Alexa skill&lt;/h4&gt;

&lt;p&gt;Amazon uses so-called &quot;skills&quot; to have the Alexa platform talk to third party systems. There is a skill that allows Alexa to link to your Ecovacs account with one or more robots linked to it, to talk to Ecovacs&#39; systems on your behalf and control those linked robots.&lt;/p&gt;

&lt;p&gt;Or at least, that&#39;s how it&#39;s supposed to work.&lt;/p&gt;

&lt;p&gt;As things are now, and it appears they&#39;ve been like this for several months with no fix in sight forthcoming from Ecovacs, Alexa can&#39;t see the robots linked to your Ecovacs account, so the skill setup fails.&lt;/p&gt;

&lt;p&gt;In other words: &quot;Computer says no&quot;&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;There are positives and negatives for this particular model.&lt;/p&gt;

&lt;p&gt;If this is your first foray into the technology and if you&#39;re looking for a budget-friendly solution then this is probably a good solution. If you already have some experience with such robots then this will more than likely be a downgrade that won&#39;t impress you. If you have the budget then you might be better off looking at something with laser-based mapping, zoning and maybe the ability to mop clean, a waste receptacle so that the robot can empty itself and a bigger battery.&lt;/p&gt;

&lt;p&gt;The app has potential but is very poorly executed. The Alexa skill could be useful if it actually worked (I have no idea how well the Google version for this robot works). Until the software bugs are ironed out, you&#39;re better off sticking to the remote rather than using the app. This isn&#39;t a big problem because nearly all of the robot&#39;s features are covered by it.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/3871753477406889705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/3871753477406889705'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2022/01/ecovacs-deebot-n79s.html' title='Ecovacs Deebot N79S'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEh7mv_i7ITYKKssGqaYALX9wGpbviMeeYhZxSJiOmE2yJXZAvQ39VyfoMUUJDCuO5r5vlWer-4jmwNsycff05uFChVBpN1WKzQn9CZ6ehk1g1DiUTMQ0jSLFVs__nh14Mc3Pm24ZUb7o5XiW7O4eeBqIWXe5xIad33Ux8JUDSyF1dYiB_HvQKaWMD9XGQ=s72-w304-h320-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-7727901105222186554</id><published>2021-05-31T13:02:00.004+01:00</published><updated>2021-05-31T13:14:48.185+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="identity theft"/><category scheme="http://www.blogger.com/atom/ns#" term="photo ID"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="social media"/><title type='text'>Staying safe on social media</title><content type='html'>&lt;p&gt;First of all, let&#39;s get one thing out of the way. It&#39;s a major thing that you always need to bear in mind
  when participating in social media in order to enjoy it safely. Your own safety is not the only thing that
  depends on this, that of your friends and family does, too.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Social media is &lt;u&gt;not&lt;/u&gt; a safe haven.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;There. I said it.&lt;/p&gt;

&lt;p&gt;Social media is open to anyone, not just the &quot;good guys&quot; like you and your friends. The &quot;bad guys&quot; are also
  out there and they gradually glean snippets of information from you and others that help them build up a
  profile allowing them to impersonate you, take over your social media account or even perpetrate identity
  theft. Any of the above can ruin your reputation and your credit rating and get you into trouble with the law
  if a crime is committed using your identity.&lt;/p&gt;

&lt;p&gt;That is, unless you deprive the bad guys of this information... Don&#39;t even feed them misinformation either
  because they can detect patterns in that, which do give away real information. Just don&#39;t give them
  &lt;b&gt;anything&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Paranoid? Moi?.......&lt;/p&gt;

&lt;p&gt;A systems administrator friend of mine always used to say: &quot;Don&#39;t ask yourself if you&#39;re paranoid. Rather
  ask yourself if you&#39;re paranoid &lt;u&gt;enough&lt;/u&gt;.&quot;&lt;/p&gt;

&lt;h1&gt;Profile info&lt;/h1&gt;

&lt;h2&gt;Photo ID&lt;/h2&gt;

&lt;p&gt;What does anyone need to forge, for example, a driving license that looks convincing even if the info on it
  is completely bogus? Your photo for starters. Make sure that no photo of you that could be used on any form
  of photo ID makes it to social media.&lt;/p&gt;

&lt;h2&gt;Date of birth&lt;/h2&gt;

&lt;p&gt;What&#39;s the first thing that your GP&#39;s surgery, for example, asks you to confirm your identity when you call?
  Your date of birth. You may wonder what anyone would gain from being able to discuss your medical history with
  your surgery. Probably not a lot before the staff get suspicious, terminate the call and ring you up, but
  possibly enough to help build a profile on you. Not to mention the simple violation of your privacy.&lt;/p&gt;

&lt;p&gt;Don&#39;t let your date of birth, even just the date without the year, be seen by anyone. Not even by your friends.&lt;/p&gt;

&lt;h2&gt;Friends list&lt;/h2&gt;

&lt;p&gt;This is another thing that must remain private, visible to you alone.&lt;/p&gt;

&lt;p&gt;What happens if one of your friends has their social media account compromised and your friends list is
  open? Whoever broke into your friend&#39;s account has instant access to a list of further potential targets.
  Concealing your friends list helps protect those who are on it. You know, your friends... They&#39;ll thank
  you for it (or they should!).&lt;/p&gt;

&lt;p&gt;If your date of birth is visible to friends and if you have a suitable profile photo, the miscreant also
  has immediate access to enough data to make false photo ID of you by breaking into &lt;i&gt;someone else&#39;s&lt;/i&gt;
  account.&lt;/p&gt;

&lt;h1&gt;Social engineering&lt;/h1&gt;

&lt;p&gt;Social engineering is the art of coaxing personal information out of people without making it look like that&#39;s
  exactly what you&#39;re doing.&lt;/p&gt;

&lt;p&gt;Classic examples of this are:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;&quot;What song was number one on your 14th birthday?&quot;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Answering this one won&#39;t give away your exact date of birth, but it will narrow it down enough for responses to
  a few similar &quot;fun&quot; questions to pinpoint it exactly.&lt;/p&gt;

&lt;p&gt;Even that may not be necessary if your birthday is visible.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;&quot;Your elf name is...&quot;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;...followed by lists of names to choose from using, for example, the date you were born and the first letter of
  your mother&#39;s maiden name.&lt;/p&gt;

&lt;p&gt;You may think that giving away just the date you were born (without the month or the year) is innocent enough.
  The trouble is, a few days ago you also gave away the approximate date of your 14th birthday. This piece of
  information could well be just enough to reconstruct your date of birth accurately.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;&quot;Without naming the place, what is the city where you were born famous for?&quot;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;The &quot;Without naming the place&quot; bit is designed you give you a false feeling of security. However, by describing
  something that your birthplace is famous for, you are as good as naming it anyway.&lt;/p&gt;

&lt;p&gt;Full name? Check.&lt;br&gt;Date of birth? Check.&lt;br&gt;Place of birth? Check.&lt;/p&gt;

&lt;p&gt;You can probably guess where this is going. Fraudsters have no need whatsoever for you to divulge everything
  they need in one go. They watch your responses to multiple social engineering examples and slowly piece your
  profile together.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;&quot;If you married your husband/wife where you met them, where would your wedding have been?&quot;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;This is the exact same question as &quot;Where did you meet your spouse?&quot;&lt;/p&gt;

&lt;p&gt;Now look at this selection of security questions used to protect an on-line account:&lt;/p&gt;

&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBfYTcH5qZe-ldmIKsHP7721IxxYxehZft0yMQ_WnpL3LaE6BKQU66nGwZ1FQmzNFBsY6EM-bjCz-d2YSRxwHL2Q-opQX1TewSTI7mkgw9rtplmcwr3tsDAhShhYmBGjH0RInr6pbPNEl9/s0/questions.png&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; data-original-height=&quot;314&quot; data-original-width=&quot;313&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBfYTcH5qZe-ldmIKsHP7721IxxYxehZft0yMQ_WnpL3LaE6BKQU66nGwZ1FQmzNFBsY6EM-bjCz-d2YSRxwHL2Q-opQX1TewSTI7mkgw9rtplmcwr3tsDAhShhYmBGjH0RInr6pbPNEl9/s0/questions.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;Time to lock down the personal info visible in your social media profile and to re-evaluate what you consider
  &quot;fun&quot;...&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7727901105222186554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7727901105222186554'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2021/05/staying-safe-on-social-media.html' title='Staying safe on social media'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBfYTcH5qZe-ldmIKsHP7721IxxYxehZft0yMQ_WnpL3LaE6BKQU66nGwZ1FQmzNFBsY6EM-bjCz-d2YSRxwHL2Q-opQX1TewSTI7mkgw9rtplmcwr3tsDAhShhYmBGjH0RInr6pbPNEl9/s72-c/questions.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-4925945226012145775</id><published>2020-10-12T19:05:00.001+01:00</published><updated>2020-10-12T20:23:15.107+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="expedition field chronograph"/><category scheme="http://www.blogger.com/atom/ns#" term="timex"/><category scheme="http://www.blogger.com/atom/ns#" term="watch"/><title type='text'>Timex &quot;Expedition Field Chronograph 43mm&quot; watch</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;&quot;&gt;
  &lt;img alt=&quot;Photo of watch&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;800&quot; height=&quot;255&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYO7kFrQB3AQZudBmfDam45vvPvvP10GBoynXPr7HWhriA6DYCXJRATFmRGYTOmNdsGQ8fBymzXfdQ6DZ3z2v-DxmROIhkaQfZiRDhmQDa2VJ89S6fmplk7f4SYTvC9AA6RBe1xA8GM1Ct/w255-h255/TW2T72800.png&quot; title=&quot;Timex Expedition Field Chronograph 43mm&quot; width=&quot;255&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;It&#39;s about a week since I bought one of these so I thought I&#39;d jot down some of my first impressions of the timepiece.&lt;/p&gt;

&lt;p&gt;My overall impression is positive. There are a couple of negative points that I&#39;ll deal with but, on the whole, I like this watch.&lt;/p&gt;

&lt;p&gt;The build strikes me as being sturdy. There is no play in the crown or in the buttons and their operation is met with a reassuring amount of smooth friction.&lt;/p&gt;

&lt;p&gt;The mechanism for setting the watch is slightly unconventional but it actually makes sense. Most analogue watches with date usually allow you to set the date by pulling the crown out to a first position, and then to set the time by pulling the crown out to a second position. This watch does things slightly differently because it also has to allow you to calibrate the chronograph before you use it for the first time. With the crown in the first position you can zero the chronograph&#39;s minutes hand (10 o&#39;clock dial) and you can set the date by rotating the hours hand independently of the minutes hand. With the crown pulled out to the second position, you can zero the chronograph&#39;s seconds and tenths of a second (2 o&#39;clock dial) hands.&lt;/p&gt;

&lt;p&gt;When pulled out to its second position, rotation of the crown sets the hours and minutes hands of the watch. The gearing is such that the hands rotate slowly enough to allow accurate positioning of the minutes hand taking into account the seconds past the minute. E.g. you can pull the crown out when the seconds hand points to 0/60, which stops the watch. You then set the minutes hand to point precisely to the next minute and when that actual time is reached, push the crown back in, thus starting the watch at precisely that time.&lt;/p&gt;

&lt;p&gt;The markings on the face are accurate. There are so many watches in the same price range as the Expedition Field Chronograph (ca. £110) that have irregularly-spaced markings. They make the minutes hand point directly to a given minute on one side of the dial but halfway between two minutes on the other side of the dial when the seconds hand is pointing to 0/60. Not so for this watch.&lt;/p&gt;

&lt;p&gt;The face itself is actually quite readable, more so than the above photograph would lead you to believe. Legibility decreases with the level of ambient light and there are no phosphorescent &quot;glow in the dark&quot; markings on the watch face, but this is one of Timex&#39;s &quot;Indiglo&quot; watches. The face can be illuminated by an electroluminescent panel emitting blue light, although like any form of lighting, this is a drain on the battery that is huge compared to normal operation of the watch.&lt;/p&gt;

&lt;p&gt;I have to admit that I wasn&#39;t a fan of the khaki-coloured fabric strap that came with this watch. Yes, it does match the watch face but I just didn&#39;t like it. I replaced it with a black leather strap matching the body of the watch. It&#39;s an easy and inexpensive &quot;fix&quot;.&lt;/p&gt;

&lt;p&gt;The chronograph needs calibrating before first use so that the hands actually point to zero when the chronograph is reset. The procedure is simple enough and only needs to be done once unless the watch is subjected to unusually high G-forces. Three hands indicate the chronograph time elapsed. The chronograph seconds hand is the long hand on the central axle (pointing to 36 on the photo), the minutes hand is on the dial at 10 o&#39;clock reading from 0 to 30 and the 10ths of a second hand is on the dial at 2 o&#39;clock and actually has a resolution of a 20th of a second (0.05s). This last hand does not move during chronograph operation; it is moved to point to the correct reading once a split time is displayed or the chronograph is stopped.&lt;/p&gt;

&lt;p&gt;The seconds hand for timekeeping is on the dial at 6 o&#39;clock. This may seem unusual to have it there rather than on the same axle as the hours and minutes hands but, once again, this decision makes practical sense. This dial is partially obscured by the hours hand between about 4:30 and 7:30 and by the minutes hand from about 20 minutes past the hour to 40 minutes past the hour. If it was the seconds hand of the chronograph, you would potentially have to wait for three hours to see how many seconds the chronograph is displaying. With it being the timekeeping seconds hand, you only have to wait a few seconds to see it again and the chronograph seconds hand is not obscured.&lt;/p&gt;

&lt;p&gt;Having only owned this watch for about a week, it&#39;s far too early to think of accuracy. This said, it&#39;s looking good. As soon as I unboxed the watch, I synchronised it to a radiocontrolled clock that I have. Today, the watch is running maybe 0.2s faster than the clock. That equates to an inaccuracy of around one second per month, or somewhere between 10 and 12 seconds a year.&lt;/p&gt;

&lt;p&gt;Would I recommend this timepiece? It matches more or less what I expect from a watch in this price range, so yes. I was pleasantly surprised by most things that I wasn&#39;t expecting and not really bothered by the rest.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/4925945226012145775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/4925945226012145775'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2020/10/timex-expedition-field-chronograph-43mm.html' title='Timex &quot;Expedition Field Chronograph 43mm&quot; watch'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYO7kFrQB3AQZudBmfDam45vvPvvP10GBoynXPr7HWhriA6DYCXJRATFmRGYTOmNdsGQ8fBymzXfdQ6DZ3z2v-DxmROIhkaQfZiRDhmQDa2VJ89S6fmplk7f4SYTvC9AA6RBe1xA8GM1Ct/s72-w255-h255-c/TW2T72800.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-1484924277674722606</id><published>2020-09-22T18:07:00.001+01:00</published><updated>2020-12-09T17:03:10.526+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="deception"/><category scheme="http://www.blogger.com/atom/ns#" term="Facebook"/><category scheme="http://www.blogger.com/atom/ns#" term="quiz"/><category scheme="http://www.blogger.com/atom/ns#" term="scam"/><category scheme="http://www.blogger.com/atom/ns#" term="social media"/><title type='text'>I just passed an impossible test on Facebook!</title><content type='html'>&lt;p&gt;We&#39;ve all seen those status updates from friends stating that they got 9 out of 10 answers right to a so-called impossible test claiming that &quot;&lt;u&gt;Nobody&lt;/u&gt; will get more than 60% of these right!&quot; or something similar, haven&#39;t we? Let&#39;s look at how these things work, what they do and why they do it. Before going any further, help yourself to a decent dollop of cynicism or you&#39;re going to be very disappointed in social media.&lt;/p&gt;

&lt;p&gt;Remember the golden rule: if it looks too good to be true, then the chances are that it is &lt;i&gt;not&lt;/i&gt; true. If there is the remotest possibility that something happening on social media could be something other than what it looks like, then it is &lt;i&gt;not&lt;/i&gt; what it looks like and someone is trying to pull a fast one for profit in some way. Are the people setting these quizzes doing it out of the goodness of their hearts for the enrichment of the human race? Of course not. They&#39;re doing it to make &lt;b&gt;money&lt;/b&gt;. So how do they make their money? What is their business model?&lt;/p&gt;

&lt;p&gt;They all rely on &lt;u&gt;deception&lt;/u&gt; to trick users into visiting their pages. One way to do this is to issue a challenge. &quot;Nobody will get more than 60% of these questions right!&quot;&lt;/p&gt;

&lt;p&gt;&quot;Really? Hold my beer...&quot;&lt;/p&gt;

&lt;p&gt;Another way to tempt people in is to tell them about how a friend did so well, which actually requires said friend&#39;s collaboration.&lt;/p&gt;

&lt;p&gt;So, you end up on the quiz page and you see one question with a difficulty level that you could probably tackle blindfolded with both arms and a leg tied behind your back and a broomstick up where the sun don&#39;t shine. But you only &lt;i&gt;just&lt;/i&gt; see it because it&#39;s almost drowned out by a sea of advertisements, many of which are animated, distract you from the question and tie your computer&#39;s CPU up with a 90% load. You answer the question and attempt to move to the next, but your computer takes forever because the CPU is overloaded trying to display and animate those ads. However, you get there eventually. The next question is displayed somewhere in another sea of ads that tie your machine&#39;s CPU up just as much and you realize you don&#39;t need to remove the blindfold, the ties or the broomstick to answer it just as ably.&lt;/p&gt;

&lt;p&gt;This goes on until you reach the end of the questionnaire, by which time you&#39;ve been subjected to approximately 2000 ads, your computer is running out of memory and you&#39;re wondering where the catch was. You are given your score, which is always at least 80%, but if it isn&#39;t 100% then you might be offered the option to re-sit the test (and get shown another 2000 ads). Either way round, you also get the option to post the result on Facebook, which is the &quot;collaboration&quot; required by these systems to tempt your friends to take the test.&lt;/p&gt;

&lt;p&gt;What really happened here?&lt;/p&gt;

&lt;p&gt;Firstly, the site owners were paid by the advertisers to show you as many ads as humanly possible.&lt;/p&gt;

&lt;p&gt;Secondly, high on your success, you wanted to share your achievement on social media. To this end, more often than not, you can deliberately answer all the questions incorrectly and you will &lt;i&gt;still&lt;/i&gt; get a score of 80% or more because the aim here is not to test your knowledge in any way, shape or form (the questions wouldn&#39;t be that easy if it was) but to make you want to share your achievement. Why? Because it will encourage others to take the test and get bombarded with ads that the site owners are paid to show them.&lt;/p&gt;

&lt;p&gt;Thirdly, when you granted the website permission to post your achievement on Facebook, you gave them your e-mail address as part of the authorisation process. Think about that. You gave your e-mail address to an organisation that uses deception to make money out of advertising.&lt;/p&gt;

&lt;p&gt;Feel free to remove the blindfold, the ties and the broomstick now, and please burn the broomstick...&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/1484924277674722606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/1484924277674722606'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2020/09/i-just-passed-impossible-test-on.html' title='I just passed an impossible test on Facebook!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-2218122679483992629</id><published>2020-09-21T09:37:00.016+01:00</published><updated>2020-10-02T11:20:00.608+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DM42"/><category scheme="http://www.blogger.com/atom/ns#" term="Euclidean"/><category scheme="http://www.blogger.com/atom/ns#" term="Euler"/><category scheme="http://www.blogger.com/atom/ns#" term="number theory"/><category scheme="http://www.blogger.com/atom/ns#" term="Riemann"/><category scheme="http://www.blogger.com/atom/ns#" term="Swiss Micros"/><category scheme="http://www.blogger.com/atom/ns#" term="Zeta"/><category scheme="http://www.blogger.com/atom/ns#" term="π"/><title type='text'>Using random numbers to compute the value of π</title><content type='html'>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;   MathJax.Hub.Config({tex2jax: {inlineMath: [[&#39;$&#39;,&#39;$&#39;], [&#39;\\(&#39;,&#39;\\)&#39;]]}}); &lt;/script&gt; &lt;script src=&quot;http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML&quot; type=&quot;text/javascript&quot;&gt; &lt;/script&gt;

&lt;p&gt;This is a little foray into number theory and presents one method of calculating the value of \(\pi\). It involves using a program to perform iterative calculations, so in order to minimise the impact of compounded rounding errors, it makes sense to use a computing device that operates with sufficient precision. I chose the &lt;a href=&quot;https://www.swissmicros.com/product/dm42&quot; target=&quot;_blank&quot;&gt;SwissMicros DM42&lt;/a&gt; for this because it uses Thomas Okken&#39;s Free42 Decimal under the hood, which offers around 34 digits of precision. The DM42 is also extremely fast, particularly so if connected to a USB port while operating because it more than triples the CPU clock compared to battery-powered operation.&lt;/p&gt;

&lt;p&gt;Back in 1735, the Swiss mathematician, astronomer (and a few other things besides) &lt;a href=&quot;https://en.wikipedia.org/wiki/Leonhard_Euler&quot; target=&quot;_blank&quot;&gt;Leonhard Euler&lt;/a&gt; stated, and proved in 1741, that as the number \(n\) tends towards \(\infty\), the probability that two natural numbers \(a\) and \(b\) less than or equal to \(n\) are coprime, i.e. that \(a\) and \(b\) share no common divisor other than \(1\), tends towards \(\frac 6{\pi^2} \approx 0.607927\) (&lt;a href=&quot;https://en.wikipedia.org/wiki/Coprime_integers#Probability_of_coprimality&quot; target=&quot;_blank&quot;&gt;Wikipedia&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;So, what&#39;s to stop us from writing a program to sample pairs of natural numbers, count how many of them are coprime and examine the proportion of coprime pairs to the total number of pairs? I&#39;ll call this proportion that we find experimentally \(p\).&lt;/p&gt;

&lt;p&gt;\(p\) should reflect the probability demonstrated by Euler and should therefore be close to our value of \(\frac 6{\pi^2}\). All we have to do then is calculate \(\sqrt {\frac 6p}\) and that will give us our approximation of \(\pi\).&lt;/p&gt;

&lt;p&gt;A few caveats first. Firstly, this only gets close to reality for values of \(n\) (the highest random natural number that we work with) that approach \(\infty\). However, we get an error of only about 0.3% if we stick to \(n=200\) or about 0.06% for \(n=1000\). Why? Because the probability of choosing two coprimes from the first \(n\) natural numbers is:

$$\frac 1{\sum_{k=1}^n \frac 1{k^2}}$$
  
Only if \(n=\infty\) do we get:

$$\frac 1{\sum_{k=1}^\infty \frac 1{k^2}} = \frac 1{\zeta(2)} = \frac 6{\pi^2}$$

Ref: &lt;a href=&quot;https://en.wikipedia.org/wiki/Basel_problem&quot; target=&quot;_blank&quot;&gt;&quot;Basel&quot; problem&lt;/a&gt;,
&lt;a href=&quot;https://en.wikipedia.org/wiki/Riemann_zeta_function&quot; target=&quot;_blank&quot;&gt;Riemann Zeta function&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It&#39;s not going to take any longer to generate random numbers up to 1000 than it is random numbers up to 200, so I&#39;ll stick with 1000 for the purposes of this experiment.&lt;/p&gt;

&lt;p&gt;Secondly, for the sample of data points to be significant, it must be as large as possible. The DM42 has plenty of computing power under the hood, especially if hooked up to USB power, so sample sizes of 1000, 10000 and even 100000 are not a problem. The higher this number, the better, but the longer it&#39;ll take to run.&lt;/p&gt;

&lt;p&gt;Thirdly, the random number generator in Free42 is already pretty darn good but it&#39;ll never be perfect, so that will introduce a few errors as well.&lt;/p&gt;

&lt;p&gt;Given the three sources of errors above, I&#39;ll be very happy if I get results within one percent, i.e. if it is able to give me a value of \(\pi\) somewhere between, say, 3.1 and 3.2.&lt;/p&gt;

&lt;p&gt;Now, that really great screen on the DM42 should not be allowed to go to waste while this is running, so I included instructions to plot the value \(p\) computed after each iteration of the loop in the program I wrote.&lt;/p&gt;

&lt;p&gt;First, here&#39;s the initial setup. It displays its current parameters and provides a menu for the user to specify the parameters of the experiment. \(n\) gets stored in R00 and the sample size in R01.&lt;/p&gt;

&lt;pre&gt;00 { 267-Byte Prgm }
01▸LBL &quot;PI2&quot;
02 ALL
03 6
04 1
05 NEWMAT
06 LSTO &quot;REGS&quot;
07 6
08 PI
09 X↑2
10 ÷
11 STO 02
12 CLST
13 CF 29
14▸LBL 10
15 &quot;HIGHEST: &quot;
16 ARCL 00
17 ├&quot;[LF]SAMP SZ: &quot;
18 ARCL 01
19 AVIEW
20 CLMENU
21 &quot;HIGH&quot;
22 KEY 1 GTO 21
23 &quot;SAMP&quot;
24 KEY 2 GTO 22
25 KEY 9 GTO 12
26 RCL 00
27 100
28 X&gt;Y?
29 GTO 11
30 RCL 01
31 1ᴇ3
32 X&gt;Y?
33 GTO 11
34 &quot;GO→&quot;
35 KEY 6 GTO 30
36▸LBL 11
37 MENU
38 STOP
39 GTO 10
40▸LBL 12
41 EXITALL
42 RTN
43▸LBL 21
44 ABS
45 IP
46 STO 00
47 GTO 10
48▸LBL 22
49 ABS
50 IP
51 STO 01
52 GTO 10&lt;/pre&gt;

&lt;p&gt;No doubt you&#39;ll notice that the &quot;GO→&quot; menu entry is only displayed if the highest random number to use \(n\geqslant 100\) and if the sample size is at least 1000. But if it&#39;s there and you hit it, we go off to LBL 30 and start the run.&lt;/p&gt;

&lt;pre&gt;53▸LBL 30
54 RCL 01
55 STO 03
56 3
57 STO &quot;GrMod&quot;
58 CLLCD
59 -120
60 1
61 PIXEL&lt;/pre&gt;

&lt;p&gt;This initialises the counter for the number of iterations to perform, sets the display to the highest resolution of 400x240 and draws a horizontal line halfway down the screen. This line shows the level that we want the proportion \(p\) to converge on during the course of the test run.&lt;/p&gt;

&lt;p&gt;The main loop runs here:&lt;/p&gt;

&lt;pre&gt;62▸LBL 06
63 XEQ 04
64 XEQ 04
65 XEQ 01
66 1
67 X≠Y?
68 GTO 07
69 STO+ 04
70▸LBL 07
71 RCL 01
72 RCL- 03
73 1
74 +
75 STO ST Y
76 RCL 04
77 X&amp;lt;&amp;gt;Y
78 ÷
79 STO 05
80 RCL- 02
81 20
82 ×
83 120
84 ×
85 RCL+ ST L
86 X&amp;lt;0?
87 GTO 08
88 X&amp;lt;&amp;gt;Y
89 RCL÷ 01
90 400
91 ×
92 PIXEL
93▸LBL 08
94 DSE 03
95 GTO 06&lt;/pre&gt;

&lt;p&gt;The subroutine at LBL 04 just generates a random number from 1 to \(n\).&lt;/p&gt;

&lt;p&gt;The subroutine at LBL 01 computes the greatest common divisor of the numbers in X and Y using the Euclidean algorithm. If that number is \(1\) then we know that the two random numbers generated were coprime and we increment the number of coprime pairs found. We then compute the new \(p\), apply some scaling, plot the point on the graph and go back for the next iteration.&lt;/p&gt;

&lt;p&gt;When everything is finished, we compute \(\pi\) from the proportion \(p\) that we have and then calculate the error between that and the real value of \(\pi\) as a percentage. Our \(\pi\) computed from \(p\) is left in Y and the error percentage in X.&lt;/p&gt;

&lt;pre&gt;96 RCL 05
97 1/X
98 6
99 ×
100 SQRT
101 PI
102 RCL- ST Y
103 RCL÷ ST L
104 ABS
105 100
106 ×
107 FIX 04
108 GTO 12&lt;/pre&gt;

&lt;p&gt;This is the subroutine that calculates the gcd of X and Y:&lt;/p&gt;

&lt;pre&gt;109▸LBL 01
110 X&gt;Y?
111 X&amp;lt;&gt;Y
112▸LBL 02
113 MOD
114 X=0?
115 GTO 03
116 LASTX
117 X&amp;lt;&amp;gt;Y
118 GTO 02
119▸LBL 03
120 LASTX
121 RTN&lt;/pre&gt;

&lt;p&gt;And finally, this generates the random number from 1 to \(n\):&lt;/p&gt;

&lt;pre&gt;122▸LBL 04
123 RAN
124 RCL× 00
125 IP
126 1
127 +
128 END&lt;/pre&gt;

&lt;p&gt;This graph was generated using 5000 pairs of random numbers from 1 to 1000:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://calcforumdata.s3-eu-west-1.amazonaws.com/sm/pi_2_1.png&quot; style=&quot;width: 400px; height: 240px; border: 1px solid black; padding: 0; margin: 0;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The computation gave me a value of \(π\approx 3.149704\), i.e. an error of 0.26%, roughly.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://calcforumdata.s3-eu-west-1.amazonaws.com/sm/pi_2_2.png&quot; style=&quot;width: 400px; height: 240px; border: 1px solid black; padding: 0; margin: 0;&quot; /&gt;&lt;/p&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/2218122679483992629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/2218122679483992629'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2020/09/using-random-numbers-to-compute-value-of.html' title='Using random numbers to compute the value of π'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-4385525999195558561</id><published>2019-03-03T17:09:00.000+00:00</published><updated>2019-03-03T17:21:20.708+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="camera"/><category scheme="http://www.blogger.com/atom/ns#" term="Canon"/><category scheme="http://www.blogger.com/atom/ns#" term="digital"/><category scheme="http://www.blogger.com/atom/ns#" term="DSLR"/><category scheme="http://www.blogger.com/atom/ns#" term="EOS"/><category scheme="http://www.blogger.com/atom/ns#" term="EOS 800D"/><category scheme="http://www.blogger.com/atom/ns#" term="photography"/><title type='text'>Plenty of fun to come!</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEims0DYvNOTC9n6iyX0KpV2NgoFFLdcl1q30q8s1SJMQ7sPdEB_3WedGVkG5GZD7GjThQt_8-ipTC1jypsJSbSCpGwCHkl2-o-c13EoQ-7pXKQc6TzXHGKvzixzTBm2Jg22_6fADy4wE_g8/s1600/IMG_20190303_155530.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEims0DYvNOTC9n6iyX0KpV2NgoFFLdcl1q30q8s1SJMQ7sPdEB_3WedGVkG5GZD7GjThQt_8-ipTC1jypsJSbSCpGwCHkl2-o-c13EoQ-7pXKQc6TzXHGKvzixzTBm2Jg22_6fADy4wE_g8/s200/IMG_20190303_155530.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4NLp5svcNuy_NsqYhyoPYukcrV8Cuq2K3gdHd0cqeco5nqMN5GXmkOOMyyYGm8l865-xP2xMAesgfSm917m3xDjK_-ysesWzt8WeANJl8OAUMbZUD9YP6wPZvWg4ff1OIZL16AVLW-elg/s1600/IMG_20190303_155610.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4NLp5svcNuy_NsqYhyoPYukcrV8Cuq2K3gdHd0cqeco5nqMN5GXmkOOMyyYGm8l865-xP2xMAesgfSm917m3xDjK_-ysesWzt8WeANJl8OAUMbZUD9YP6wPZvWg4ff1OIZL16AVLW-elg/s200/IMG_20190303_155610.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYSULRnR9gOB2avThOPPMINdwNQ4mPP1mi6OqMkzJyxqkAvF7bkjVFTpLGVDH2nRdjTe6ASiRUWRXd8K7LY0Wed5QemUC61aHU2Oq0KYjtDZcg_QxdHLU64aq_rV-mAKnbeDRy4feOSqtJ/s1600/IMG_20190303_155630.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYSULRnR9gOB2avThOPPMINdwNQ4mPP1mi6OqMkzJyxqkAvF7bkjVFTpLGVDH2nRdjTe6ASiRUWRXd8K7LY0Wed5QemUC61aHU2Oq0KYjtDZcg_QxdHLU64aq_rV-mAKnbeDRy4feOSqtJ/s200/IMG_20190303_155630.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSui5VyBvcKE9F0W08rolhlD-ZUANY7sMJAZu95-E8EatD_BIWPCNd5vX8ELjbJBBuz_jLoVfgCCXR4eZ7OGqxvsPrJFg-BV4YsuiM1AXkP8DgdHeEIE0RAIG6vh_bRs3sMqRpGMckrow4/s1600/IMG_20190303_155640.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSui5VyBvcKE9F0W08rolhlD-ZUANY7sMJAZu95-E8EatD_BIWPCNd5vX8ELjbJBBuz_jLoVfgCCXR4eZ7OGqxvsPrJFg-BV4YsuiM1AXkP8DgdHeEIE0RAIG6vh_bRs3sMqRpGMckrow4/s200/IMG_20190303_155640.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Am I a good photographer? Am I heck! But I do want to learn, and think the only way to learn techniques that are equally valid both in digital photography and in traditional 35mm film photography is to use a reflex camera with interchangeable lenses. A compact job won&#39;t cut it. A camera phone? Forget it!&lt;br /&gt;
&lt;br /&gt;
So, bit of a mid-life crisis :) I splurged out some of my savings on a Canon EOS 800D back that came with an 18-55mm zoom lens. I also bought a couple of different lenses to use with it.&lt;br /&gt;
&lt;br /&gt;
The 800D is not a professional camera. It&#39;s amateur but high-end amateur. I didn&#39;t want to spend huge amounts of money on something that will only be a passing fad, but then again I wanted to put enough into it to give me the best chance of seeing good results and being able to monitor progress.&lt;br /&gt;
&lt;br /&gt;
The sensor is not a full-frame sensor, it&#39;s an APS-C sensor but the results are still pretty good. The lens that came with the camera in a kit is an &quot;EF-S 18-55m f/4-5.6 IS STM&quot; zoom lens. As it&#39;s an &quot;EF-S&quot; lens, it can only be mounted on cameras that have an APS-C format sensor. Focussing is achieved with a stepping motor that&#39;s very quiet and there&#39;s also a built-in image stabiliser, although I don&#39;t tend to use that because I already have pretty steady hand and it sucks up battery power.&lt;br /&gt;
&lt;br /&gt;
The other lenses that I bought are a fixed focal length &quot;EF 50mm f/1.8 STM&quot; (great for giving bokeh with its shallow depth of field) and an entry-level &quot;EF 75-300mm f/4-5.6 III&quot; telephoto zoom lens. Both of these lenses have the &quot;EF&quot; mount and can therefore be used on a full-frame camera should I end up buying one later on.&lt;br /&gt;
&lt;br /&gt;
It&#39;s early March in the North-West of the UK. This means that the weather is, err... &quot;not conducive to going out to snap some photos&quot; is probably the more polite way of putting it. If/when things do improve I&#39;ll no doubt be out there. I know that there can be some stunning sunrises to be seen when I&#39;m going over the West Pennine Moors on the way to work in the morning, so I might end up taking the camera to work for a while.&lt;br /&gt;
&lt;br /&gt;
In the meantime, here are a couple of tests that I did with the 75-300mm lens that is definitely a &quot;starter&quot; lens, not something professional, but which gave me some results that did impress me.&lt;br /&gt;
&lt;br /&gt;
Firstly there&#39;s this narcissus(?), i.e. a flower about 1&quot; in diameter, growing outside about 10 feet from the window. This wasn&#39;t the full frame, I did crop the image on the flower.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSjnRTIV7h1lNo1m8bTVz_A4Z7wik4rB1oKojQmyd3kGVgoBEaF63_86UFrZ6e2lHOuG0E_ewIn9uxG1X9J3821qhq6kyjVg3NJjzhVUrCPNYA5qfvxkjsSs7G5_uEFzx2G37l9NYkhu7J/s1600/narcissus.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;400&quot; data-original-width=&quot;600&quot; height=&quot;266&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSjnRTIV7h1lNo1m8bTVz_A4Z7wik4rB1oKojQmyd3kGVgoBEaF63_86UFrZ6e2lHOuG0E_ewIn9uxG1X9J3821qhq6kyjVg3NJjzhVUrCPNYA5qfvxkjsSs7G5_uEFzx2G37l9NYkhu7J/s400/narcissus.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Then there&#39;s this partial shot of Tony that I took from about 6 feet from him. He hasn&#39;t had a shave in a few days and it shows!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOCPayt729Y2ctQrCHXEYWT2Fc-55oxl3vRmyTaIFaa8SgQVw_wGow8H5or70saSG7g7hKPmb0XrKH5edJa2O-XKps6TzQ1vtQLMpXMZdzWtLOcsofaShRPh8ciAHZ0C11sstFTUcvncwa/s1600/stubble.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;400&quot; data-original-width=&quot;600&quot; height=&quot;266&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOCPayt729Y2ctQrCHXEYWT2Fc-55oxl3vRmyTaIFaa8SgQVw_wGow8H5or70saSG7g7hKPmb0XrKH5edJa2O-XKps6TzQ1vtQLMpXMZdzWtLOcsofaShRPh8ciAHZ0C11sstFTUcvncwa/s400/stubble.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Sadly I&#39;ve not yet had a chance to take the camera outside and do what you&#39;re supposed to do with a telephoto lens: shoot stuff at a distance.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/4385525999195558561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/4385525999195558561'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2019/03/plenty-of-fun-to-come.html' title='Plenty of fun to come!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEims0DYvNOTC9n6iyX0KpV2NgoFFLdcl1q30q8s1SJMQ7sPdEB_3WedGVkG5GZD7GjThQt_8-ipTC1jypsJSbSCpGwCHkl2-o-c13EoQ-7pXKQc6TzXHGKvzixzTBm2Jg22_6fADy4wE_g8/s72-c/IMG_20190303_155530.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-2755954832614050647</id><published>2018-12-31T17:51:00.001+00:00</published><updated>2018-12-31T20:20:23.822+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="alpha"/><category scheme="http://www.blogger.com/atom/ns#" term="DM42"/><category scheme="http://www.blogger.com/atom/ns#" term="Hewlett Packard"/><category scheme="http://www.blogger.com/atom/ns#" term="HP-41C"/><category scheme="http://www.blogger.com/atom/ns#" term="HP-42S"/><category scheme="http://www.blogger.com/atom/ns#" term="stack"/><title type='text'>Alpha stack on the HP-41C and HP-42S</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
A while back, another member of the MoHPC forum mentioned a program he&#39;d written for the HP-41C that allows the user to manage multiple alpha registers. I responded saying that I had written something similar many moons ago that behaved like a LIFO (last-in-first-out) stack rather than an indexed array of datasets and said that I&#39;d look it up.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I have no idea whatsoever what I did with my little utility so I decided to rewrite it, purely and simply. So here it is.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
NB: This program creates and manages a data file in Extended Memory called &quot;ASTACK&quot;. If you already have a file of that name, it will be deleted! Note also that running these programs uses Flag 01 and trashes registers R07-R10. Finally, since this uses Extended Memory, you will need to run this on a 41CX or SwissMicros DM41, or on a 41C or 41CV with the &quot;X-Function&quot; module.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The size of the data file created in Extended Memory depends on the depth of the alpha stack that you want to create. Two registers are needed for a header in the file and four registers per stack level are needed. So, if you want a stack that&#39;s 6 levels deep, for example, then you&#39;ll need room in your Extended Memory for a file that&#39;s 2+6*4= 26 registers in size. You&#39;ll actually need 28 registers free because the calculator also steals 2 registers for its own internal housekeeping when you create a file in X-Mem.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The three utilities provided are &quot;ASINIT&quot;, &quot;APUSH&quot; and &quot;APOP&quot;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;tt&gt;ASINIT&lt;/tt&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Run this with the depth of the desired stack in X, The &#39;41&#39;s own error detection will prevent you from creating a file that&#39;s too big or from running this on a machine with no &quot;X-Function&quot; module installed (remember, the 41CX and the DM41 have this module baked into their ROM).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;tt&gt;APUSH&lt;/tt&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This will save the current contents of your alpha register onto the alpha stack and return 0 in X, unless the stack is already full, in which case you&#39;ll get -3 back instead. If the alpha stack hasn&#39;t been initialized (by running &lt;tt&gt;ASINIT&lt;/tt&gt;) then you&#39;ll get -1 back in X.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;tt&gt;APOP&lt;/tt&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This takes the string on the top of the alpha stack and transfers it into the &#39;41&#39;s alpha register, removing it from the stack. If all went well, X will contain 0 after returning from this program. If the alpha stack has not yet been initialized then you&#39;ll get -1 back, or if the stack was already empty (everything already popped off it) when you called &lt;tt&gt;APOP&lt;/tt&gt; then you&#39;ll get -2 back.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
You can go and grab these utilities here: &lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/hp/alpha-stack.zip&quot;&gt;alpha-stack.zip&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Software provided, as usual, as a text listing, a .raw file and a PDF with bar codes.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Edit: I wrote something similar for HP-42S/DM42. This machine has no Extended Memory but can store register data into a matrix. That&#39;s exactly what we do with this version.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Grab the listing here: &lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/hp/astack.txt&quot;&gt;astack.txt&lt;/a&gt; and the .raw file for DM42/Free42 here: &lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/hp/astack.raw&quot;&gt;astack.raw&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Listing reproduced here:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;pre&gt;00 { 196-Byte Prgm }
01▸LBL &quot;ASINIT&quot;
02 ABS
03 IP
04 STO ST Y
05 8
06 ×
07 2
08 +
09 1
10 NEWMAT
11 STO &quot;ASTACK&quot;
12 CLX
13 R↓
14 INDEX &quot;ASTACK&quot;
15 STOEL
16 RTN
17▸LBL 10
18 CLX
19 SF 25
20 INDEX &quot;ASTACK&quot;
21 FC?C 25
22 -1
23 RTN
24▸LBL &quot;APOP&quot;
25 XEQ 10
26 X≠0?
27 RTN
28 RCLEL
29 I+
30 RCLEL
31 X≠0?
32 GTO 01
33 -2
34 RTN
35▸LBL 01
36 8
37 ×
38 5
39 -
40 1
41 STOIJ
42 CLA
43 8
44▸LBL 11
45 RCLEL
46 I+
47 ARCL ST X
48 R↓
49 DSE ST X
50 GTO 11
51 FS?C 01
52 GTO 04
53 2
54 1
55 STOIJ
56 RCLEL
57 1
58 -
59 STOEL
60▸LBL 04
61 CLST
62 RTN
63▸LBL &quot;APUSH&quot;
64 XEQ 10
65 X≠0?
66 RTN
67 RCLEL
68 I+
69 RCLEL
70 X=Y?
71 GTO 02
72 1
73 +
74 STOEL
75 8
76 ×
77 5
78 -
79 1
80 STOIJ
81 8
82 R↑
83▸LBL 09
84 ASTO ST X
85 STOEL
86 I+
87 ASHF
88 DSE ST Y
89 GTO 09
90 SF 01
91 GTO &quot;APOP&quot;
92 END&lt;/pre&gt;
&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/2755954832614050647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/2755954832614050647'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2018/12/alpha-stack-on-hp-41c.html' title='Alpha stack on the HP-41C and HP-42S'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-4724095842671894884</id><published>2018-12-31T10:04:00.000+00:00</published><updated>2018-12-31T11:33:07.967+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="algorithm"/><category scheme="http://www.blogger.com/atom/ns#" term="Hewlett Packard"/><category scheme="http://www.blogger.com/atom/ns#" term="HP-71"/><category scheme="http://www.blogger.com/atom/ns#" term="logic"/><category scheme="http://www.blogger.com/atom/ns#" term="queens"/><title type='text'>The &quot;N Queens&quot; problem</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
The &quot;N Queens&quot; problem is a puzzle where you take an &lt;i&gt;NxN&lt;/i&gt; chequers or chess board (it&#39;s usually 8x8 but this works for the general case) on which you have to place N queens in such a way that none of them threaten or are threatened by any of the others.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Reminder: in the game of chess, a queen can move as many squares as she likes horizontally, vertically or diagonally but cannot jump over any of the other pieces on the board like a knight. This means that any piece in her direct line of sight on the same line, in the same column or on a diagonal to her is fair game.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
With this in mind, it is clear that there is only one solution to the problem on a 1x1 board, i.e. a single square (you just plonk a queen on it and you&#39;re done), and that there is no way to organise two queens on a 2x2 board or three queens on a 3x3 board without them threatening each other. For a 4x4 or greater board, there is more than one solution.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I thought I&#39;d have a go at solving the general case on an HP-71B and the program listed in its entirety below does just that. There&#39;s also a brief video of the 71B in action finding all the solutions to the problem for a 5x5 board in just over 30 seconds.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Here is a line-by-line explanation of the algorithm:&lt;/div&gt;
&lt;pre&gt;10 DESTROY ALL @ DELAY 0&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Clear up any variables currently in memory and tell the 71B not to waste time pausing after displaying something on screen. This is going to be slow enough as it is :)&lt;/div&gt;
&lt;pre&gt;20 OPTION BASE 1 @ STD&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I want the elements in the array that I&#39;m creating later to be numbered from 1 onwards rather than 0, and we need integers to be displayed with no decimals or we&#39;re going to get a string overflow (and something far too long to display on screen) in line 200.&lt;/div&gt;
&lt;pre&gt;30 INTEGER R,C,S,T,F,N,K
40 REAL W&lt;/pre&gt;
OK, let&#39;s set up a few variables.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
R and C are going to represent the row and column of the square on the board where I want to see if I can place a queen.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
S is the size of the board.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
T will be used as a counter while I&#39;m seeing if a queen that I place on the board is being threatened by one placed earlier on a row with a lower number.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
F is the running count of solutions found so far.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
N is the number of nodes of the puzzle examined so far. Each time a queen is tentatively placed on the board, this is a puzzle node.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
K will be used as a counter while building the string representing the solution that was found.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
W, the only real variable used here, holds the time of day when the run was started for most of the life cycle of this program. At the end it is replaced by the time, in seconds, that it took to find all the solutions to the puzzle.&lt;/div&gt;
&lt;pre&gt;50 INPUT &quot;Board size 1-9: &quot;;S
60 IF S&amp;gt;9 OR S&amp;lt;1 THEN 50&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Ask the user what size board to work with. Anything below 1 makes no sense and anything above 9 will just take far too long to solve. It already takes about 50 minutes to solve for an 8x8 board...&lt;/div&gt;
&lt;pre&gt;70 INTEGER B(S) @ DISP &quot;Working...&quot;
80 R=0 @ F=0 @ N=0 @ W=TIME&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We start by creating an array of integers B() with as many elements as there are rows on the board. This array will hold the number of the column where there is a queen on each row. We then display something on screen to let the user know that we&#39;ve started crunching numbers. Depending on the size of the board we&#39;re working with, it can take a while to find the first solution.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We then initialize the row counter and the running counts and we make a note of the time when we started.&lt;/div&gt;
&lt;pre&gt;90 R=R+1 @ IF R&amp;gt;S THEN 190
100 C=0&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This is the point in the algorithm where we move on to the next row. If we&#39;ve only just started then the &quot;next&quot; row is actually the &lt;u&gt;first&lt;/u&gt; row. Otherwise, we come here when we&#39;ve successfully placed a queen on the board and we want to try and place one on the next row.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
However, if we were already on the last row of the board and we try and count beyond that number, then it means that we just placed a queen on the last row, i.e. we found a solution! In this case we go off to line 190, where this situation is handled. If not, then we reset the column counter so that we can look at all of the squares in this row one after the other.&lt;/div&gt;
&lt;pre&gt;110 C=C+1 @ IF C&amp;gt;S THEN 170&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, we move on to the next column. If we&#39;ve only just started looking at the current row then this is the first column. Otherwise it means that we couldn&#39;t place a queen in the previous column or that we could, but we&#39;re looking for solutions that involve placing her on a different square in the same row.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
However, if there are no more columns, i.e. if we attempt to count beyond the size of the board, then it means that we need to backtrack a row and start looking for solutions with a queen in a different column of the previous row. This is handled in line 170.&lt;/div&gt;
&lt;pre&gt;120 T=0
130 N=N+1&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We&#39;re still on the board so now we need to see if a queen placed in the square identified by R and C is safe. We&#39;re going to use the variable T as a counter iterating through all the rows previous to R to see if a queen in any of those rows would threaten one here. We also increment the variable N to indicate that we&#39;ve found a new node to examine.&lt;/div&gt;
&lt;pre&gt;140 T=T+1 @ IF T&amp;gt;=R THEN 160&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We&#39;re going to look at the next row now, but if the next row happens to be &lt;i&gt;this&lt;/i&gt; row (R), then it means we&#39;ve found no threat coming from previous rows and a queen placed on the square that we&#39;re looking at right now is safe. This is handled in line 160.&lt;/div&gt;
&lt;pre&gt;150 IF B(T)=C OR ABS(B(T)-C)=R-T THEN 110 ELSE 140&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This is where we determine if the queen in row T is a threat to us in row R, column C.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Remember, the array B() holds the column numbers of the queens in each row. Thus, B(1) holds the column of the queen in row 1, B(2) that of the queen in row 2 etc. B(T) is the column of the queen in row T. If the queen in that row is in this column (if B(T)=C) then she would be a threat to us. Similarly, if she is removed from us by as many columns as rows (if the absolute value of B(T)-C is the same as R-T) then that queen is on the same diagonal as us and would be a threat. In either case, we can&#39;t place a queen on this square, so we go back to line 110 where we look at the next column.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
If, however, the queen in line T would not be a threat to us then we can look at the next line by jumping back to line 140.&lt;/div&gt;
&lt;pre&gt;160 B(R)=C @ GOTO 90&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
If we make it here then it means that we can place a queen on row R, column C. How do we do this? By setting the relevant element of the B() array, B(R), to the column where we&#39;re placing the queen. We then go back to line 90 so that we can move on to the next row.&lt;/div&gt;
&lt;pre&gt;170 R=R-1 @ IF R=0 THEN 230
180 C=B(R) @ GOTO 110&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We came here from line 110 when we tried to look at a column beyond the last one in the current row. This meant that we couldn&#39;t place a queen anywhere (else) in this row, so we have to backtrack a row and continue the search. So we start by decrementing the current row counter.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
However, if we were on the first row anyway and we can&#39;t place a queen in that row now, then we have reached the end of the puzzle. There are no more solutions possible! This is handled in line 230.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
If we were able to backtrack, then we set the column counter C to the column of the queen in this earlier row and we go back to line 110 so that we can look at solutions with a queen in the next column.&lt;/div&gt;
&lt;pre&gt;190 F=F+1
200 F$ = &quot;Found &quot; @ FOR K=1 TO S @ F$ = F$ &amp;amp; STR$(B(K)) @ NEXT K
210 F$ = F$ &amp;amp; &quot; (&quot; &amp;amp; STR$(F) &amp;amp; &quot;)&quot; @ DISP F$&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We wind up here if we found a solution.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, we start by incrementing the running count of solutions found. Lines 200 and 210 construct and display a string indicating the solution just found and the number of solutions found so far. It ends up looking something like:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;tt&gt;Found 53142 (10)&lt;/tt&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The five digits after &quot;Found&quot; indicate that this was a 5x5 puzzle and that the tenth solution found (indicated by &quot;(10)&quot; at the end of the line) was to place a queen in each of columns 5, 3, 1, 4 and 2 of rows 1 to 5 respectively.&lt;/div&gt;
&lt;pre&gt;220 R=R-1 @ GOTO 110&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Remember, we got here by incrementing R beyond the total number of rows in the puzzle (see line 90)? Before we go back into the puzzle to look at the next column of the last row, we need to decrement the row again to bring it back within the bounds of the problem. We then go back to line 110.&lt;/div&gt;
&lt;pre&gt;230 W=TIME-W @ IF W&amp;lt;0 THEN W=W+86400&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This is the end of the puzzle!&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We find out how long it took to crunch through all of the possible solutions by subtracting the time of day now from the time of day when we started in line 80. There is, however, one pitfall to this. &lt;tt&gt;TIME&lt;/tt&gt; is a function that reads the clock to give you the time of day in the form of the number of seconds elapsed since midnight, to the nearest 100th of a second. This value can therefore be anything from 0.00 (dead on midnight) to 86399.99 (0.01 second before midnight). Reminder: disregarding leap seconds, there are 60x60x24=86400 seconds in a day.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
What happens if you&#39;re like me and you sometimes leave a test to run its course overnight after you&#39;ve gone to bed, resulting in the test starting before midnight and ending &lt;i&gt;after&lt;/i&gt; midnight?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Say the test starts at 11:50pm and finishes at 12:10am. 11:50pm is 10 minutes (600 seconds) to midnight, so &lt;tt&gt;TIME&lt;/tt&gt; will return 86400-600=85800. Come 12:10am and the end of the test, &lt;tt&gt;TIME&lt;/tt&gt; will return 600, so &lt;tt&gt;TIME-W&lt;/tt&gt; will be 600-85800=-85200. Congratulations on the negative test duration. You were able to complete the test 23h and 40 minutes before you started...&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The HP-71B is a great machine, granted, but it hasn&#39;t quite mastered time travel yet. If the duration computed is negative then we compensate for the date flipping over by adding the number of seconds in a day to the result we found. -85200+86400=1200, which looks more like the 20 minutes expected.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;pre&gt;240 DISP &quot;SOLUT:&quot; &amp;amp; STR$(F) &amp;amp; &quot;, NODES:&quot; &amp;amp; STR$(N)&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We construct and display the string indicating how many solutions were found and how many nodes were examined to find them.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The short video below shows all of this in action, and the complete listing is provided below that.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/qwHqpvDpzZM/0.jpg&quot; frameborder=&quot;0&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/qwHqpvDpzZM?feature=player_embedded&quot; width=&quot;320&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As shown at the end of the video, the variable W contains the time in seconds taken to complete the puzzle, F is the number of solutions found, N is the number of nodes examined and F$ indicates the last solution found.
&lt;/div&gt;
&lt;pre&gt;10 DESTROY ALL @ DELAY 0
20 OPTION BASE 1 @ STD
30 INTEGER R,C,S,T,F,N,K
40 REAL W
50 INPUT &quot;Board size 1-9: &quot;;S
60 IF S&amp;gt;9 OR S&amp;lt;1 THEN 50
70 INTEGER B(S) @ DISP &quot;Working...&quot;
80 R=0 @ F=0 @ N=0 @ W=TIME
90 R=R+1 @ IF R&amp;gt;S THEN 190
100 C=0
110 C=C+1 @ IF C&amp;gt;S THEN 170
120 T=0
130 N=N+1
140 T=T+1 @ IF T&amp;gt;=R THEN 160
150 IF B(T)=C OR ABS(B(T)-C)=R-T THEN 110 ELSE 140
160 B(R)=C @ GOTO 90
170 R=R-1 @ IF R=0 THEN 230
180 C=B(R) @ GOTO 110
190 F=F+1
200 F$ = &quot;Found &quot; @ FOR K=1 TO S @ F$ = F$ &amp;amp; STR$(B(K)) @ NEXT K
210 F$ = F$ &amp;amp; &quot; (&quot; &amp;amp; STR$(F) &amp;amp; &quot;)&quot; @ DISP F$
220 R=R-1 @ GOTO 110
230 W=TIME-W @ IF W&amp;lt;0 THEN W=W+86400
240 DISP &quot;SOLUT:&quot; &amp;amp; STR$(F) &amp;amp; &quot;, NODES:&quot; &amp;amp; STR$(N)&lt;/pre&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/4724095842671894884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/4724095842671894884'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2018/12/the-n-queens-problem.html' title='The &quot;N Queens&quot; problem'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/qwHqpvDpzZM/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-7226873850653394769</id><published>2018-12-29T18:47:00.000+00:00</published><updated>2018-12-30T09:36:38.644+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="BASIC"/><category scheme="http://www.blogger.com/atom/ns#" term="Hewlett Packard"/><category scheme="http://www.blogger.com/atom/ns#" term="HP-41C"/><category scheme="http://www.blogger.com/atom/ns#" term="HP-71"/><category scheme="http://www.blogger.com/atom/ns#" term="method"/><category scheme="http://www.blogger.com/atom/ns#" term="newton"/><category scheme="http://www.blogger.com/atom/ns#" term="Numerical"/><category scheme="http://www.blogger.com/atom/ns#" term="Raphson"/><category scheme="http://www.blogger.com/atom/ns#" term="RPN"/><category scheme="http://www.blogger.com/atom/ns#" term="solver"/><title type='text'>Numerical solver - Newton-Raphson method</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;   MathJax.Hub.Config({tex2jax: {inlineMath: [[&#39;$&#39;,&#39;$&#39;], [&#39;\\(&#39;,&#39;\\)&#39;]]}}); &lt;/script&gt; &lt;script src=&quot;http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML&quot; type=&quot;text/javascript&quot;&gt; &lt;/script&gt;
The program downloadable from this page is a numerical solver. It attempts to find the zeroes of a function $f(x)$, i.e. it attempts to find $x$ such that $f(x)=0$&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
There are several methods for this. One that requires little computing power is Newton&#39;s Method, or the Newton-Raphson method, a description of which can be &lt;a href=&quot;https://en.wikipedia.org/wiki/Newton%27s_method&quot; target=&quot;_blank&quot;&gt;found on Wikipedia&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We have no way of knowing the exact value of $f&#39;(x)$ on the HP-41CX used here because that machine has no symbolic math capabilities, so we calculate an approximation of $f&#39;(x)$ by taking a small value $\epsilon$ and calculating:&lt;/div&gt;
\[ f&#39;(x) \approx \frac {f(x+\epsilon)-f(x)} \epsilon \]&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This then allows us to calculate the next value of $x$ to use and display so that we see the calculator homing in on the zero that we&#39;re looking for:&lt;/div&gt;
\[ x_{n+1} = x_n - \frac {f(x_n)} {f&#39;(x_n)} \]&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Once we find a value of $x$ such that $|f(x)| \lt \epsilon$, we stop and that value of $x$ is deemed to be a zero of $f(x)$.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The same $\epsilon $ is used here as the small value added to $x$ to calculate $f&#39;(x)$ and as the threshold below which we deem $f(x)$ to be zero. It is calculated according to the display precision of the HP-41CX. The calculator&#39;s flags 36-39 are examined to ascertain how many significant figures are displayed and we retrieve the digit after the last used FIX, SCI or ENG command. E.g., if the calculator is in FIX 4 mode then we get a 4 back. Let&#39;s call this number $p$ for precision.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We then calculate $\epsilon = 10^{-p} $, so the higher the display precision, the greater precision we seek from the algorithm. Similarly, if less precision is required for the display then less precision is demanded from the algorithm and it can complete after fewer iterations.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It may well be that the algorithm is unable to converge on a zero because of the nature of the function studied. It could be constant or it could send the algorithm off on a wild goose chase. There&#39;s some discussion of such cases on the Wikipedia page linked to above.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Finally, the link to download this HP-41 program is here: &lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/hp/newton-raphson.zip&quot;&gt;newton-raphson.zip&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It is provided in text listing format, a .raw file and a printable PDF with wand bar codes.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Here is a video of a HP-41CX finding various zeros of the function:&lt;/div&gt;
\[ f(x) = x^3-2x^2-11x+12 = (x+3)(x-1)(x-4) \]&lt;br /&gt;
The three zeroes are therefore $x=-3, x=1$ and $x=4$.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/FfNrEvT0IaU/0.jpg&quot; frameborder=&quot;0&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/FfNrEvT0IaU?feature=player_embedded&quot; width=&quot;320&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
And here is the equivalent in BASIC for HP-71:&lt;br /&gt;
&lt;pre style=&quot;text-align: left;&quot;&gt;10 DESTROY ALL @ DELAY 0
20 REAL X,Y,Y1,E @ INTEGER P,M
30 P=FLAG(-17)+2*FLAG(-18)+4*FLAG(-19)+8*FLAG(-20) @ E=10^(-P) @ M=2*P+8
40 INPUT &quot;GUESS? &quot;;X
50 Y=FNF(X) @ IF ABS(Y)&amp;lt;E THEN 120
60 &quot;X=&quot; &amp;amp; STR$(X)
70 Y1=(FNF(E+X)-FNF(X))/E
80 IF Y1=0 THEN &quot;CONSTANT?&quot; @ END
90 X=X-Y/Y1
100 IF M&amp;gt;0 THEN M=M-1 @ GOTO 50
110 &quot;NO CONVERGENCE&quot; @ END
120 &quot;ZERO: &quot; &amp;amp; STR$(X) @ END
130 DEF FNF(X) = (X+3)*(X-1)*(X-4)&lt;/pre&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
After running, the variable X contains the zero found and Y is the value of $f(x)$ calculated for that value of $x$ - this gives you the error, the absolute value of which should be lower than our $\epsilon $, which is stored in the variable E.&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7226873850653394769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7226873850653394769'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2018/12/numerical-solver-newton-raphson-method.html' title='Numerical solver - Newton-Raphson method'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/FfNrEvT0IaU/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-2691726203199006640</id><published>2018-12-27T15:26:00.000+00:00</published><updated>2018-12-27T15:36:52.810+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Casio"/><category scheme="http://www.blogger.com/atom/ns#" term="DM41"/><category scheme="http://www.blogger.com/atom/ns#" term="Hewlett Packard"/><category scheme="http://www.blogger.com/atom/ns#" term="HP-41C"/><category scheme="http://www.blogger.com/atom/ns#" term="Integration"/><category scheme="http://www.blogger.com/atom/ns#" term="Numerical"/><category scheme="http://www.blogger.com/atom/ns#" term="PB-410F"/><category scheme="http://www.blogger.com/atom/ns#" term="PC-1360"/><category scheme="http://www.blogger.com/atom/ns#" term="Sharp"/><category scheme="http://www.blogger.com/atom/ns#" term="Simpson"/><category scheme="http://www.blogger.com/atom/ns#" term="Swiss Micros"/><title type='text'>Numerical Integration - Simpson&#39;s Rule</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;   MathJax.Hub.Config({tex2jax: {inlineMath: [[&#39;$&#39;,&#39;$&#39;], [&#39;\\(&#39;,&#39;\\)&#39;]]}}); &lt;/script&gt; &lt;script src=&quot;http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML&quot; type=&quot;text/javascript&quot;&gt; &lt;/script&gt;
Numerical integration is an operation that many older machines are not able to perform without add-on libraries (e.g. Math Pac for HP-41C) or without writing a program from scratch to do it. There are, of course, some exceptions to this; Hewlett Packard&#39;s HP-15C and HP-42S come straight to mind, as does the Casio fx-180P, for example, but these machines are actually the exception, not the rule.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
There are many methods used to calculate definite integrals, that is integrals between known boundaries yielding a numerical result. One method that is a good trade-off between precision and complexity of application is &lt;a href=&quot;https://en.wikipedia.org/wiki/Simpson%27s_rule&quot; target=&quot;_blank&quot;&gt;Simpson&#39;s Rule&lt;/a&gt;, which attempts to find a quadratic of the form $a\cdot x^2+b\cdot x+c$ that fits or is close to our function. Finding the integral of this polynomial is very easy:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
\[ \int_{x_1}^{x_2} \! (a\cdot x^2 + b\cdot x + c) \, \partial x = \frac a 3 (x_2^3-x_1^3) + \frac b 2 (x_2^2-x_1^2) + c\cdot (x_2 - x_1) \]&lt;/div&gt;
Basically, Simpson&#39;s Rule states:&lt;br /&gt;
\[ \int_a^{a+2h} \! f(x) \, \partial{x} \approx \frac{h}{3}(f(a)+4\cdot f(a+h)+f(a+2h)) \]&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, what does this mean? If we sample the function at the lower and upper boundaries and once more in the middle, we can get an approximation of the integral of the function by just adding the y-coordinates of the sample points and applying a few coefficients. Easy.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As with any approximation method that involves sampling, we can make this even more accurate by increasing the number of samples if we divide the region that we want to integrate into multiple smaller regions that we sample individually. This is thanks to (assuming a&amp;lt;c&amp;lt;b)&lt;span style=&quot;background-color: white; color: black; display: inline; float: none; font-family: &amp;quot;times new roman&amp;quot;; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; text-align: justify; text-decoration: none; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
\[ \int_a^b \! f(x) \, \partial x = \int_a^c \! f(x) \, \partial x + \int_c^b \! f(x) \, \partial x \]&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I wrote something for a few vintage machines that shows this method in action. The video below shows a Sharp PC-1360 and a Casio PB-410F running programs written in BASIC, followed by a SwissMicros DM41L and a Hewlett Packard HP-41CX running a similar program in RPN keystroke. You can get the listing for HP-/DM41 along with a .raw file and printable bar codes for use with a bar code wand here: &lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/hp/simpson.zip&quot;&gt;simpson.zip&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/Z_Jgw-7Zi0c/0.jpg&quot; frameborder=&quot;0&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/Z_Jgw-7Zi0c?feature=player_embedded&quot; width=&quot;320&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
In this example, I&#39;m getting all four machines to calculate:&lt;br /&gt;
\[ \int_0^1 \! (x^4-3x^3+x^2+1) \, \partial x \]&lt;br /&gt;
The exact answer to this is $ \frac{47}{60} \approx 0.7833333 $&lt;br /&gt;
&lt;br /&gt;
In all examples I&#39;m using 4 as the number of steps/divisions to use, which actually equates to $2^4=16$, i.e. I broke the [0;1] interval down into 16 smaller intervals (hence the progress counting up in increments of $\frac 1 {16} $= 6.25%).&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/2691726203199006640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/2691726203199006640'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2018/12/numerical-integration-simpsons-rule.html' title='Numerical Integration - Simpson&#39;s Rule'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/Z_Jgw-7Zi0c/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-7622480076924720747</id><published>2018-12-26T12:10:00.000+00:00</published><updated>2018-12-26T12:13:30.522+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Casio"/><category scheme="http://www.blogger.com/atom/ns#" term="Hewlett Packard"/><category scheme="http://www.blogger.com/atom/ns#" term="HP10s+"/><title type='text'>Is it really a Hewlett Packard?</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
There are two scientific calculators recently produced that, I&#39;m afraid, fall into the cheap, plasticky category. They are the HP300s+ and the HP10s+.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The question is, are they really Hewlett Packard machines at all?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
They are not. They are in fact Casios that have been rebadged to look like HP machines.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Want proof? Watch this video with the HP10s+ showing its real colours. If you press the MODE key four times you get to the menu where you can alter display settings. There is an undocumented function in this menu where, if you press &#39;2&#39;, you get to the contrast setting. This is not mentioned in the manual and, indeed, it has no effect, but look at what you get on screen when you press &#39;2&#39;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
One good thing about this little machine is that I didn&#39;t even have to put a battery in it. The solar panel above the screen provides enough power to run the calculator as long as there&#39;s enough light around.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/4jkpjEpkyDc/0.jpg&quot; frameborder=&quot;0&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/4jkpjEpkyDc?feature=player_embedded&quot; width=&quot;320&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7622480076924720747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7622480076924720747'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2018/12/is-it-really-hewlett-packard.html' title='Is it really a Hewlett Packard?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/4jkpjEpkyDc/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-1536759413810936717</id><published>2018-12-25T21:36:00.000+00:00</published><updated>2018-12-25T21:49:34.415+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="benchmark"/><category scheme="http://www.blogger.com/atom/ns#" term="G2"/><category scheme="http://www.blogger.com/atom/ns#" term="Hewlett Packard"/><category scheme="http://www.blogger.com/atom/ns#" term="Prime"/><title type='text'>HP Prime benchmark</title><content type='html'>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;   MathJax.Hub.Config({tex2jax: {inlineMath: [[&#39;$&#39;,&#39;$&#39;], [&#39;\\(&#39;,&#39;\\)&#39;]]}}); &lt;/script&gt; &lt;script src=&quot;http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML&quot; type=&quot;text/javascript&quot;&gt; &lt;/script&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGAOgHnx377HcJjqdyxaup-dwoD43-tSVO8DqzeMbqjgIllh9Wh9w51OaVuiRzoWYK9JCU-dXJyM6LaOElCAJSHIeCbE0CUZgK7z7riS3ikhr5SSvNbbByLgx7D8e6wTqZb1fPwpbqEPqU/s1600/HP_prime_front_picture.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;806&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGAOgHnx377HcJjqdyxaup-dwoD43-tSVO8DqzeMbqjgIllh9Wh9w51OaVuiRzoWYK9JCU-dXJyM6LaOElCAJSHIeCbE0CUZgK7z7riS3ikhr5SSvNbbByLgx7D8e6wTqZb1fPwpbqEPqU/s320/HP_prime_front_picture.png&quot; width=&quot;161&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Err, right. The HP Prime is hardly a vintage calculator given that it was first released in 2015. Better still, HP released the so-called Prime &quot;G2&quot; in August 2018 with faster hardware, much more RAM to work with and double the storage space in flash memory.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
When that happened, there was no excuse, I had to get one. At the time of writing, the Prime G2 would appear to be available only in Europe. The Americas have been left by the wayside this time around. I bought mine from &lt;a href=&quot;http://www.derekenwinkel.nl/&quot; target=&quot;_blank&quot;&gt;derekenwinkel.nl&lt;/a&gt; with whom I have no affiliation other than being a happy customer of theirs.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As it became known that there was an updated version of the Prime, people in the &lt;a href=&quot;http://www.hpmuseum.org/forum/&quot; target=&quot;_blank&quot;&gt;Museum of HP Calculators Forum&lt;/a&gt; were interested in hard data showing the improvements in performance, so I went and wrote a benchmark.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The benchmark in itself is probably of limited value in absolute terms but gives a good idea of the differences between different machines.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
A benchmark run can comprise up to three different types of test.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Firstly, there&#39;s the &quot;Savage&quot; test, which gives an idea of the accuracy of the calculator.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
You start off with the value &#39;1&#39; in a variable. Let&#39;s say &#39;x&#39; for argument&#39;s sake. You then calculate repeatedly:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
\[ x = tan(atan(e^{ln(\sqrt{x^2})})) + 1 \]&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
If the calculator was absolutely accurate, this would be exactly the same thing as: \( x = x + 1 \)&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
But it&#39;s not completely accurate. With each iteration, a small error is introduced, which gets compounded into the next iteration etc. At the end of the test, when all the iterations have been calculated, we calculate the difference between the final result obtained and the &quot;perfect&quot; result, then we divide this discrepancy by the perfect result, which gives us the relative error. We also time how long it takes the calculator to perform the test.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Secondly, there&#39;s a summation test, which is designed to find out how quickly the calculator can chew on a series of calculations involving transcendental functions. In this case, we calculate:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
\[ \sum_{k=1}^n \sqrt[^3]{e^{sin(atan(k))}} \]&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It&#39;s a function with no intrinsic value or meaning other than it gets the calculator to work on trigonometric and exponential functions.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Finally, there&#39;s an implementation of a solution to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Eight_queens_puzzle&quot; target=&quot;_blank&quot;&gt;&quot;N Queens&quot; problem&lt;/a&gt;. We time how long it takes for the Prime to find the first solution and all the solutions to this problem on an 8x8, 9x9 or 10x10 board.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The &quot;Num&quot; and &quot;Num Setup&quot; views are used in this app. The app starts on the &quot;Num Setup&quot; view, in which you tell the benchmark how many iterations of the first two tests you want to run and how large a board you want to use for the &quot;N Queens&quot; test. When you hit the [OK] soft button it goes straight to the &quot;Num&quot; view, where it performs the tests and gives you the results:&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/forums/primebenchmark/menu2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;244&quot; data-original-width=&quot;324&quot; height=&quot;240&quot; src=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/forums/primebenchmark/menu2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Additional views in the &quot;View&quot; menu are &quot;Reset&quot;, which as its name suggests, resets the preferences you set up in the &quot;Num Setup&quot; view, and &quot;Last results&quot;, which displays again the results of the last test run without going through with the test.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Two variables are exported by this app: bmOptions and bmResults. Both are lists of raw data. bmOptions contains the options you gave in the &quot;Num Setup&quot; view and &quot;bmResults&quot; contains the results of the tests.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Tests can be invoked from the Home screen or from another app by using the exported DoBenchmark() function and passing to it a list of the form:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; {a, b, c}&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
...where a represents the number of iterations of the Savage test to perform, b that of the Summation test and c the size of the board for the &quot;N Queens&quot; test. These numbers are, for a and b:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 1: Skip the test&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 2: 1000 iterations&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 3: 2000 iterations&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 4: 5000 iterations&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 5: 10000 iterations&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 6: 20000 iterations&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 7: 50000 iterations&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 8: 100000 iterations&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
You can supply numbers greater than 8 if you wish. They will follow the same progression as the numbers 2 to 8 above, so 9 means 200000, 10 means 500000 etc.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
For c, the number is:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 1: Skip the test&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 2: 8x8 board&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 3: 9x9 board&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; 4: 10x10 board&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
You can use numbers greater than 4 for c if you wish. The general case is, the board will be a (c+6)x(c+6) board.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So, to run 20000 iterations of the Savage test, 10000 iterations of the Summation test and the &quot;N Queens&quot; problem on an 8x8 board from the Home screen:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; DoBenchmark({6,5,2})&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
(Don&#39;t forget to qualify the function if you&#39;re calling it from a different app: Benchmark.DoBenchmark())&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
You should get a list back something like this:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
{&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; {&quot;Savage&quot;, {20000, 0.14, 1.2980065E-6}},&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; {&quot;Summation&quot;, {10000, 0.078, 13955.8578444}},&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; {&quot;Queens&quot;, {8, 0.009, 876, 0.156, 92, 15720}}&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
}&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This is a list of lists. Each list in this list contains two elements. The first is a string representing the name of the test and the second is another list containing the results of the test.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The meanings of the values within the result list depend on the test itself.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
For the Savage test, the results are firstly the number of iterations performed, secondly the time in seconds taken to run the test, and thirdly the relative error.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
For the Summation test, the first two elements of the result list are as for the Savage test, and the third element is the sum of the terms calculated during the course of the test.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
For the &quot;N Queens&quot; test, the results are the size of the board, the time in seconds taken to find the first solution, the number of combinations examined to find that first solution, the time in seconds taken to find all of the solutions, the number of solutions found and, finally, the number of combinations examined to find all of the solutions.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
An individual test&#39;s result is {0} if the test is not performed, so:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; DoBenchmark({1,1,2})&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Should give you something like this in return:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
{&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; {&quot;Savage&quot;, {0}},&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; {&quot;Summation&quot;: {0}},&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp; {&quot;Queens&quot;, {8, 0.009, 876, 0.156, 92, 15720}}&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
}&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
All three tests show that the G2 is approximately three times as fast as its predecessor. The test results below are firstly from my Rev. C hardware Prime and then from my G2 below it.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/forums/primebenchmark/revcresults.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;244&quot; data-original-width=&quot;324&quot; height=&quot;240&quot; src=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/forums/primebenchmark/revcresults.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/forums/primebenchmark/g2results.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;244&quot; data-original-width=&quot;324&quot; height=&quot;240&quot; src=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/forums/primebenchmark/g2results.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You can download the benchmark app from here: &lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/forums/primebenchmark/Benchmark.hpappdir.zip&quot;&gt;Benchmark.hpappdir.zip&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/1536759413810936717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/1536759413810936717'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2018/12/hp-prime-benchmark.html' title='HP Prime benchmark'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGAOgHnx377HcJjqdyxaup-dwoD43-tSVO8DqzeMbqjgIllh9Wh9w51OaVuiRzoWYK9JCU-dXJyM6LaOElCAJSHIeCbE0CUZgK7z7riS3ikhr5SSvNbbByLgx7D8e6wTqZb1fPwpbqEPqU/s72-c/HP_prime_front_picture.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-6381502531860518305</id><published>2018-12-25T18:42:00.000+00:00</published><updated>2018-12-25T18:50:45.757+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CDOWN"/><category scheme="http://www.blogger.com/atom/ns#" term="DM41"/><category scheme="http://www.blogger.com/atom/ns#" term="Hewlett Packard"/><category scheme="http://www.blogger.com/atom/ns#" term="HP-41C"/><category scheme="http://www.blogger.com/atom/ns#" term="RUNSW"/><category scheme="http://www.blogger.com/atom/ns#" term="SETSW"/><category scheme="http://www.blogger.com/atom/ns#" term="Swiss Micros"/><category scheme="http://www.blogger.com/atom/ns#" term="Time Module"/><category scheme="http://www.blogger.com/atom/ns#" term="Timer"/><category scheme="http://www.blogger.com/atom/ns#" term="XYZALM"/><title type='text'>Egg timer in a 41CX</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Now this is something unusual. Who would want to use a 30-year-old machine worth something as a mere egg timer, or use it at all in a kitchen, where it could easily get damaged?&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUg_qCBmDcPYugWrbKcGbsf8kzv38tYQ7gKmVxIvJzY8LM2aViDAEvNERkJ1VdBQ93YyppnJtZaF3dkel-3s0siszV1JDdRrCfdFi6Onsoo2t3IYvhqQShRYYJNiqQxcmqDMEtDjnspTvs/s1600/dm41.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;SwissMicros DM41&quot; border=&quot;0&quot; data-original-height=&quot;450&quot; data-original-width=&quot;600&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUg_qCBmDcPYugWrbKcGbsf8kzv38tYQ7gKmVxIvJzY8LM2aViDAEvNERkJ1VdBQ93YyppnJtZaF3dkel-3s0siszV1JDdRrCfdFi6Onsoo2t3IYvhqQShRYYJNiqQxcmqDMEtDjnspTvs/s200/dm41.jpg&quot; title=&quot;SwissMicros DM41&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
It just so happens that one of the machines in my collection is a SwissMicros DM41. It&#39;s built really solid and it&#39;s basically the same thing as a Hewlett Packard HP-41CX in a case the size of a credit card, so that means that it incorporates, among other things, a Time Module, which gives it a stopwatch, countdown timer and alarm capabilities.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The DM41 is a great little piece of technology. However, the operative word here is &quot;little&quot;. While its LCD is the same size as it&#39;s Voyager-sized big brother, the DM41L, its keys are just a bit too small for the device to be fully practical, but for some things its form factor makes it just right. Okay, it&#39;s more than an egg timer. This said, my DM41 gets used most of the time in the kitchen as a timer while I&#39;m cooking. I keep it in the breast pocket of my shirt.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The program I&#39;m showcasing here isn&#39;t restricted to the HP-41CX and DM41(L), it will also work on the HP-41C or HP-41CV as long as it&#39;s fitted with a Time Module (HP-82182A).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The idea behind this was to give me a quick way of having an alarm go off after a set amount of time. There are two ways of going about this on the &#39;41. You can set the stopwatch to a negative time using &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;SETSW&lt;/b&gt;&lt;/span&gt; and start it going with &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;RUNSW&lt;/b&gt;&lt;/span&gt;. It will count upwards towards zero and when it gets there, it will emit a single beep and continue counting. The advantage of this option is that you can follow the progress of the countdown. Alternatively, you can calculate what the time will be after the set amount of time has elapsed and set an alarm for that time using &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;XYZALM&lt;/b&gt;&lt;/span&gt;. With this option you won&#39;t know how long there is to go before the alarm goes off, but you will see an indication of the time for which it was set after running &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;CDOWN&lt;/b&gt;&lt;/span&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The first option is easy enough as long as the required instructions have been assigned to keys in USER mode, but when the time has elapsed, it&#39;s easy to miss the single beep while you&#39;re going about your business. The second option gives you a full-blown alarm with all the flexibility that implies, but you need to calculate the alarm date as well as the time in case the countdown time takes you beyond midnight. This is exactly what the program &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;CDOWN&lt;/b&gt;&lt;/span&gt; does.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;CDOWN&lt;/b&gt;&lt;/span&gt; is easy to use:&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Set the alpha register as you would if creating an alarm manually. So, that&#39;s with a message, blank, or with a global label (refer to the Time Module manual for details).&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Enter the time to count down in the form &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;HH.MMSS&lt;/span&gt; (e.g. 0.0530 for 5m30s)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;
Run &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;CDOWN&lt;/b&gt;&lt;/span&gt; (either XEQ it or assign it to a USER key)&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
You&#39;ll see the time of day when the alarm is set to go off in X after &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;CDOWN&lt;/b&gt;&lt;/span&gt; runs.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
You can grab CDOWN from here:&amp;nbsp;&lt;a href=&quot;https://s3-eu-west-1.amazonaws.com/xferperso/hp/cdown.zip&quot;&gt;cdown.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The archive contains a text listing of the program that&#39;s compatible with &lt;a href=&quot;https://sourceforge.net/projects/hp41uc/&quot; target=&quot;_blank&quot;&gt;hp41uc&lt;/a&gt; and &lt;a href=&quot;http://dm41.swissmicros.com/&quot;&gt;dm41.swissmicros.com&lt;/a&gt;, a .raw file and a printable PDF with wand bar codes.&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/6381502531860518305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/6381502531860518305'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2018/12/egg-timer-in-41cx.html' title='Egg timer in a 41CX'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUg_qCBmDcPYugWrbKcGbsf8kzv38tYQ7gKmVxIvJzY8LM2aViDAEvNERkJ1VdBQ93YyppnJtZaF3dkel-3s0siszV1JDdRrCfdFi6Onsoo2t3IYvhqQShRYYJNiqQxcmqDMEtDjnspTvs/s72-c/dm41.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-362965023227612729</id><published>2018-12-25T14:30:00.006+00:00</published><updated>2020-11-07T21:40:14.893+00:00</updated><title type='text'>Times are a-changing</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;p&gt;The first post on this blog goes back to September 2009 and we are now about to go into 2019. So many things have changed since then.&lt;/p&gt;
&lt;p&gt;The original idea behind this blog was to publish periodical tips and tricks mainly related to GNU/Linux and other POSIX operating systems on one hand, and Symbian mobile phones on the other. Guess what... I no longer use GNU/Linux as my main operating system because I&#39;m no longer self-employed and the work that I now do means that using MS-Windows is my only real option. I still use Linux on a handful of Amazon Web Services EC2 machines and on virtual machines at home and at work, but my main workstations are Windows 10 machines.&lt;/p&gt;
&lt;p&gt;So, what about mobile phones and Symbian? We all know what happened to that. Nokia discontinued Symbian and switched to Microsoft&#39;s Windows Mobile platform, and sold the mobile division to Microsoft, who promptly killed it off. A Chinese manufacturer took out a license to build and sell mobile phones under the Nokia brand and that is what&#39;s on sale now, although it has very little to do with the Nokia brand of yesteryear.&lt;/p&gt;
&lt;p&gt;Not only that but, no longer being self-employed, I don&#39;t have the freedom to organise myself as I want, which has left me little time to post anything here for a number of years, although I&#39;m hoping to be able to start posting again in the not too far future given that I will be far less involved in &lt;a href=&quot;http://www.41club.org/&quot; target=&quot;_blank&quot;&gt;41 Club&lt;/a&gt; in just over 3 months from now, when I step down from the Association&#39;s National Executive.&lt;/p&gt;
&lt;p&gt;If you&#39;ve seen &lt;a href=&quot;http://techy.horwits.com/2017/07/calculator-collection.html&quot;&gt;my previous post on this blog&lt;/a&gt; from nearly 18 months ago (although I have kept it up to date since then!) then you&#39;ll know that I&#39;ve revived a collection that I started when I was in my early &#39;20s living in France, a collection of calculators. Not just any calculators, though. There is so much Chinese crap flooding the market, cheap &quot;4-bangers&quot; (calculators with the 4 basic operations) that cost pennies and flimsy, plasticky scientific machines that look like they&#39;ll break if you look at them wrong. I don&#39;t want any of that. What I want is well-built machines that feel solid and are programmable and I have a distinct preference for stuff that was popular in the &#39;70s and &#39;80s. I am also involved, on an entirely voluntary basis (I&#39;m not a member of their staff and I don&#39;t get paid!), with a Zürich-based company called &quot;&lt;a href=&quot;http://www.swissmicros.com/&quot; target=&quot;_blank&quot;&gt;SwissMicros&lt;/a&gt;&quot;, who build calculators that behave like some of the popular models made by Hewlett Packard in the &#39;80s.&lt;/p&gt;
&lt;p&gt;Edit: November 2020. I have been working part time for SwissMicros as an independent contractor since July this year.&lt;/p&gt;
&lt;p&gt;So, that is how my interests have shifted over the past 10 years. You can now expect a few blog entries about vintage calculators :)&lt;/p&gt;
&lt;p&gt;If this is of interest to you then another blog you might want to consider following is &lt;a href=&quot;http://edspi31415.blogspot.com/&quot; target=&quot;_blank&quot;&gt;Eddie Shore&#39;s Math and Calculator Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/362965023227612729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/362965023227612729'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2018/12/times-are-changing.html' title='Times are a-changing'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-4615714097720051370</id><published>2017-07-31T14:07:00.043+01:00</published><updated>2022-01-18T13:42:02.670+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Calculator"/><category scheme="http://www.blogger.com/atom/ns#" term="Canon"/><category scheme="http://www.blogger.com/atom/ns#" term="Casio"/><category scheme="http://www.blogger.com/atom/ns#" term="Hewlett Packard"/><category scheme="http://www.blogger.com/atom/ns#" term="Printer"/><category scheme="http://www.blogger.com/atom/ns#" term="Sharp"/><category scheme="http://www.blogger.com/atom/ns#" term="Texas Instruments"/><title type='text'>Calculator collection</title><content type='html'>This has become just a holding page enumerating the models that I have. Details of each one will appear on a dedicated website in due course and I&#39;ll give a link to that website here.&lt;br /&gt;
&lt;br /&gt;
Running total of items collected so far: 296&lt;br /&gt;
&lt;ul&gt;
  &lt;li&gt;Hewlett Packard (66)
    &lt;ul&gt;
      &lt;li&gt;HP 10s&lt;/li&gt;
      &lt;li&gt;HP 10s+&lt;/li&gt;
      &lt;li&gt;HP-10C&lt;/li&gt;
      &lt;li&gt;HP-12C (2x)&lt;/li&gt;
      &lt;li&gt;HP-12C Platinum&lt;/li&gt;
      &lt;li&gt;HP-12C Platinum 25th Anniversary&lt;/li&gt;
      &lt;li&gt;HP-15C&lt;/li&gt;
      &lt;li&gt;HP-16C&lt;/li&gt;
      &lt;li&gt;HP-18C&lt;/li&gt;
      &lt;li&gt;HP-19BII&lt;/li&gt;
      &lt;li&gt;HP-28C&lt;/li&gt;
      &lt;li&gt;HP-28S&lt;/li&gt;
      &lt;li&gt;HP-32S&lt;/li&gt;
      &lt;li&gt;HP-32SII&lt;/li&gt;
      &lt;li&gt;HP-35&lt;/li&gt;
      &lt;li&gt;HP-35S&lt;/li&gt;
      &lt;li&gt;HP 38G&lt;/li&gt;
      &lt;li&gt;HP 39G&lt;/li&gt;
      &lt;li&gt;HP 39gII&lt;/li&gt;
      &lt;li&gt;HP 39gs (2x)&lt;/li&gt;
      &lt;li&gt;HP 40gs (2x)&lt;/li&gt;
      &lt;li&gt;HP-41C&lt;/li&gt;
      &lt;li&gt;HP-41CV (converted to a &lt;a href=&quot;http://www.systemyde.com/hp41/&quot; target=&quot;_blank&quot;&gt;Systemyde International&lt;/a&gt; 41CL)&lt;/li&gt;
      &lt;li&gt;HP-41CX&lt;/li&gt;
      &lt;li&gt;HP-42S&lt;/li&gt;
      &lt;li&gt;HP-45&lt;/li&gt;
      &lt;li&gt;HP-48G (2x)&lt;/li&gt;
      &lt;li&gt;HP-48GX (2x)&lt;/li&gt;
      &lt;li&gt;HP-48G+&lt;/li&gt;
      &lt;li&gt;HP-48S&lt;/li&gt;
      &lt;li&gt;HP-48SX (2x)&lt;/li&gt;
      &lt;li&gt;HP 48gII 2× (1× 2003 version, 1× 2007 version)&lt;/li&gt;
      &lt;li&gt;HP 49G (2x)&lt;/li&gt;
      &lt;li&gt;HP 49g+&lt;/li&gt;
      &lt;li&gt;HP 50g (12x black, 2x blue)&lt;/li&gt;
      &lt;li&gt;HP-67&lt;/li&gt;
      &lt;li&gt;HP-71B&lt;/li&gt;
      &lt;li&gt;HP 95LX (not strictly a calculator but still a handheld computing device)&lt;/li&gt;
      &lt;li&gt;HP 320LX Palmtop with docking station&lt;/li&gt;
      &lt;li&gt;HP 300s+&lt;/li&gt;
      &lt;li&gt;HP Prime (1x Rev. A, 1x Rev. C pale keys, 2x Rev. C dark keys, 1x G2)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Hewlett Packard Accessories/Modules (26)
    &lt;ul&gt;
      &lt;li&gt;HP 82240B IR printer (2x)&lt;/li&gt;
      &lt;li&gt;HP 82153A Barcode wand&lt;/li&gt;
      &lt;li&gt;HP 82160A HP-IL module for HP-41C&lt;/li&gt;
      &lt;li&gt;HP 82170A Quad Memory module for HP-41C&lt;/li&gt;
      &lt;li&gt;HP 82180A Extended Functions module for HP-41C/CV (2x)&lt;/li&gt;
      &lt;li&gt;HP 82181A Extended Memory module for HP-41C/CV/CX (4x)&lt;/li&gt;
      &lt;li&gt;HP 82182A Time Module for HP-41C/CV&lt;/li&gt;
      &lt;li&gt;HP 00041-14023 MATH 1B PAC&lt;/li&gt;
      &lt;li&gt;HP 00041-14011 Structural Analysis Pac STRCTA 1A&lt;/li&gt;
      &lt;li&gt;HP 00041-15006 Circuit Analysis Pac&lt;/li&gt;
      &lt;li&gt;HP 00041-15004 Financial Decisions Pac&lt;/li&gt;
      &lt;li&gt;HP 5061-7285 Advantage Module 1A&lt;/li&gt;
      &lt;li&gt;L119 Howitzer Firing Solution module&lt;/li&gt;
      &lt;li&gt;HP 82120A Battery Pack for HP-41C/CV/CX with charger&lt;/li&gt;
      &lt;li&gt;HP 82104A Magnetic Card Reader for HP-41C/CV/CX&lt;/li&gt;
      &lt;li&gt;HP 82401A HP-IL Module for HP-71B&lt;/li&gt;
      &lt;li&gt;HP 82211A HP SOLVE Equation Library for HP-48SX&lt;/li&gt;
      &lt;li&gt;HP 82215A 128KB RAM card for HP-48SX/GX&lt;/li&gt;
      &lt;li&gt;CMT48 128KB RAM card for HP-48SX/GX&lt;/li&gt;
      &lt;li&gt;GRID 1MB RAM card for HP-48GX&lt;/li&gt;
      &lt;li&gt;PIL-Box&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;SwissMicros (18)
    &lt;ul&gt;
      &lt;li&gt;DM10L Collector&#39;s Edition&lt;/li&gt;
      &lt;li&gt;DM11L (2x)&lt;/li&gt;
      &lt;li&gt;DM12L&lt;/li&gt;
      &lt;li&gt;DM15&lt;/li&gt;
      &lt;li&gt;DM15L (2x)&lt;/li&gt;
      &lt;li&gt;DM16&lt;/li&gt;
      &lt;li&gt;DM16L&lt;/li&gt;
      &lt;li&gt;DM41&lt;/li&gt;
      &lt;li&gt;DM41L (2x)&lt;/li&gt;
      &lt;li&gt;DM41X alpha unit&lt;/li&gt;
      &lt;li&gt;DM41X beta unit&lt;/li&gt;
      &lt;li&gt;DM41X production unit&lt;/li&gt;
      &lt;li&gt;DM42 (3x)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Texas Instruments (67)
    &lt;ul&gt;
      &lt;li&gt;TI-Math Explorer&lt;/li&gt;
      &lt;li&gt;TI-Business Analyst II&lt;/li&gt;
      &lt;li&gt;TI-5025&lt;/li&gt;
      &lt;li&gt;TI-1006 Light Powered&lt;/li&gt;
      &lt;li&gt;TI-1025&lt;/li&gt;
      &lt;li&gt;TI-15&lt;/li&gt;
      &lt;li&gt;TI-30&lt;/li&gt;
      &lt;li&gt;TI-30X Solar&lt;/li&gt;
      &lt;li&gt;TI-35&lt;/li&gt;
      &lt;li&gt;TI-36X Solar&lt;/li&gt;
      &lt;li&gt;TI-53 (4x)&lt;/li&gt;
      &lt;li&gt;TI-55-II&lt;/li&gt;
      &lt;li&gt;TI-56&lt;/li&gt;
      &lt;li&gt;TI-57 LCD&lt;/li&gt;
      &lt;li&gt;TI-57 II (2x)&lt;/li&gt;
      &lt;li&gt;TI Programmable 58&lt;/li&gt;
      &lt;li&gt;TI-65 Technical Analyst&lt;/li&gt;
      &lt;li&gt;TI-66 (4x)&lt;/li&gt;
      &lt;li&gt;TI-67 Galaxy (2x)&lt;/li&gt;
      &lt;li&gt;Ti-68&lt;/li&gt;
      &lt;li&gt;TI-73&lt;/li&gt;
      &lt;li&gt;TI-73 Explorer&lt;/li&gt;
      &lt;li&gt;Ti-74 BASICALC&lt;/li&gt;
      &lt;li&gt;TI-80&lt;/li&gt;
      &lt;li&gt;TI-81 (2x)&lt;/li&gt;
      &lt;li&gt;TI-82&lt;/li&gt;
      &lt;li&gt;TI-82 (2001)&lt;/li&gt;
      &lt;li&gt;TI-83&lt;/li&gt;
      &lt;li&gt;TI-83 Plus&lt;/li&gt;
      &lt;li&gt;TI-83 Plus Silver Edition&lt;/li&gt;
      &lt;li&gt;TI-84 Plus&lt;/li&gt;
      &lt;li&gt;TI-84 Plus Silver Edition (2x)&lt;/li&gt;
      &lt;li&gt;TI-84 Plus C Silver Edition (2x)&lt;/li&gt;
      &lt;li&gt;TI-84 Plus &lt;i&gt;Pocket SE&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;TI-84 Plus CE-T&lt;/li&gt;
      &lt;li&gt;TI-85&lt;/li&gt;
      &lt;li&gt;TI-86&lt;/li&gt;
      &lt;li&gt;TI-89&lt;/li&gt;
      &lt;li&gt;TI-89 Titanium (2x grey, 1x black)&lt;/li&gt;
      &lt;li&gt;TI-92&lt;/li&gt;
      &lt;li&gt;TI-92 II&lt;/li&gt;
      &lt;li&gt;TI-92 Plus&lt;/li&gt;
      &lt;li&gt;Voyage 200&lt;/li&gt;
      &lt;li&gt;TI-95 PROCALC (2x, 1 of which with 8KB RAM module)&lt;/li&gt;
      &lt;li&gt;TI NSpire&lt;/li&gt;
      &lt;li&gt;TI NSpire CAS&lt;/li&gt;
      &lt;li&gt;TI NSpire Touchpad&lt;/li&gt;
      &lt;li&gt;TI NSpire CAS Touchpad&lt;/li&gt;
      &lt;li&gt;TI NSpire CX&lt;/li&gt;
      &lt;li&gt;TI NSpire CX CAS&lt;/li&gt;
      &lt;li&gt;TI NSpire CX II-T&lt;/li&gt;
      &lt;li&gt;TI NSpire CX II-T CAS&lt;/li&gt;
      &lt;li&gt;TI LCD Programmer&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Casio (79)
    &lt;ul&gt;
      &lt;li&gt;FX-81&lt;/li&gt;
      &lt;li&gt;FX-180P (4x)&lt;/li&gt;
      &lt;li&gt;FX-180Pv&lt;/li&gt;
      &lt;li&gt;FX-200P&lt;/li&gt;
      &lt;li&gt;FX-373ES&lt;/li&gt;
      &lt;li&gt;FX-570&lt;/li&gt;
      &lt;li&gt;FX-570ES PLUS&lt;/li&gt;
      &lt;li&gt;FX-702P (2x)&lt;/li&gt;
      &lt;li&gt;FX-730P (2x)&lt;/li&gt;
      &lt;li&gt;FX-795P&lt;/li&gt;
      &lt;li&gt;FX-802P&lt;/li&gt;
      &lt;li&gt;Fx-850P&lt;/li&gt;
      &lt;li&gt;FX-880P&lt;/li&gt;
      &lt;li&gt;FX-991ES PLUS&lt;/li&gt;
      &lt;li&gt;FX-1000F&lt;/li&gt;
      &lt;li&gt;FX-2700P&lt;/li&gt;
      &lt;li&gt;FX-3400P (2x)&lt;/li&gt;
      &lt;li&gt;FX-3500P&lt;/li&gt;
      &lt;li&gt;FX-3600P&lt;/li&gt;
      &lt;li&gt;FX-3650PII&lt;/li&gt;
      &lt;li&gt;FX-3800P&lt;/li&gt;
      &lt;li&gt;FX-3900PV&lt;/li&gt;
      &lt;li&gt;FX-4000P&lt;/li&gt;
      &lt;li&gt;FX-4200P&lt;/li&gt;
      &lt;li&gt;FX-4500P&lt;/li&gt;
      &lt;li&gt;FX-4800P&lt;/li&gt;
      &lt;li&gt;FX-5000F&lt;/li&gt;
      &lt;li&gt;FX-5500&lt;/li&gt;
      &lt;li&gt;FX-5800P (2x)&lt;/li&gt;
      &lt;li&gt;FX-6000G&lt;/li&gt;
      &lt;li&gt;FX-6300G&lt;/li&gt;
      &lt;li&gt;FX-7000G/GA/GB (5x)&lt;/li&gt;
      &lt;li&gt;FX-7300G&lt;/li&gt;
      &lt;li&gt;FX-7400G PLUS&lt;/li&gt;
      &lt;li&gt;FX-7500G (2x)&lt;/li&gt;
      &lt;li&gt;FX-7700G&lt;/li&gt;
      &lt;li&gt;FX-8000G&lt;/li&gt;
      &lt;li&gt;FX-8100&lt;/li&gt;
      &lt;li&gt;FX-8500G&lt;/li&gt;
      &lt;li&gt;FX-8700G&lt;/li&gt;
      &lt;li&gt;FX-9700GE&lt;/li&gt;
      &lt;li&gt;FX-9750G&lt;/li&gt;
      &lt;li&gt;FX-9750GII&lt;/li&gt;
      &lt;li&gt;CFX-9800G&lt;/li&gt;
      &lt;li&gt;CFX-9850G&lt;/li&gt;
      &lt;li&gt;CFX-9850GB PLUS (2 variants)&lt;/li&gt;
      &lt;li&gt;FX-9860G SD&lt;/li&gt;
      &lt;li&gt;FX-9860G Slim (2x)&lt;/li&gt;
      &lt;li&gt;FX-9860GII&lt;/li&gt;
      &lt;li&gt;FX-9860GII SD&lt;/li&gt;
      &lt;li&gt;FX-9860GIII&lt;/li&gt;
      &lt;li&gt;FX-9900GC&lt;/li&gt;
      &lt;li&gt;CFX-9940GT&lt;/li&gt;
      &lt;li&gt;CFX-9950GB PLUS&lt;/li&gt;
      &lt;li&gt;CFX-9990GT&lt;/li&gt;
      &lt;li&gt;FX-CG20&lt;/li&gt;
      &lt;li&gt;FX-CG50 (2x)&lt;/li&gt;
      &lt;li&gt;PB-110&lt;/li&gt;
      &lt;li&gt;PB-410F&lt;/li&gt;
      &lt;li&gt;RC-4 RAM pack (3x)&lt;/li&gt;
      &lt;li&gt;RP-8 RAM pack&lt;/li&gt;
      &lt;li&gt;RP-33 RAM pack&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Others (40)
    &lt;ul&gt;
      &lt;li&gt;Canon LC-64T&lt;/li&gt;
      &lt;li&gt;Canon LS-25HII&lt;/li&gt;
      &lt;li&gt;Canon F-73P&lt;/li&gt;
      &lt;li&gt;Citizen SRP-45&lt;/li&gt;
      &lt;li&gt;Электроника МК61&lt;/li&gt;
      &lt;li&gt;Ericsson MC12 &quot;Mobile Companion&quot; (rebranded HP 320LX Palmtop)&lt;/li&gt;
      &lt;li&gt;Panasonic JE-554U&lt;/li&gt;
      &lt;li&gt;Sharp EL-W531&lt;/li&gt;
      &lt;li&gt;Sharp EL-5020&lt;/li&gt;
      &lt;li&gt;Sharp EL-9200&lt;/li&gt;
      &lt;li&gt;Sharp EL-9300&lt;/li&gt;
      &lt;li&gt;Sharp EL-9450&lt;/li&gt;
      &lt;li&gt;Sharp EL-9600&lt;/li&gt;
      &lt;li&gt;Sharp EL-9900 (5x)&lt;/li&gt;
      &lt;li&gt;Sharp PC-1246 (2x)&lt;/li&gt;
      &lt;li&gt;Sharp PC-1248&lt;/li&gt;
      &lt;li&gt;Sharp PC-1360 (2x)&lt;/li&gt;
      &lt;li&gt;Sharp PC-1401 (extended to 10kB)&lt;/li&gt;
      &lt;li&gt;Sharp PC-1421&lt;/li&gt;
      &lt;li&gt;Sharp PC-1500&lt;/li&gt;
      &lt;li&gt;Sharp PC-1500A&lt;/li&gt;
      &lt;li&gt;Sharp PC-G850VS&lt;/li&gt;
      &lt;li&gt;Sharp CE-124 Cassette Interface&lt;/li&gt;
      &lt;li&gt;Sharp CE-211M 4KB RAM card&lt;/li&gt;
      &lt;li&gt;Sharp CE-212M 8KB RAM card (7x)&lt;/li&gt;
      &lt;li&gt;SMART² EC-4034 (rebranded Casio fx-7700G)&lt;/li&gt;
      &lt;li&gt;National Semiconductor 4650&lt;/li&gt;
      &lt;li&gt;Tandy EC-4019 (rebranded Casio fx-3800P)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/4615714097720051370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/4615714097720051370'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2017/07/calculator-collection.html' title='Calculator collection'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-3712699743586701598</id><published>2012-07-05T11:03:00.000+01:00</published><updated>2012-07-05T11:12:27.145+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Harmattan"/><category scheme="http://www.blogger.com/atom/ns#" term="MeeGo"/><category scheme="http://www.blogger.com/atom/ns#" term="N9"/><category scheme="http://www.blogger.com/atom/ns#" term="Nokia"/><category scheme="http://www.blogger.com/atom/ns#" term="PR1.3"/><category scheme="http://www.blogger.com/atom/ns#" term="update"/><title type='text'>Nokia N9 PR1.3 update</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeEQwNd-F20xsWGJ-k0wobctmFfLwN8PhygcbZgMi_1G7y29l3GWfZLm_gRbT4kKFqRc52mESoRV5hKr9osYuXssbG9o80Ln9ts1g3v040jGpF8e0sdmSBAjJE0w5sf5yvYE4Rqjx1myyG/s1600/nokia-n9-family.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;100&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeEQwNd-F20xsWGJ-k0wobctmFfLwN8PhygcbZgMi_1G7y29l3GWfZLm_gRbT4kKFqRc52mESoRV5hKr9osYuXssbG9o80Ln9ts1g3v040jGpF8e0sdmSBAjJE0w5sf5yvYE4Rqjx1myyG/s200/nokia-n9-family.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The much awaited update landed on my own N9 yesterday.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
At first sight there&#39;s nothing really new in it despite Nokia&#39;s surprisingly undetailed claims of over 1000 improvements in various areas (see &lt;a href=&quot;http://www.developer.nokia.com/Community/Wiki/Nokia_firmware_change_logs#N9&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;).&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As far as I can see there are only 3 visual changes, but it goes a little deeper than that. Read on...&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJIKobwTP-m9DwgaRiAd0wirNCfiWb47HcKF7TAsa_lKWayTJKTkUkz7uJUklgEGIDr8JPu-ciCMKXrBsxcuKr9O2kaXnozul1u0G_sT9W7wDRPB9IrMrVLct7W6g44dqcdgFNnorAi-gD/s1600/2012-07-05_09-46-54-icon.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJIKobwTP-m9DwgaRiAd0wirNCfiWb47HcKF7TAsa_lKWayTJKTkUkz7uJUklgEGIDr8JPu-ciCMKXrBsxcuKr9O2kaXnozul1u0G_sT9W7wDRPB9IrMrVLct7W6g44dqcdgFNnorAi-gD/s1600/2012-07-05_09-46-54-icon.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Firstly, there is now a small status icon that appears when the phone&#39;s &quot;beep&quot; profile is selected (see photo to the right, screenshot of the top-right corner of the display). Previously, there was only such an icon&amp;nbsp;when&amp;nbsp;the phone was in silent mode, a similar musical note with a bar through it.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Secondly, the UI seems to be a bit more fluid. Scrolling through photos in the gallery, entries in the music player or tweets in the twitter app seems less jerky than previously.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrZuWOE6_3KxtQty27NovF-a0Jl6RjWUB0rFmrRLxC6CjnAUildkIVTINP4BCh1vR6oFjcawUGEZQe9GjL4XchKlQOtfk_pi6DsTIWn55usfYKMvonvtnHlb6lyB6NHwnVYsnpGQ_14IR3/s1600/611244046.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrZuWOE6_3KxtQty27NovF-a0Jl6RjWUB0rFmrRLxC6CjnAUildkIVTINP4BCh1vR6oFjcawUGEZQe9GjL4XchKlQOtfk_pi6DsTIWn55usfYKMvonvtnHlb6lyB6NHwnVYsnpGQ_14IR3/s320/611244046.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Finally, there has been some improvement to the camera. Focussing seems to be improved, as does the camera&#39;s ability to function in poor lighting conditions. The photo on the left provides an example of this. Click &lt;a href=&quot;http://twitpic.com/a3x2xa/full&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; to view the image in its full 8MP resolution.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
All of this looks all well and good, but there was another, less visible change that was troubling me somewhat, and that was much increased power usage.&lt;br /&gt;
&lt;br /&gt;
I use a small app called &lt;a href=&quot;http://store.ovi.com/content/138659&quot; target=&quot;_blank&quot;&gt;Battery Usage&lt;/a&gt; to monitor the charge state of my phone&#39;s battery and to see what particular apps are draining the power. It serves as a handy diagnostic tool in discovering anomalies such as I have discovered since updating to PR1.3.&lt;br /&gt;
&lt;br /&gt;
Under PR1.2, with WiFi switched on and connected to the wireless router, bluetooth switched on but not connected to anything, network mode set to &quot;dual&quot; in a zone (at work) with good 3G coverage, the average idle power consumption would settle in the 10mA to 12mA range. Even less if I placed the phone face downwards, thus causing the screen to switch off. With the phone in flight mode and with power saving mode engaged overnight, it would drop as low as 6mA.&lt;br /&gt;
&lt;br /&gt;
Shortly after updating, I noticed that the idle drain had jumped to over 30mA thanks to the Battery Usage app issuing a power drain warning. The only thing that had changed since the previous situation with readings at a third of that level was the update. Something in PR1.3 was causing the phone to eat more power than before.&lt;br /&gt;
&lt;br /&gt;
Thanks to&amp;nbsp;&lt;a href=&quot;https://twitter.com/#!/ibrakalifapuspa&quot; target=&quot;_blank&quot;&gt;@ibrakalifapuspa&lt;/a&gt; on &lt;a href=&quot;https://twitter.com/&quot; target=&quot;_blank&quot;&gt;twitter&lt;/a&gt;, who gave me a tip on getting the power drain back down again (switch to flight mode with power saving mode engaged for an hour, then back to normal settings), I was able to narrow the problem down to the bluetooth stack.&lt;br /&gt;
&lt;br /&gt;
If I switch bluetooth off, the power drain reverts to normal. If I switch bluetooth back on again, things stay normal, with no perciptible increased power usage from the bluetooth subsystem as it always used to be, until I connect a device such as my Nokia BH-109 bluetooth earpiece, at which point the power drain shoots up again. It remains abnormally high even when the earpiece is disconnected and stays that way until bluetooth is switched off again.&lt;br /&gt;
&lt;br /&gt;
Given the&amp;nbsp;unlikelihood&amp;nbsp;of there ever being an update to the N9&#39;s firmware (Nokia&#39;s MeeGo dev team &lt;a href=&quot;http://www.engadget.com/2012/07/04/key-meego-team-members-leave-nokia/&quot; target=&quot;_blank&quot;&gt;jumped ship&lt;/a&gt; shortly after the release of the update), this bug will probably never be fixed now, so while I used to dismiss the old &quot;switch bluetooth off to save power&quot; adage, it has now become true.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjs8daGeiknhc_V2o9C47zcn9B6fokSMx3QTwNRerB2WrmoBjya55dMdfof3kjibcCK8JaUtetnTPiOhWcg2aC2CK3LPkw8twDnzQIyAbr1lO2LWSD7xeC_DiPqpUVNhMlrt9JDLvR12Lj/s1600/2012-07-05_10-56-27.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjs8daGeiknhc_V2o9C47zcn9B6fokSMx3QTwNRerB2WrmoBjya55dMdfof3kjibcCK8JaUtetnTPiOhWcg2aC2CK3LPkw8twDnzQIyAbr1lO2LWSD7xeC_DiPqpUVNhMlrt9JDLvR12Lj/s1600/2012-07-05_10-56-27.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
With bluetooth switched off, I can get the idle power drain down to about 15mA, which is still marginally above what it used to be, so there&#39;s something else eating a bit more power than before. I have no way of proving this but I think it&#39;s the RF receiver. The reason I think it&#39;s that is because I live in an area with extremely poor coverage. There&#39;s a dense row of trees between me and the base station that&#39;s located well over a mile away, so the only way I can get a signal at home is to go upstairs or to go outside, and even that doesn&#39;t always suffice. Right now, the signal strength indicator on my screen is showing 3 bars out of 5, which is more than I&#39;ve ever had in this room, especially in Summer when the tree line is even denser than it is the rest of the year. Could it be that more power is being thrown at the receiver, thus boosting the gain and allowing the phone to acquire a better signal?&lt;br /&gt;
&lt;br /&gt;
So, to recap, this is what I have noticed in PR1.3:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;New icon to indicate the phone is in &quot;beep&quot; profile&lt;/li&gt;
&lt;li&gt;Smoother UI&lt;/li&gt;
&lt;li&gt;Improved camera&lt;/li&gt;
&lt;li&gt;Bug in the bluetooth stack causing power drain even when disconnected&lt;/li&gt;
&lt;li&gt;Improved gain in the RF receiver allowing better signal acquisition&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/3712699743586701598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/3712699743586701598'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2012/07/nokia-n9-pr13-update.html' title='Nokia N9 PR1.3 update'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeEQwNd-F20xsWGJ-k0wobctmFfLwN8PhygcbZgMi_1G7y29l3GWfZLm_gRbT4kKFqRc52mESoRV5hKr9osYuXssbG9o80Ln9ts1g3v040jGpF8e0sdmSBAjJE0w5sf5yvYE4Rqjx1myyG/s72-c/nokia-n9-family.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-8092288419723986729</id><published>2012-03-19T19:03:00.002+00:00</published><updated>2012-03-23T07:55:25.389+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="account"/><category scheme="http://www.blogger.com/atom/ns#" term="flickr"/><category scheme="http://www.blogger.com/atom/ns#" term="N9"/><category scheme="http://www.blogger.com/atom/ns#" term="Nokia"/><title type='text'>Flickr account on a Nokia N9</title><content type='html'>&lt;div style=&quot;color: #990000;&quot;&gt;
Since writing this, I have found a &quot;solution&quot; to the problem. &quot;Solution&quot; in quotes because it is merely a work-around and doesn&#39;t actually solve the underlying problem.&lt;/div&gt;
&lt;div style=&quot;color: #990000;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;All I did was install &lt;/span&gt;&lt;a href=&quot;http://store.ovi.com/content/257468&quot; style=&quot;color: #990000;&quot; target=&quot;_blank&quot;&gt;firefox&lt;/a&gt;&lt;span style=&quot;color: #990000;&quot;&gt;, set it as the default browser and start over with the procedure described below.&lt;/span&gt;&lt;br /&gt;
&lt;hr /&gt;
Here&#39;s one that has me stumped. Rest assured, if I do get an answer to this problem I&#39;ll publish it here so that other people coming up against the same problem can find help.&lt;br /&gt;
&lt;br /&gt;
The nature of the problem is quite simple: it is seemingly impossible to set up my flickr account on this phone. Flickr apparently uses an oAuth system similar to that of twitter, whereby the client application (the built-in flickr client in the N9 in this case) contacts the flickr API saying &quot;I want permission to access your services&quot;. The flickr API then prompts the user (me) to log in and grant the client this permission, in response to which, the API returns a token to the client. In order to access flickr&#39;s services thereafter, the client has to present that token as proof that the user gave it permission to access their account.&lt;br /&gt;
&lt;br /&gt;
So, step 1 is to go into Accounts &amp;gt; Add accounts &amp;gt; Flickr on the N9. You&#39;re presented with this screen:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2TffPCKwSMjEEy4DXcQ8gtr1FET9FVULcz4hj4OYPjVmqGLULX8i1NQf267indW9OfwVzluKlkyzKj4mXVMrWO0vHFlI3U-rZv6l-0_IMCKmgF1UZ2aV4dErItaak8gCFlounhsnfY3V-/s1600/2012-03-19_18-37-30.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2TffPCKwSMjEEy4DXcQ8gtr1FET9FVULcz4hj4OYPjVmqGLULX8i1NQf267indW9OfwVzluKlkyzKj4mXVMrWO0vHFlI3U-rZv6l-0_IMCKmgF1UZ2aV4dErItaak8gCFlounhsnfY3V-/s320/2012-03-19_18-37-30.png&quot; width=&quot;179&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
By tapping on the &quot;continue&quot; button, you are taken to the flickr login page:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcOI8sTPiGfspDuwFfp1LnOG1DdD51T9tklrtpjdE_W6n4ggzKSET0sGiCXaQEKegwrhY5mCmdmOCh5gI5Cy-gzZLygrRa6GDTeFKKhcrXq4bVTyD8fShsDLok-vBxAbF4C55YACS7IJdt/s1600/2012-03-19_18-37-58.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcOI8sTPiGfspDuwFfp1LnOG1DdD51T9tklrtpjdE_W6n4ggzKSET0sGiCXaQEKegwrhY5mCmdmOCh5gI5Cy-gzZLygrRa6GDTeFKKhcrXq4bVTyD8fShsDLok-vBxAbF4C55YACS7IJdt/s320/2012-03-19_18-37-58.png&quot; width=&quot;179&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Once you&#39;ve given your Yahoo! ID and password and signed in, the authorization token should be handed over to the account setup process and you should be redirected back to the account setup. Instead of that, you wind up at the flickr mobile home page:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzte848MWwgqxQyLYGo7_yEErRu5gLsLlkkT1pMr6BhTb8JC9Di75xMQy52-pykIem0qijfwnddl5CQpoL4Q1eBOtw0wgHR66XmK_reGfMvPtBr_VANvJ134WKgiLaKRGkW4M1cgug_PyL/s1600/2012-03-19_16-53-20.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzte848MWwgqxQyLYGo7_yEErRu5gLsLlkkT1pMr6BhTb8JC9Di75xMQy52-pykIem0qijfwnddl5CQpoL4Q1eBOtw0wgHR66XmK_reGfMvPtBr_VANvJ134WKgiLaKRGkW4M1cgug_PyL/s320/2012-03-19_16-53-20.png&quot; width=&quot;179&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Meanwhile, the account setup process is still waiting for the auth token:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG7o43T8gaQiHw4mFAZvSZ6wB7PVgcE7IAyy_3aSfDi4kbPa4-5N-ocgioxBcVa3f2ZBfTfKcFC-0Z0GhkhFmjmjghKHhOsbAogype9k3Vv3zF4QQwuYBT8aHw9XyIWrMRfycfMQwLnb5o/s1600/2012-03-19_16-53-36.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG7o43T8gaQiHw4mFAZvSZ6wB7PVgcE7IAyy_3aSfDi4kbPa4-5N-ocgioxBcVa3f2ZBfTfKcFC-0Z0GhkhFmjmjghKHhOsbAogype9k3Vv3zF4QQwuYBT8aHw9XyIWrMRfycfMQwLnb5o/s320/2012-03-19_16-53-36.png&quot; width=&quot;179&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
If anyone has some ideas, I&#39;m all ears!&lt;br /&gt;
&lt;br /&gt;
My phone is a Nokia N9 running PR1.2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/8092288419723986729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/8092288419723986729'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2012/03/flickr-account-on-nokia-n9.html' title='Flickr account on a Nokia N9'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2TffPCKwSMjEEy4DXcQ8gtr1FET9FVULcz4hj4OYPjVmqGLULX8i1NQf267indW9OfwVzluKlkyzKj4mXVMrWO0vHFlI3U-rZv6l-0_IMCKmgF1UZ2aV4dErItaak8gCFlounhsnfY3V-/s72-c/2012-03-19_18-37-30.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-7842333805787800260</id><published>2012-03-14T21:48:00.000+00:00</published><updated>2012-03-26T19:35:09.809+01:00</updated><title type='text'>Choosing a new mobile network</title><content type='html'>The time has come for me to choose a new mobile network! I&#39;m currently using Tesco Mobile as the coverage was excellent where I used to live. I was also led to believe that the coverage of most competing networks was poor in the location where I now live, so Tesco or O&lt;sub&gt;2&lt;/sub&gt; (the former uses the latter&#39;s network anyway) seemed the logical choice and I took out a 12-month SIM-only contract.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha4-bs8uz1oxLXKiRt8WrEKybt7bAxGxESof1A8n6xQCjZ8VV-lnHAC9L80m9lM1imxRktT5froSdoLyJHhOVLVg5Qlu_CYY5SgXpKIAZfPB2iY-K6VTTU31KPEUo2N2QbLm2cqSHdNKh7/s1600/patchwork.jpg&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha4-bs8uz1oxLXKiRt8WrEKybt7bAxGxESof1A8n6xQCjZ8VV-lnHAC9L80m9lM1imxRktT5froSdoLyJHhOVLVg5Qlu_CYY5SgXpKIAZfPB2iY-K6VTTU31KPEUo2N2QbLm2cqSHdNKh7/s1600/patchwork.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
The big 5 available here in the UK are &lt;a href=&quot;http://www.orange.co.uk/&quot; target=&quot;_blank&quot;&gt;Orange UK&lt;/a&gt;, &lt;a href=&quot;http://www.o2.co.uk/&quot; target=&quot;_blank&quot;&gt;O&lt;sub&gt;2&lt;/sub&gt;&lt;/a&gt;, &lt;a href=&quot;http://www.vodafone.co.uk/&quot; target=&quot;_blank&quot;&gt;Vodafone&lt;/a&gt;, &lt;a href=&quot;http://www.three.co.uk/&quot; target=&quot;_blank&quot;&gt;Hutchison 3G&lt;/a&gt; and &lt;a href=&quot;http://www.t-mobile.co.uk/&quot; target=&quot;_blank&quot;&gt;T-Mobile&lt;/a&gt;. MVNOs piggybacking on some of these networks are, among others, &lt;a href=&quot;http://www.virginmobile.com/vm/home.do&quot; target=&quot;_blank&quot;&gt;Virgin Mobile&lt;/a&gt; (on T-Mobile), &lt;a href=&quot;http://phone-shop.tesco.com/tesco-mobile/&quot; target=&quot;_blank&quot;&gt;Tesco Mobile&lt;/a&gt; (on O&lt;sub&gt;2&lt;/sub&gt;) and &lt;a href=&quot;http://www.asdamobile.com/&quot; target=&quot;_blank&quot;&gt;Asda Mobile&lt;/a&gt; (on Vodafone). They all provide different levels of coverage in the various locations that I frequent and different levels of service.&lt;br /&gt;
&lt;br /&gt;
The primary concern when choosing a network has to be coverage and service levels, with the deals being offered by the networks only your second consideration. There&#39;s no point in getting boatloads of inclusive minutes, more texts than you can use and gigabytes of mobile data at a bargain price if you don&#39;t actually have any coverage in the places where you spend most of your life and therefore can&#39;t use those minutes etc.&lt;br /&gt;
&lt;br /&gt;
At my workplace I get full 3.5G coverage on all of the major networks so that part isn&#39;t even a consideration. At home, things are a little different.&lt;br /&gt;
&lt;br /&gt;
Unfortunately I have to rule out Vodafone (and therefore Asda) because I have absolutely zero coverage at home. Neither 2G nor 3G. Nada. Zip. If I had a contract phone on Vodafone I&#39;d be very unhappy as it would be absolutely useless as anything other than a paperweight.&lt;br /&gt;
&lt;br /&gt;
O&lt;sub&gt;2&lt;/sub&gt; (and Tesco) provides limited coverage here. I get a weak 2G signal on about half of the ground floor. On the first floor I get a stronger 2G signal in most rooms and a reasonable 3.5G signal in a couple of spots. There are still a few spots where I get no reception at all, which is why I&#39;m looking at alternatives now.&lt;br /&gt;
&lt;br /&gt;
Hutchison 3G would be a good solution if it weren&#39;t for two severe drawbacks. Firstly, Three UK is a 3G &lt;u&gt;only&lt;/u&gt; network. While they used to have agreements with Orange UK to use their 2G network in areas where there is no 3G coverage from Three, this is no longer always the case. If you&#39;re in a zone that&#39;s not covered by Three&#39;s 3G network, you therefore have no coverage at all. Secondly, and this is something that I remember experiencing with a friend who was on 3 at the time (and with his sister who has just switched away from 3 for this specific reason), text message delivery to handsets on 3&#39;s network is sometimes rather random. They just don&#39;t always get through. While nobody in their right mind should rely on text messaging for important information, it&#39;s still extremely annoying not to receive messages and simply not know about it.&lt;br /&gt;
&lt;br /&gt;
Three UK is therefore out of the equation.&lt;br /&gt;
&lt;br /&gt;
That leaves me with T-Mobile (or Virgin) and Orange. Essentially, they&#39;re the same network after their &lt;a href=&quot;http://newsroom.orange.co.uk/2010/03/01/merger-of-t-mobile-uk-and-orange-uk-cleared-by-eu-commission/&quot; target=&quot;_blank&quot;&gt;merger&lt;/a&gt; in late 2010, which resulted in the creation of &lt;a href=&quot;http://en.wikipedia.org/wiki/Everything_Everywhere&quot; target=&quot;_blank&quot;&gt;&quot;Everything, Everywhere&quot;&lt;/a&gt;. Not only do they share their 2G networks, but they both can use Three&#39;s 3G network in the absence of 3G coverage under the umbrella of &lt;a href=&quot;http://www.mbnl.co.uk/&quot; target=&quot;_blank&quot;&gt;Mobile Broadband Network Ltd.&lt;/a&gt;, a 50/50 joint venture between Three UK and Everything, Everywhere.&lt;br /&gt;
&lt;br /&gt;
These networks give me reasonable 3G or 3.5G coverage almost everywhere on the ground floor. In the few areas where I don&#39;t get 3G or better, I do get a usable 2G signal. On the first floor I get 3G or better everywhere. If I force the phone to GSM mode then I still get good 2G or EDGE coverage.&lt;br /&gt;
&lt;br /&gt;
As I understand it, Virgin Mobile does not manage the network switching in the same manner as T-Mobile despite being a MVNO piggybacking on the same physical network.&lt;br /&gt;
&lt;br /&gt;
That leaves T-Mobile and Orange, and I&#39;m leaning towards the former because the SIM-only deals that they&#39;re offering do seem to match my requirements better than those from Orange.&lt;br /&gt;
&lt;br /&gt;
My 12-month contract with Tesco is up in June. I&#39;m going to keep an eye on the operators&#39; offerings between now and then in order to choose the one that suits my needs best of all.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;Update 26/03/2012: I had a closer look at the plans from Orange and found one that suits me fine, so the deciding factor was the fact that, unlike T-Mobile, Orange supports twitter&#39;s &lt;a href=&quot;https://support.twitter.com/groups/34-apps-sms-and-mobile/topics/153-twitter-via-sms/articles/14020-twitter-for-sms-basic-features&quot; target=&quot;_blank&quot;&gt;SMS gateway&lt;/a&gt;. I&#39;m getting 300 minutes, unlimited texts and 500MB of data (tethering allowed!) for £10.50 a month. To that I added a further 500MB for an extra £5/month.&lt;/span&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7842333805787800260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7842333805787800260'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2012/03/choosing-new-mobile-network.html' title='Choosing a new mobile network'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha4-bs8uz1oxLXKiRt8WrEKybt7bAxGxESof1A8n6xQCjZ8VV-lnHAC9L80m9lM1imxRktT5froSdoLyJHhOVLVg5Qlu_CYY5SgXpKIAZfPB2iY-K6VTTU31KPEUo2N2QbLm2cqSHdNKh7/s72-c/patchwork.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-6778207660842635042</id><published>2012-03-07T15:17:00.000+00:00</published><updated>2012-03-07T16:31:46.979+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CalDAV"/><category scheme="http://www.blogger.com/atom/ns#" term="calendar"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="Harmattan"/><category scheme="http://www.blogger.com/atom/ns#" term="MeeGo"/><category scheme="http://www.blogger.com/atom/ns#" term="N9"/><category scheme="http://www.blogger.com/atom/ns#" term="N950"/><category scheme="http://www.blogger.com/atom/ns#" term="Nokia"/><category scheme="http://www.blogger.com/atom/ns#" term="sync"/><category scheme="http://www.blogger.com/atom/ns#" term="synchronisation"/><title type='text'>Nokia N9 and CalDAV on Google</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihDbevvcrKFJ9yjmXHCDixJVChEAZb4roYdCgYmnPctiwZWYQF0bgixzJIy0paCL8pa4Vg7MqSZl8jc37dMABruPoQJ8pFoDZ5LMFd-KdQp4gedzv2sBE8aCN4XcK8Fx1H53oOCPY8I9bk/s1600/nokia-n9-family.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;190&quot; width=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihDbevvcrKFJ9yjmXHCDixJVChEAZb4roYdCgYmnPctiwZWYQF0bgixzJIy0paCL8pa4Vg7MqSZl8jc37dMABruPoQJ8pFoDZ5LMFd-KdQp4gedzv2sBE8aCN4XcK8Fx1H53oOCPY8I9bk/s200/nokia-n9-family.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Wow! It&#39;s some 18 months since I last published anything here! Time to add a quick article that puts in one place the results of something I was looking at last night.&lt;br /&gt;&lt;br /&gt;

The idea here is to synchronise your Google calendar(s) with your N9 (and presumably N950 since they both run MeeGo Harmattan), which isn&#39;t that hard in itself. What caught me out and had me searching was how to sync &lt;em&gt;all&lt;/em&gt; my Google calendars with the phone.&lt;br /&gt;&lt;br /&gt;

&lt;u&gt;Single calendar&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;

In its most basic form, this system allows you to sync just your main Google calendar with a mobile device.&lt;br /&gt;&lt;br /&gt;

On your phone, go into &quot;Accounts&quot; and start setting up a new CalDAV account:

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGQJVuF1VY1npMUdUpSgMAZHW6E_r5h0MaqXaShPVFm_JnGjzL4bmCFkTrDjIO9MUYtH4125PYbelu-MeeLoi7dutbf1PibM2q6I7TZ4eWdMNlQLnLYXQm3XeCCWAji7P8nht4bymNOE2t/s1600/2012-03-07_13-29-30.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGQJVuF1VY1npMUdUpSgMAZHW6E_r5h0MaqXaShPVFm_JnGjzL4bmCFkTrDjIO9MUYtH4125PYbelu-MeeLoi7dutbf1PibM2q6I7TZ4eWdMNlQLnLYXQm3XeCCWAji7P8nht4bymNOE2t/s320/2012-03-07_13-29-30.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

Fill in your Google e-mail address (eg. your.name@googlemail.com) and your Google account password, and in the &quot;Server/URL&quot; field enter:

&lt;pre style=&quot;text-align: center;&quot;&gt;https://www.google.com/calendar/dav/&lt;/pre&gt;

Tap on the &quot;Sign in&quot; button and you will be presented with a page allowing you to set up the scheduling (just like with any synchronised account) and showing you the calendar that&#39;s going to be synced and added to your phone&#39;s calendar:

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0ukPFWS3KbxBHIE7sM2C-3QudfNE10ua5Q4C2OnTQeqXXMEIiBnX5DLZ025KpL7U2rItXs3ezy0Qba881G1kNAz4ZoZ6VudkxM8ARoWFSTBsVZGZBhjZp-8Xw_s9uU0YBP14LypxIdnTy/s1600/2012-03-07_13-29-07.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0ukPFWS3KbxBHIE7sM2C-3QudfNE10ua5Q4C2OnTQeqXXMEIiBnX5DLZ025KpL7U2rItXs3ezy0Qba881G1kNAz4ZoZ6VudkxM8ARoWFSTBsVZGZBhjZp-8Xw_s9uU0YBP14LypxIdnTy/s320/2012-03-07_13-29-07.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

What frustrated me was the fact that I actually have 2 calendars on my Google account and only one was showing up. I wanted both. Clearly, Google wasn&#39;t exporting both calendars.&lt;br /&gt;&lt;br /&gt;

&lt;u&gt;Multiple calendars&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;

Point your browser (mobile or desktop, it doesn&#39;t matter) at this URL:

&lt;pre style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://www.google.com/calendar/iphoneselect&quot; target=&quot;_blank&quot;&gt;https://www.google.com/calendar/iphoneselect&lt;/a&gt;&lt;/pre&gt;

You will see a list of the calendars you have and you will be able to select which ones are to be made accessible to CalDAV clients. Select those that you want to export and click on the &quot;Save&quot; button. Now go back to the CalDAV account on your phone, tap the &quot;Sync&quot; button, and all the accounts should appear and be added to the phone&#39;s calendar:

&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvM-CWqS8OAYejMSf1M1FuoQk844e9wajok94UYNZX43sDviCTzxV3YDOy0_cEKYJ-Hi3eEjCMx4LSPGsq9N_bcbiiq4bNVLbTsOCHegJlNBElhAPKFNQeai4fgu8XpESuIS0SQanDPXxk/s1600/2012-03-07_13-29-08.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvM-CWqS8OAYejMSf1M1FuoQk844e9wajok94UYNZX43sDviCTzxV3YDOy0_cEKYJ-Hi3eEjCMx4LSPGsq9N_bcbiiq4bNVLbTsOCHegJlNBElhAPKFNQeai4fgu8XpESuIS0SQanDPXxk/s320/2012-03-07_13-29-08.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

Furthermore, any changes made to events in those calendars and any new events added to them should make it to the online version on Google once everything has been synced again.&lt;br /&gt;&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/6778207660842635042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/6778207660842635042'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2012/03/nokia-n9-and-caldav-on-google.html' title='Nokia N9 and CalDAV on Google'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihDbevvcrKFJ9yjmXHCDixJVChEAZb4roYdCgYmnPctiwZWYQF0bgixzJIy0paCL8pa4Vg7MqSZl8jc37dMABruPoQJ8pFoDZ5LMFd-KdQp4gedzv2sBE8aCN4XcK8Fx1H53oOCPY8I9bk/s72-c/nokia-n9-family.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-5537173487439147083</id><published>2011-08-01T20:00:00.005+01:00</published><updated>2011-08-01T20:46:35.496+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="failure"/><category scheme="http://www.blogger.com/atom/ns#" term="messages"/><category scheme="http://www.blogger.com/atom/ns#" term="Nokia"/><category scheme="http://www.blogger.com/atom/ns#" term="OVI Suite"/><category scheme="http://www.blogger.com/atom/ns#" term="unread"/><title type='text'>Nokia OVI Suite and marking SMS messages read</title><content type='html'>Wow! Nearly 8 months have gone by since the last post I made on this blog. Those of you who know me offline will also know that life has been a bit of a rollercoaster for about 6 months, which kind of explains the lack of activity both here and on my &lt;a href=&quot;http://blog.horwits.com&quot; target=&quot;_blank&quot;&gt;other blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So here goes...&lt;br /&gt;&lt;br /&gt;How many of you have become irritated at Nokia OVI Suite&#39;s stubborn refusal to mark as read text messages that you have, well... read? Am I the only one?&lt;br /&gt;&lt;br /&gt;You can click wherever you like on a message marked as unread and nothing will change that status. I&#39;d read posts elsewhere that sugessted sorting the list of messages by date rather than grouped by contact but even that didn&#39;t work.&lt;br /&gt;&lt;br /&gt;The only thing left to do was to go into the message database and change the status of the messages manually. For this, go and grab yourself a copy of SQLite Expert available from &lt;a href=&quot;http://www.sqliteexpert.com/&quot; target=&quot;_blank&quot;&gt;sqliteexpert.com&lt;/a&gt;. The free, &quot;personal&quot; version will work fine for this, although I&#39;m sure the author would appreciate you purchasing a full version...&lt;br /&gt;&lt;br /&gt;Note that the instructions given here will only work as of versions of Nokia OVI Suite that were released around June or July 2011. I&#39;m using V3.1.1.80 here.&lt;br /&gt;&lt;br /&gt;Before going any further, make sure OVI Suite is not running (click on the green OVI icon in the notification tray and select &quot;Exit&quot;, simply closing the OVI Suite main window isn&#39;t enough). You don&#39;t want both it and SQLite Expert attempting to access the database at the same time and potentially lousing things up. &lt;br /&gt;&lt;br /&gt;Once you&#39;ve installed SQLite Expert, fire it up and then go to &quot;File&quot; / &quot;Open database&quot;. Browse to the following location:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;C:\Users\&lt;span style=&quot;font-style:italic;&quot;&gt;your_username&lt;/span&gt;\AppData\Local\Nokia\Nokia&amp;nbsp;Ovi&amp;nbsp;Suite\Messages\Database&lt;/tt&gt; and load the database called &lt;tt&gt;msg_db.sqlite&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;With that database open, you&#39;ll see a kind of tree view on the left and several tabs to its right. One of the tabs is called &#39;SQL&#39;. Click on it.&lt;br /&gt;&lt;br /&gt;Just below the tabs you&#39;ll now have a couple of lines in which to issue SQL queries to the database. Type in the following query and then click on the &quot;Execute SQL&quot; button. This will give you something like this (click on the image to see it in full resolution):&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;SELECT * FROM messages ORDER BY msg_time&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifRTgMCftfKGPBpGNcnyF5TrJeYp4nsZbwVhfLe4aqShTz7YvLw9hvLH2KRNhKubcjywLCRqE_nM9erRVcJvlb7K9hNChJwgwJ0YC-E-vfMfkgh_af5TWdhLjOLflFaENdmDAMBX0M2Zzl/s1600/data.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 223px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifRTgMCftfKGPBpGNcnyF5TrJeYp4nsZbwVhfLe4aqShTz7YvLw9hvLH2KRNhKubcjywLCRqE_nM9erRVcJvlb7K9hNChJwgwJ0YC-E-vfMfkgh_af5TWdhLjOLflFaENdmDAMBX0M2Zzl/s320/data.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5635971259079412898&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that bits of the output that are personal and that can identify my correspondents have been blurred in order to protect their privacy.&lt;br /&gt;&lt;br /&gt;The column that we&#39;re interested in here is the one headed &quot;&lt;tt&gt;msg_status&lt;/tt&gt;&quot;. I&#39;ve figured out that the value in this column is a bitmask of sorts. Even though I&#39;ve not been able to work out the meaning of every bit in the bitmask, I can say with relative certainty that the least but one significant bit (second from the right in binary notation) is the one that indicates whether the message is read or not. If the bit is set then the message is unread, if it is not set then the message is read.&lt;br /&gt;&lt;br /&gt;So, the idea is to reset that second bit in all of the messages and thus mark all the messages in the database as read because OVI Suite seems incapable of doing so itself. This can be achieved by performing a logical AND operation with a number in which all the bits except the second bit are set. Without going into the details of two&#39;s complement signed integers, I can tell you that the number -3 is the one to use. This SQL statement will do the dirty deed for you, so enter it in the area for SQL input anc click again on the &quot;Execute SQL&quot; button:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;UPDATE messages SET msg_status = msg_status &amp; -3&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKCSYJCaiYC-lD0bEK0_X0CIm5PTYsmgAodluPmshjfBW6OJU82uQVHX_NXA7os1uLvNEioNfRyE2_fAnk1Ro-k6bmPHPpqpukXzMp1eZHTONcbv0kTvEQA0FTucdTmhl-6xJYVYIcsDCD/s1600/update.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 223px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKCSYJCaiYC-lD0bEK0_X0CIm5PTYsmgAodluPmshjfBW6OJU82uQVHX_NXA7os1uLvNEioNfRyE2_fAnk1Ro-k6bmPHPpqpukXzMp1eZHTONcbv0kTvEQA0FTucdTmhl-6xJYVYIcsDCD/s320/update.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5635974553166734274&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That&#39;s it!&lt;br /&gt;&lt;br /&gt;(Optionally) go into &quot;File&quot; / &quot;Close database&quot;. Then exit SQLite Expert.&lt;br /&gt;&lt;br /&gt;You can now fire up OVI Suite again and all of those unread messages will now appear as read.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/5537173487439147083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/5537173487439147083'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2011/08/nokia-ovi-suite-and-marking-sms.html' title='Nokia OVI Suite and marking SMS messages read'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifRTgMCftfKGPBpGNcnyF5TrJeYp4nsZbwVhfLe4aqShTz7YvLw9hvLH2KRNhKubcjywLCRqE_nM9erRVcJvlb7K9hNChJwgwJ0YC-E-vfMfkgh_af5TWdhLjOLflFaENdmDAMBX0M2Zzl/s72-c/data.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-7277069464703259944</id><published>2010-12-04T12:54:00.011+00:00</published><updated>2010-12-06T10:53:08.347+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="namespace"/><category scheme="http://www.blogger.com/atom/ns#" term="object"/><title type='text'>Javascript/ECMAscript objects and namespaces</title><content type='html'>There seems to be quite a bit of confusion as to what these beasts are and what they&#39;re for. Hopefully, this article will clear up some of that confusion, although I certainly do not profess to be a real expert on any of the subjects herein and have simplified things before writing them down here.&lt;br /&gt;&lt;br /&gt;Reading up on the concepts dealt with here and implementing them was in fact prompted by a real-world problem that I came up against at work. Part of my work involves maintaining a control panel site, each page of which can contain multiple &quot;components&quot;. Each component comprises three elements most of the time: a PHP template file that handles the display, a PHP class that manages the mechanics of the back-end (often invoked via an &lt;a href=&quot;http://en.wikipedia.org/wiki/Ajax_%28programming%29&quot; target=&quot;_blank&quot;&gt;AJAX&lt;/a&gt; call) and, given that AJAX obviously involves &lt;a href=&quot;http://en.wikipedia.org/wiki/JavaScript&quot; target=&quot;_blank&quot;&gt;JavaScript&lt;/a&gt;, an associated JavaScript file containing data and functions that tie the display and the back-end together. Different components are written/maintained by different members of the development team and any single page can therefore contain components written by several developers. This situation can lead to clashes such as more than one JavaScript file containing functions or variables with the same name if we&#39;re not all very careful.&lt;br /&gt;&lt;br /&gt;Namespaces and objects provide a tidy way to clean up the global namespace. If each component on the page behaves as a self-contained entity then each developer can use the names he or she wants for the elements making up his/her JavaScript code without treading on anyone else&#39;s toes in the process. Each developer&#39;s work is tucked away in its own namespace or object and can&#39;t interfere with any other developer&#39;s work.&lt;br /&gt;&lt;br /&gt;So, how do we go about this tidy stuff?&lt;br /&gt;&lt;br /&gt;Firstly, let&#39;s look at the namespace approach.&lt;br /&gt;&lt;br /&gt;Consider this declaration of a generic object with a single property in JavaScript and an alert() that will display that property:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var myObject = { aNumber: 10 };&lt;br /&gt;alert(myObject.aNumber);&lt;/pre&gt;&lt;br /&gt;A namespace is merely an extension of this concept in that we&#39;re also adding functions to the object &lt;tt style=&quot;font-size: 90%;&quot;&gt;myObject&lt;/tt&gt;. Without them, the whole namespace thing is pretty pointless.&lt;br /&gt;&lt;br /&gt;Let&#39;s add a function to &lt;tt style=&quot;font-size: 90%;&quot;&gt;myObject&lt;/tt&gt; that displays the value &lt;tt style=&quot;font-size: 90%;&quot;&gt;aNumber&lt;/tt&gt; and add some indentation to make reading this stuff easier:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var myObject = {&lt;br /&gt;    aNumber:    10,&lt;br /&gt;    display:    function() { alert(this.aNumber); }&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;In order to get this working, you need to call the function called &lt;tt style=&quot;font-size: 90%;&quot;&gt;display&lt;/tt&gt; within the &lt;tt style=&quot;font-size: 90%;&quot;&gt;myObject&lt;/tt&gt; namespace:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;myObject.display();&lt;/pre&gt;&lt;br /&gt;Note the use of the reserved word &lt;tt style=&quot;font-size: 90%;&quot;&gt;this&lt;/tt&gt; used to refer to the property &lt;tt style=&quot;font-size: 90%;&quot;&gt;aNumber&lt;/tt&gt; belonging to the object whose &lt;tt style=&quot;font-size: 90%;&quot;&gt;display&lt;/tt&gt; method is being called.&lt;br /&gt;&lt;br /&gt;This example is obviously somewhat lame in that it is making a bit of a mountain out of a molehill. Using a namespace just to display an alert box is overkill, so let&#39;s get a bit more adventurous and create a simple guessing game. This should do the trick.&lt;br /&gt;&lt;br /&gt;First, the HTML for the page that is going to run the game:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt; &amp;lt;title&amp;gt;JavaScript guessing game&amp;lt;/title&amp;gt;&lt;br /&gt; &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html&quot; /&amp;gt;&lt;br /&gt; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;guessinggame.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&quot;text&quot; id=&quot;guess&quot; value=&quot;&quot; size=&quot;3&quot; /&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;button&quot; value=&quot;guess&quot; onclick=&quot;guessingGame.play()&quot; /&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;button&quot; id=&quot;startbutton&quot; value=&quot;start game&quot; onclick=&quot;guessingGame.start()&quot; /&amp;gt;&lt;br /&gt;&amp;lt;input type=&quot;button&quot; value=&quot;cheat!&quot; onclick=&quot;guessingGame.cheat()&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;Note that the text input box has been given the id &lt;tt style=&quot;font-size: 90%;&quot;&gt;guess&lt;/tt&gt; and the button to start the game has been given the id &lt;tt style=&quot;font-size: 90%;&quot;&gt;startbutton&lt;/tt&gt;. The text input and button are going to be accessed by the JavaScript.&lt;br /&gt;&lt;br /&gt;And now the JavaScript file, guessinggame.js:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var guessingGame = {&lt;br /&gt;&lt;br /&gt;  initialised: false,&lt;br /&gt;&lt;br /&gt;  found:       false,&lt;br /&gt;&lt;br /&gt;  numToGuess:  0,&lt;br /&gt;&lt;br /&gt;  start: function() {&lt;br /&gt;           this.numToGuess = 1 + Math.floor( Math.random() * 10 );&lt;br /&gt;           this.initialised = true;&lt;br /&gt;           this.found = false;&lt;br /&gt;           document.getElementById(&quot;startbutton&quot;).disabled = true;&lt;br /&gt;  },&lt;br /&gt;  &lt;br /&gt;  cheat: function() {&lt;br /&gt;           if ( !this.initialised )&lt;br /&gt;             alert(&quot;The game hasn&#39;t started so you can&#39;t cheat yet!&quot;);&lt;br /&gt;           else if ( this.found )&lt;br /&gt;             alert(&quot;You&#39;ve already found the answer, so why cheat now?&quot;);&lt;br /&gt;           else {&lt;br /&gt;             alert(&quot;The number to guess was: &quot; + this.numToGuess);&lt;br /&gt;             this.found = true;&lt;br /&gt;             document.getElementById(&quot;startbutton&quot;).disabled = false;&lt;br /&gt;           }&lt;br /&gt;  },&lt;br /&gt;  &lt;br /&gt;  play:  function() {&lt;br /&gt;           if ( !this.initialised )&lt;br /&gt;             alert(&quot;The game hasn&#39;t yet started. Start one before guessing&quot;);&lt;br /&gt;           else if ( this.found )&lt;br /&gt;             alert(&quot;The game is over, you already got the right number!&quot;);&lt;br /&gt;           else {&lt;br /&gt;             guess = parseInt(document.getElementById(&quot;guess&quot;).value);&lt;br /&gt;             if ( guess == this.numToGuess ) {&lt;br /&gt;               this.found = true;&lt;br /&gt;               document.getElementById(&quot;startbutton&quot;).disabled = false;&lt;br /&gt;               alert(&quot;Correct! The number was indeed &quot; + guess);&lt;br /&gt;             }&lt;br /&gt;             else&lt;br /&gt;               alert(&quot;Nope! Try again.&quot;);&lt;br /&gt;           }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;Our namespace, &lt;tt style=&quot;font-size: 90%;&quot;&gt;guessingGame&lt;/tt&gt; contains three properties: initialised, found and numToGuess. Note that all of these properties have to have something assigned to them when they are declared in the namespace. Unlike normal variables (or properties of an object declared as we&#39;ll see later on) they can&#39;t just be declared and have something assigned to them later on. Our namespace also contains three functions: start, cheat and play. How it all works should be pretty self-explanatory and is not the point of this article. What &lt;strong&gt;is&lt;/strong&gt; the point is the fact that despite there being six &quot;things&quot; to play with here, there is only &lt;strong&gt;ONE&lt;/strong&gt; thing in the global namespace: &lt;tt style=&quot;font-size: 90%;&quot;&gt;guessingGame&lt;/tt&gt;. This means that someone else can come along and write a similar game in a namespace containing similarly-named properties and functions, but as long as that new game&#39;s namespace has a different name, there will be no clashes whatsoever. Both can cohabit on the same page without any risk of confusion.&lt;br /&gt;&lt;br /&gt;While this is a neat way to prevent namespace collisions, we can do much better. Just like with any other form of object literal, anyone from inside or outside the object can access any of the data held within the namespace. If we opt for another approach, we can create objects that only expose to the outside world properties and methods that they want to make visible.&lt;br /&gt;&lt;br /&gt;Let&#39;s rewrite the guessing game, but alter it so that we only have 5 guesses before the game is considered to be over and the player to have failed. We will therefore have to add a &quot;guessesLeft&quot; property, set it to 5 when the game starts and decrement it each time the player makes a guess. Once it reaches zero, the game is over. If we go for the traditional namespace as above, it would be trivial for the player to obtain unlimited guesses by setting the &quot;guessesLeft&quot; property to a positive number before calling the &lt;tt style=&quot;font-size: 90%;&quot;&gt;play&lt;/tt&gt; function because that property is exposed to the outside world. This is how to avoid that situation using private properties.&lt;br /&gt;&lt;br /&gt;Consider this declaration of a very simple object:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var simpleObject = function() {&lt;br /&gt;  var aNumber = 10;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var myObject = new simpleObject();&lt;/pre&gt;&lt;br /&gt;The first three lines define the class of our to-be object and give a name to that structure: &lt;tt style=&quot;font-size: 90%;&quot;&gt;simpleObject&lt;/tt&gt;. The function defined in this way also acts as the constructor of that class. The last line actually instantiates that class. The object &lt;tt style=&quot;font-size: 90%;&quot;&gt;myObject&lt;/tt&gt; is now an instance of the &lt;tt style=&quot;font-size: 90%;&quot;&gt;simpleObject&lt;/tt&gt; class.&lt;br /&gt;&lt;br /&gt;If you now try to display the property &lt;tt style=&quot;font-size: 90%;&quot;&gt;aNumber&lt;/tt&gt; using something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;alert(myObject.aNumber);&lt;/pre&gt;&lt;br /&gt;All you&#39;ll get back is the response &quot;undefined&quot;.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;Because &lt;tt style=&quot;font-size: 90%;&quot;&gt;aNumber&lt;/tt&gt; is a &lt;u&gt;private&lt;/u&gt; property of the object. It can only be seen from within that instance of the object (or within a so-called &quot;privileged&quot; method that we&#39;ll be dealing with later). If you want to be able to use a property of an object, it must be a &lt;u&gt;public&lt;/u&gt; property:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var simpleObject = function() {&lt;br /&gt;  this.aNumber = 10;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var myObject = new simpleObject();&lt;br /&gt;alert(myObject.aNumber);&lt;/pre&gt;&lt;br /&gt;This time you get the expected result.&lt;br /&gt;&lt;br /&gt;Rather than access the public property directly, let&#39;s now create a method of the &lt;tt style=&quot;font-size: 90%;&quot;&gt;simpleObject&lt;/tt&gt; called &quot;disp&quot; that we can call and that will display the value of that property:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var simpleObject = function() {&lt;br /&gt;&lt;br /&gt;  this.aNumber = 10;&lt;br /&gt;&lt;br /&gt;  function disp() {&lt;br /&gt;    alert(this.aNumber);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var myObject = new simpleObject();&lt;br /&gt;&lt;br /&gt;myObject.disp();&lt;/pre&gt;&lt;br /&gt;Uh oh... That didn&#39;t work! Why? Because &quot;disp&quot; is a private method and as such is not visible from the outside world! We need to create &quot;disp&quot; as a &lt;u&gt;public&lt;/u&gt; method if we want to be able to invoke it from the global namespace. There are two ways of doing this. The first way is simply to add the method to &lt;tt style=&quot;font-size: 90%;&quot;&gt;myObject&lt;/tt&gt;, our instance of the &lt;tt style=&quot;font-size: 90%;&quot;&gt;simpleObject&lt;/tt&gt; class:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var simpleObject = function() {&lt;br /&gt;  this.aNumber = 10;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var myObject = new simpleObject();&lt;br /&gt;myObject.disp = function() { alert(this.aNumber); };&lt;br /&gt;&lt;br /&gt;myObject.disp();&lt;/pre&gt;&lt;br /&gt;The other way is to add the method to the definition of the class itself by adding it to the &quot;prototype&quot; property of that class:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var simpleObject = function() {&lt;br /&gt;  this.aNumber = 10;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var myObject = new simpleObject();&lt;br /&gt;simpleObject.prototype.disp = function() { alert(this.aNumber); };&lt;br /&gt;&lt;br /&gt;myObject.disp();&lt;/pre&gt;&lt;br /&gt;The first way is the &quot;quick and dirty&quot; way of doing it and is just as effective as the second way unless you have created multiple instances of the class and/or you have created other classes that build upon your base class &lt;tt style=&quot;font-size: 90%;&quot;&gt;simpleObject&lt;/tt&gt;. If this is the case then, with the first method, you have to add the method to each instance, which can be laborious, not to mention inefficient with the method being stored as many times as there are instances. With the second solution, by adding the method to the class prototype, it immediately becomes available to all instances of the class and of classes derived from it. To boot, it is only stored once, which is more in line with the whole philosophy of object-oriented programming, re-use of code and all that.&lt;br /&gt;&lt;br /&gt;Let&#39;s change our class slightly to add a private property and try and access it using a public method:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var simpleObject = function() {&lt;br /&gt;  var privatenum = 20;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var myObject = new simpleObject();&lt;br /&gt;myObject.disp = function() { alert(this.privateNum); };&lt;/pre&gt;&lt;br /&gt;Uh oh... That didn&#39;t work either! Why? Because public methods can only access public properties, not private properties.&lt;br /&gt;&lt;br /&gt;Enter the &lt;u&gt;privileged&lt;/u&gt; method:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var simpleObject = function() {&lt;br /&gt;&lt;br /&gt;  var privatePr = &#39;private property&#39;;&lt;br /&gt;  this.publicPr = &#39;public property&#39;;&lt;br /&gt;&lt;br /&gt;  this.disp = function() {&lt;br /&gt;    alert(privatePr + &quot; / &quot; + this.publicPr);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var myObject = new simpleObject();&lt;br /&gt;myObject.disp();&lt;/pre&gt;&lt;br /&gt;That&#39;s better! This shows that a privileged method can access not only public properties of an object but also that object&#39;s private properties.&lt;br /&gt;&lt;br /&gt;So far we&#39;ve seen private and public properties and we&#39;ve accessed them using public and privilieged methods. One thing we&#39;ve not yet been able to use is a &lt;u&gt;private&lt;/u&gt; method.&lt;br /&gt;&lt;br /&gt;Just like private properties, private methods can be used by privileged methods (and by other private methods). This is useful if, for example, there are multiple privileged methods that perform similar operations. Whatever is common to all of the privileged methods can be stored in a private method that is invoked by each of them.&lt;br /&gt;&lt;br /&gt;It is now time to rewrite the guessing game, but this time using an object and building in the limited number of guesses. You will not need to change the HTML of the previous guessing game, only the JavaScript:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var gameObject = function() {&lt;br /&gt;&lt;br /&gt;  var guessesLeft;&lt;br /&gt;  var found;&lt;br /&gt;  var numToGuess;&lt;br /&gt;  var yourGuess;&lt;br /&gt;  var initialised = false;&lt;br /&gt;  &lt;br /&gt;  this.start = function() {&lt;br /&gt;    guessesLeft = 5;&lt;br /&gt;    found = false;&lt;br /&gt;    numToGuess = 1 + Math.floor( Math.random() * 10 );&lt;br /&gt;    document.getElementById(&quot;startbutton&quot;).disabled = true;&lt;br /&gt;    initialised = true;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  this.cheat = function() {&lt;br /&gt;    if ( !initialised )&lt;br /&gt;      alert(&quot;You can&#39;t cheat before even starting the game!&quot;);&lt;br /&gt;    else if ( found )&lt;br /&gt;      alert(&quot;You already found the number, why cheat now?&quot;);&lt;br /&gt;    else {&lt;br /&gt;      alert(&quot;The number to guess was: &quot; + numToGuess);&lt;br /&gt;      gameOver();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  this.play = function() {&lt;br /&gt;    if ( !initialised )&lt;br /&gt;      alert(&quot;Start a game before guessing!&quot;);&lt;br /&gt;    else if ( found )&lt;br /&gt;      alert(&quot;You already guessed the number, the game is over!&quot;);&lt;br /&gt;    else if ( guessesLeft &amp;gt; 0 ) {&lt;br /&gt;      yourGuess = parseInt(document.getElementById(&quot;guess&quot;).value);&lt;br /&gt;      if ( yourGuess == numToGuess ) {&lt;br /&gt;        alert(&quot;Congratulations! You guessed that the secret number was &quot;&lt;br /&gt;              + numToGuess + &quot; with &quot; + --guessesLeft + &quot; guess(es) left.&quot;);&lt;br /&gt;        gameOver();&lt;br /&gt;      }&lt;br /&gt;      else {&lt;br /&gt;        if ( --guessesLeft &amp;gt; 0 )&lt;br /&gt;          alert(&quot;Nope. Try again. You have &quot; + guessesLeft + &quot; guess(es) left.&quot;);&lt;br /&gt;        else {&lt;br /&gt;          alert(&quot;Nope. You&#39;re out of guesses!&quot;);&lt;br /&gt;          gameOver();&lt;br /&gt;        }&lt;br /&gt;        document.getElementById(&quot;guess&quot;).value = &#39;&#39;;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    else alert(&quot;Sorry, you&#39;ve already run out of guesses!&quot;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  function gameOver() {&lt;br /&gt;    found = true;&lt;br /&gt;    document.getElementById(&quot;startbutton&quot;).disabled = false;&lt;br /&gt;    document.getElementById(&quot;guess&quot;).value = &#39;&#39;;&lt;br /&gt;    alert(&quot;Game over!&quot;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var guessingGame = new gameObject();&lt;/pre&gt;&lt;br /&gt;The interesting thing here is that the only things we&#39;re exposing to the outside world in this object are the three privileged methods: start, play and cheat. As in the previous incarnation of this game, the cheat() method gives the answer but ends the game there and then. You don&#39;t get the satisfaction of being congratulated for entering the right number if you had to ask for it! Using the earlier solution for this game, it would have been possible to access any &lt;tt style=&quot;font-size: 90%;&quot;&gt;guessesLeft&lt;/tt&gt; property and fiddle with it before submitting a guess, thus having an infinite amount of guesses. With this approach, the number of guesses remaining is available only to the instance of the class because it is all held in &lt;u&gt;private&lt;/u&gt; properties.&lt;br /&gt;&lt;br /&gt;So, to recap:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Private properties:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Declaration:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var myClass = function() {&lt;br /&gt;  var privateProperty;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;Can be accessed by: private methods and privileged methods.&lt;br /&gt;Are not visible outside the object&#39;s scope.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Public properties:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Declaration:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var myClass = function() {&lt;br /&gt;  this.publicProperty = &#39;whatever&#39;;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;Can be accessed by: public methods, private methods(*), privileged methods.&lt;br /&gt;Are visible outside the object&#39;s scope.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Private methods:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Declaration:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var myClass = function() {&lt;br /&gt;  function privateMethod() {&lt;br /&gt;    /* stuff goes here */&lt;br /&gt;  }&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;Can access: public methods(*), other private methods, privileged methods(*), private properties, public properties(*).&lt;br /&gt;Can be accessed by: other private methods, privileged methods.&lt;br /&gt;Are not visible outside the object&#39;s scope.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Public methods:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Declaration:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;yourObject.publicMethod = function() {&lt;br /&gt;  /* stuff goes here */&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;- or -&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;yourClass.prototype.publicMethod = function() {&lt;br /&gt;  /* stuff goes here */&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;Can access: other public methods, privileged methods, public properties.&lt;br /&gt;Can be accessed by: other public methods, private methods(*), privileged methods.&lt;br /&gt;Are visible outside the object&#39;s scope.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Privileged methods:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Declaration:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var myClass = function() {&lt;br /&gt;  this.privilegedMethod = function() {&lt;br /&gt;    /* stuff goes here */&lt;br /&gt;  };&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;Can access: private methods, public methods, other privileged methods, private properties, public properties.&lt;br /&gt;Can be accessed by: public methods, private methods(*), other privileged methods.&lt;br /&gt;Are visible outside the object&#39;s scope.&lt;br /&gt;&lt;br /&gt;The more astute readers will have noticed that an asterisk appears sometimes when it comes to private methods&#39; access to public properties and methods and privileged methods. This is down to an error in the implementation of ECMA-262 where &lt;tt style=&quot;font-size: 90%;&quot;&gt;this&lt;/tt&gt; incorrectly references the &lt;tt style=&quot;font-size: 90%;&quot;&gt;window&lt;/tt&gt; object in private methods called by another method of an object when it should reference the object in which the method is running. Consider this scenario:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var myClass = function() {&lt;br /&gt;&lt;br /&gt;  this.publProp = &#39;I am a public property of myClass&#39;;&lt;br /&gt;&lt;br /&gt;  this.privilegedMeth = function() { privMeth(); };&lt;br /&gt;  &lt;br /&gt;  function privMeth() { alert(this.publProp); }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var myObj = new myClass();&lt;br /&gt;myObj.privilegedMeth();&lt;/pre&gt;&lt;br /&gt;This &lt;em&gt;should&lt;/em&gt; work. Upon invoking &lt;tt style=&quot;font-size: 90%;&quot;&gt;myObj.privilegedMeth()&lt;/tt&gt;, the private method &lt;tt style=&quot;font-size: 90%;&quot;&gt;privMeth()&lt;/tt&gt; is invoked. This, in turn should be able to access the public property &lt;tt style=&quot;font-size: 90%;&quot;&gt;publProp&lt;/tt&gt; and display it in an alert box. Well, it doesn&#39;t, because once execution enters the private method, &lt;tt style=&quot;font-size: 90%;&quot;&gt;this&lt;/tt&gt; no longer references your instance of the &lt;tt style=&quot;font-size: 90%;&quot;&gt;myClass&lt;/tt&gt; class, &lt;tt style=&quot;font-size: 90%;&quot;&gt;myObj&lt;/tt&gt;. Instead, it references &lt;tt style=&quot;font-size: 90%;&quot;&gt;window&lt;/tt&gt;. Given that global variables and functions are actually properties and methods of &lt;tt style=&quot;font-size: 90%;&quot;&gt;window&lt;/tt&gt;, you can see this in action by creating a global variable called &lt;tt style=&quot;font-size: 90%;&quot;&gt;publProp&lt;/tt&gt; and giving it a content different from the public property of your object:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var publProp = &#39;variable in the global namespace&#39;;&lt;br /&gt;&lt;br /&gt;var myClass = function() {&lt;br /&gt;&lt;br /&gt;  this.publProp = &#39;I am a public property of myClass&#39;;&lt;br /&gt;&lt;br /&gt;  this.privilegedMeth = function() { privMeth(); };&lt;br /&gt;  &lt;br /&gt;  function privMeth() { alert(this.publProp); }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var myObj = new myClass();&lt;br /&gt;myObj.privilegedMeth();&lt;/pre&gt;&lt;br /&gt;An alert box saying &quot;variable in the global namespace&quot; will be displayed, which is definitely not the expected behaviour!&lt;br /&gt;&lt;br /&gt;We can get around this problem with a bit of a kludge. We create a private property (usually called &lt;tt style=&quot;font-size: 90%;&quot;&gt;that&lt;/tt&gt;, but &quot;that&quot; is a matter of personal taste...) and assign the value of &lt;tt style=&quot;font-size: 90%;&quot;&gt;this&lt;/tt&gt; to it when the object is instantiated. Thereafter, we prefix the public and privileged data we want to access from within the private method with &quot;that.&quot; instead of &quot;this.&quot; and everything works again because &lt;tt style=&quot;font-size: 90%;&quot;&gt;that&lt;/tt&gt; hasn&#39;t changed since the object was instantiated (whereas &lt;tt style=&quot;font-size: 90%;&quot;&gt;this&lt;/tt&gt; now references &lt;tt style=&quot;font-size: 90%;&quot;&gt;window&lt;/tt&gt;). The code snippet above becomes:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var myClass = function() {&lt;br /&gt;&lt;br /&gt;  var that = this;&lt;br /&gt;  this.publProp = &#39;I am a public property of myClass&#39;;&lt;br /&gt;&lt;br /&gt;  this.privilegedMeth = function() { privMeth(); };&lt;br /&gt;&lt;br /&gt;  function privMeth() { alert(that.publProp); }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var myObj = new myClass();&lt;br /&gt;myObj.privilegedMeth();&lt;/pre&gt;&lt;br /&gt;You now get the expected result.&lt;br /&gt;&lt;br /&gt;So, the point of this article was to explain how to tidy up the potential mess that can arise when multiple scripts are included in a web page. It explored two ways to achieve that and outlined the main differences between them. In doing so it highlighted a pitfall that&#39;s the result of a flaw in most browsers&#39; implementation of ECMA-262 and provided a way to bypass that flaw.&lt;br /&gt;&lt;br /&gt;Obviously, much more complex stuff can be done than was explored here. For starters, none of the functions and methods given as examples actually take any parameters, while nothing&#39;s to stop them doing so. The constructor can also take parameters. For example, in the guessing game object, we can set the maximum allowable number of guesses by saying how many we want to allow the player in the constructor:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;margin: 0; font-size: 90%;&quot;&gt;var gameObject = function(maxG) {&lt;br /&gt;&lt;br /&gt;  var guessesLeft;&lt;br /&gt;  var found;&lt;br /&gt;  var numToGuess;&lt;br /&gt;  var yourGuess;&lt;br /&gt;  var initialised = false;&lt;br /&gt;  var maxGuesses = maxG;&lt;br /&gt;&lt;br /&gt;  this.start = function() {&lt;br /&gt;    guessesLeft = maxGuesses;&lt;br /&gt;    found = false;&lt;br /&gt;    numToGuess = 1 + Math.floor( Math.random() * 10 );&lt;br /&gt;    document.getElementById(&quot;startbutton&quot;).disabled = true;&lt;br /&gt;    initialised = true;&lt;br /&gt;  }&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var guessingGame = new gameObject(3);&lt;/pre&gt;&lt;br /&gt;This time, when the class is instantiated, the parameter passed to the constructor, the value 3, is assigned to the private property &lt;tt style=&quot;font-size: 90%;&quot;&gt;maxGuesses&lt;/tt&gt;. When the privileged method &lt;tt style=&quot;font-size: 90%;&quot;&gt;start()&lt;/tt&gt; is called, we no longer blindly assign the value 5 to the private property &lt;tt style=&quot;font-size: 90%;&quot;&gt;guessesLeft&lt;/tt&gt;, we assign &lt;tt style=&quot;font-size: 90%;&quot;&gt;maxGuesses&lt;/tt&gt; to it. We have, in effect, created a variant of the game in which only 3 (the value passed to the constructor) guesses are permitted.&lt;br /&gt;&lt;br /&gt;References to methods can also be passed to functions and used as callbacks. This is used frequently in the AJAX subsystems of &lt;a href=&quot;http://www.prototypejs.org&quot; target=&quot;_blank&quot;&gt;Prototype&lt;/a&gt; and &lt;a href=&quot;http://jquery.com/&quot; target=&quot;_blank&quot;&gt;jQuery&lt;/a&gt;, where you pass a reference of a function to be called when the AJAX call has completed. You can pass a reference to a private, public or privileged method, although you might have to use the old &quot;that&quot; trick if you want to pass a reference to a public or privileged method when setting up the AJAX call from within a private method. You can also use Prototype&#39;s &lt;a href=&quot;http://api.prototypejs.org/language/Function/prototype/bind/&quot; target=&quot;_bind&quot;&gt;&lt;tt style=&quot;font-size: 90%;&quot;&gt;bind&lt;/tt&gt;&lt;/a&gt; method to ensure that your methods run in the desired scope/context.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7277069464703259944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7277069464703259944'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2010/12/javascriptecmascript-objects-and.html' title='Javascript/ECMAscript objects and namespaces'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-7768469502701126703</id><published>2010-09-18T17:00:00.006+01:00</published><updated>2010-09-19T20:10:09.933+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="E72"/><category scheme="http://www.blogger.com/atom/ns#" term="firmware"/><category scheme="http://www.blogger.com/atom/ns#" term="Firmware Over-The-Air"/><category scheme="http://www.blogger.com/atom/ns#" term="FOTA"/><category scheme="http://www.blogger.com/atom/ns#" term="Nokia"/><category scheme="http://www.blogger.com/atom/ns#" term="Nokia Software Updater"/><category scheme="http://www.blogger.com/atom/ns#" term="NSU"/><category scheme="http://www.blogger.com/atom/ns#" term="V51"/><category scheme="http://www.blogger.com/atom/ns#" term="vlingo"/><title type='text'>Nokia E72 firmware version V51</title><content type='html'>Nokia released a major update for the E72 handset in September 2010. The previous version was V31, so V40 and V50 weren&#39;t even released to the public. According to many online resources there are something like 450 bugfixes in V51. There are also some new features that some people would consider to be bugs, and curiously enough, some pieces of software appear to have been &lt;i&gt;down&lt;/i&gt;graded between versions V31 and V51.&lt;br /&gt;&lt;br /&gt;V51 is currently available via Nokia Software Updater and as Firmware-over-the-air.&lt;br /&gt;&lt;br /&gt;There are various sources of information on the internet listing things that are supposed to have changed. What I&#39;d like to do here is give you an idea of what the new firmware feels like, which is something you can&#39;t put on paper.&lt;br /&gt;&lt;br /&gt;Visually, very little has changed. To be honest, the only difference I&#39;ve noticed is a smaller clock at the bottom of the screen.&lt;br /&gt;&lt;br /&gt;People who tend to use the keypad to select elements in the phone&#39;s menus will be pleased to hear that the &#39;7&#39; and &#39;8&#39; keys can now be used again. That ability was removed in V31 for some reason or other.&lt;br /&gt;&lt;br /&gt;The menus do seem a little more responsive generally, although the digits still take ages to display while you&#39;re dialling a number.&lt;br /&gt;&lt;br /&gt;The voice control application, vlingo, does get in the way when you start the phone up for the first time. Although it starts in the background and you can kill the application by long-pressing the menu key, scrolling to the vlingo icon and pressing the delete key, it starts again next time you start the phone, and will carry on doing so until you tell it not to.&lt;br /&gt;&lt;br /&gt;The way to do this is not self-evident at all. Nor is why you should have to do this in the first place because the E72 already has built-in recognition of voice commands without the need for third-party software. Carry on answering questions asked by the application as if you were planning on using it until you get to the page where you&#39;re invited to hold down the &quot;voice activation&quot; key, speak a phrase into the microphone and then release the voice activation key. The thing is, you&#39;re invited to press the &quot;back&quot; key instead of the voice activation key (on the side of the phone between the volume/zoom keys), so you end up in an endless loop and cannot complete the settings and get rid of vlingo.&lt;br /&gt;&lt;br /&gt;Instead of holding the voice activation key, start typing some text instead. You will be informed that you can indeed input text directly and asked if you want to skip the voice configuration. You can then proceed to the next pages in the configuration process and at some point you will be asked if you want vlingo to start when the phone starts. This is where you can say &quot;no&quot; and no longer be bothered with the software.&lt;br /&gt;&lt;br /&gt;Even though we are all told that the browser, media player and messaging application have been updated, there is no perceptible change.&lt;br /&gt;&lt;br /&gt;Adobe Reader LE is a useful piece of software for reading PDF files. The trouble is, many recent PDF files require Adobe LE 2.5, which came with firmware V31. Firmware V51 &lt;b&gt;downgrades&lt;/b&gt; Adobe LE to version 1.5. I have no idea why this is.&lt;br /&gt;&lt;br /&gt;Up until now, the keypad autolock would only kick in if you were on the standby screen. Go into the menu or into any application and the keypad would no longer lock. With V51, the keypad will lock automatically regardless of the screen you&#39;re on. Some people are calling this a &quot;bug&quot; (probably because it&#39;s a change from what they were used to), I think that it makes things more consistent and I welcome the change.&lt;br /&gt;&lt;br /&gt;I think some optimisation has taken place in order to reduce power consumption and thus get more life out of the battery. Under normal circumstances, the battery indicator will show &quot;full&quot; for most of the battery&#39;s charge cycle. Once it drops a bar, the battery is usually flat within 24 hours. The gauge had dropped a bar yesterday morning, and this evening, about 34 hours later, it is still on 3 bars, and that is with the WLAN switched on almost permanently (I use the E72 as a VoIP/SIP phone). So, instead of being flat as a pancake in 24 hours, it has only dropped by 3 bars in half as long again. That&#39;s a definite improvement.&lt;br /&gt;&lt;br /&gt;The e-mail client &lt;i&gt;still&lt;/i&gt; doesn&#39;t use the &quot;destinations&quot; feature. You can only set it to use a given access point to connect to a mailbox. Thankfully, SmartConnect is included in the firmware, so you can get around the problem by using that. It didn&#39;t work with V31. BirdStep had to provide a patch to get it working. I don&#39;t know if the new version works or not on its own since the patch from BirdStep is still installed on my E72 after the update to V31.&lt;br /&gt;&lt;br /&gt;Reading the &lt;a href=&quot;http://www.nokia.com/discussions&quot; target=&quot;_blank&quot;&gt;Nokia Support Discussions&lt;/a&gt; forum, you will hear about various problems that people say that they have had. Among the problems I&#39;ve seen, there are:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I don&#39;t see the names of people calling me, only the number.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;It&#39;s unlikely that that happened since the update. Read &lt;a href=&quot;http://techy.horwits.com/2009/09/problems-with-caller-id.html&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The phone has become unstable and never stops crashing.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This is the same as any update on any phone. The usual things to try are to clear the phone&#39;s settings (*#7780#) or to attempt a re-install of the firmware.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I can&#39;t zoom into pictures using the gallery, only using the file manager.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Can&#39;t say I&#39;ve noticed this. I just tried to do just that and the zoom works fine in the gallery.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Received calls are no longer logged!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Can&#39;t say I&#39;ve noticed this either. They are logged on my handset.&lt;br /&gt;&lt;br /&gt;This and many other problems reported can most likely be solved in the same way as the general instability problem.&lt;br /&gt;&lt;br /&gt;In short, the update is positive, I think, but I fail to understand why a whole major version has been skipped. The changes made do not justify such a version jump in my opinion.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7768469502701126703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/7768469502701126703'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2010/09/nokia-e72-firmware-version-v51.html' title='Nokia E72 firmware version V51'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-924759405869402691</id><published>2010-02-12T13:43:00.006+00:00</published><updated>2010-02-12T13:55:16.216+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="location based"/><category scheme="http://www.blogger.com/atom/ns#" term="N900"/><category scheme="http://www.blogger.com/atom/ns#" term="Nokia"/><category scheme="http://www.blogger.com/atom/ns#" term="WomWorld"/><title type='text'>WOMWorld/Nokia &quot;Experiences&quot;</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4QQzdk-2WhnKoPoqheai4BYXorYwRVVeQITWDsPK56WxkZJY3FL4DwW8TnfOdj5Jmf9HrqnSwY4Ob-eDsp8-pEs1jqBFcIqFxl0LsjgQN9mN-XzROyDyWOKpZzpOP_OpPm5LQQy4CNPmb/s1600-h/logo.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 270px; height: 65px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4QQzdk-2WhnKoPoqheai4BYXorYwRVVeQITWDsPK56WxkZJY3FL4DwW8TnfOdj5Jmf9HrqnSwY4Ob-eDsp8-pEs1jqBFcIqFxl0LsjgQN9mN-XzROyDyWOKpZzpOP_OpPm5LQQy4CNPmb/s400/logo.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5437352461297849042&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;WOMWorld/Nokia have recently unveiled their &quot;Experiences&quot; page. It offers a view of the devices they currently have out on loan and the cities where said devices are currently being evaluated.&lt;br /&gt;&lt;br /&gt;Privacy concerns mean that the devices are mapped only to the city where they&#39;ve been sent, not to the actual address of the person trying the device out. For example, as of writing this, there&#39;s the indication of an N900 (the one sitting next to me on the arm of my sofa) in Bolton when in actual fact I am in Horwich, which is a few miles West of Bolton.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a style=&quot;font-style: italic;&quot; href=&quot;http://www.womworld.com/nokia/category/devices/&quot; target=&quot;_blank&quot;&gt;WOMWorld/Nokia Experiences&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I&#39;m not sure exactly what the purpose of this is but hey, it&#39;s fun, right? It certainly seems to fit in with the current craze for location-based services such as OVI location sharing, geotagging on twitter, Google Buzz etc.&lt;br /&gt;&lt;br /&gt;Speaking of the N900 I have here, I still have just over a week to evaluate it. I&#39;ll digest my findings and report back shortly thereafter.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/924759405869402691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/924759405869402691'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2010/02/womworldnokia-experiences.html' title='WOMWorld/Nokia &quot;Experiences&quot;'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4QQzdk-2WhnKoPoqheai4BYXorYwRVVeQITWDsPK56WxkZJY3FL4DwW8TnfOdj5Jmf9HrqnSwY4Ob-eDsp8-pEs1jqBFcIqFxl0LsjgQN9mN-XzROyDyWOKpZzpOP_OpPm5LQQy4CNPmb/s72-c/logo.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3697832350934094119.post-126001712236795829</id><published>2010-02-05T20:51:00.008+00:00</published><updated>2010-02-05T21:09:10.855+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3G"/><category scheme="http://www.blogger.com/atom/ns#" term="Access Gateway"/><category scheme="http://www.blogger.com/atom/ns#" term="femtocell"/><category scheme="http://www.blogger.com/atom/ns#" term="fring"/><category scheme="http://www.blogger.com/atom/ns#" term="nimbuzz"/><category scheme="http://www.blogger.com/atom/ns#" term="SIP"/><category scheme="http://www.blogger.com/atom/ns#" term="truphone"/><category scheme="http://www.blogger.com/atom/ns#" term="Vodafone"/><category scheme="http://www.blogger.com/atom/ns#" term="VoIP"/><category scheme="http://www.blogger.com/atom/ns#" term="voipfone.co.uk"/><category scheme="http://www.blogger.com/atom/ns#" term="voiptalk.org"/><category scheme="http://www.blogger.com/atom/ns#" term="wifi"/><title type='text'>Vodafone Access Gateway femtocell</title><content type='html'>&lt;b&gt;Or, How To Spend Lots Of Money And Then Pay For Your Mobile Calls Twice&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpvmjIuVAxnptgJD_7R61nyhD96J4QazbrK7vdp2hLwbmcUsBgWvoD9oItkXzWyBUwxWTv50jk8sMPWvvTnjJhTz-3-xyA2M4-DdKhbRbO8gizOyvAUlLY9Wb2igmw_4EEmyAVp8oZPcg/s1600-h/vodafone_access_gateway_2.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 160px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpvmjIuVAxnptgJD_7R61nyhD96J4QazbrK7vdp2hLwbmcUsBgWvoD9oItkXzWyBUwxWTv50jk8sMPWvvTnjJhTz-3-xyA2M4-DdKhbRbO8gizOyvAUlLY9Wb2igmw_4EEmyAVp8oZPcg/s400/vodafone_access_gateway_2.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5434800404357620802&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;There&#39;s no denying that this product can be of use if you&#39;re in the unfortunate position of needing 3G coverage from Vodafone UK and from no other operator. If this is the case and you have a decent enough broadband connection then this product will certainly fit the bill. There is, however, a more sinister side to it in that the business model used to place it on the market do leave a little to be desired. Let me elaborate...&lt;br /&gt;&lt;br /&gt;&lt;u&gt;What is a femtocell and how does it work?&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;You know those mobile phone towers that everybody wants near enough to have great mobile phone coverage but not in their own back yard? This is one of those that&#39;s been very much scaled down both in size and in terms of power output. A big, outdoors mast has its radio tranceivers on the top and equipment in the cabinet at the foot of the mast to connect the signals directly to the operator&#39;s backhaul network. This one here has tiny tranceivers in the housing that emit a fraction of the radiation, just enough to give you a good 3G signal for your phone within your home, and it uses your home broadband internet connection to tunnel into Vodafone&#39;s own network. In effect, you have a base station in your home.&lt;br /&gt;&lt;br /&gt;This base station allows you to place and receive calls and to connect your phone to the internet using the 3G signal.&lt;br /&gt;&lt;br /&gt;In theory...&lt;br /&gt;&lt;br /&gt;Also, this device is 3G &lt;i&gt;only&lt;/i&gt;, no GSM signal is broadcast. If your mobile phone is not a 3G phone, it will not work with this device.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;A few figures&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;The Access Gateway femtocell requires that phones be registered to it in order for them to be able to use it. It provides a web-based interface allowing you to register up to 30 Vodafone numbers with it. Only 4 phones can be connected to it and use it simultaneously.&lt;br /&gt;&lt;br /&gt;Vodafone are selling this piece of kit at prices ranging from £50 to £160 up front or at £5/month, depending on what level of service you want and already have.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;So, what&#39;s the problem?&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;On the face of it, it looks like a useful piece of kit providing 3G coverage where there was none before. However...&lt;br /&gt;&lt;br /&gt;There have been numerous complaints (head over to Vodafone&#39;s user forums if you want to see for yourself) about the kit not actually working. Apparently a phone will show a full 3G signal and the VAG tell you that all is well when in fact you are not connected to Vodafone&#39;s network at all. You will miss calls and you won&#39;t even know about it until you try (and fail) to place a call yourself.&lt;br /&gt;&lt;br /&gt;Whenever your phone connects to a base station (and this device &lt;i&gt;is&lt;/i&gt; a base station even though it&#39;s a lot smaller), your operator&#39;s network is updated with the ID of the base station you&#39;re connected to. When someone tries to call you, the network knows which base station to use in order to reach your phone. This sometimes (frequently?) doesn&#39;t work how it should, meaning that Vodafone doesn&#39;t know that you&#39;re connected via your femtocell and therefore can&#39;t reach you.&lt;br /&gt;&lt;br /&gt;The &quot;solution&quot; proffered by Vodafone is to power-cycle the femtocell. Having to switch a device off and on again in order to make it work reliably is obviously not a perfect situation...&lt;br /&gt;&lt;br /&gt;Other than technical issues there are commercial and financial implications. By selling you one of these femtocells, the operator is, in essence, admitting that the service you&#39;re already paying for in your mobile phone bills is not up to scratch. It is then making you pay (again) for the hardware to solve that problem.&lt;br /&gt;&lt;br /&gt;But that&#39;s not all, it gets better!&lt;br /&gt;&lt;br /&gt;This femtocell uses your broadband connection. So, not only are you paying for the hardware, but you&#39;re also paying for the network connectivity. Those of you with capped data contracts will have to remember that the data used by the femtocell will be counted in your monthly allowance.&lt;br /&gt;&lt;br /&gt;Wait... There&#39;s even more...&lt;br /&gt;&lt;br /&gt;Not only are you using your own internet connection and hardware that you&#39;ve had to pay for to extend Vodafone&#39;s network at your expense, but you&#39;re not even getting a discount on your mobile calls.&lt;br /&gt;&lt;br /&gt;Here&#39;s the best bit...&lt;br /&gt;&lt;br /&gt;If you happen to use Vodafone&#39;s home broadband service, when you use the femtocell to place calls on your Vodafone mobile, the data sent over the internet connection is still counted against your monthly allowance. So not only are you paying the full price, but you&#39;re also using your broadband allowance that you&#39;re paying for elsewhere. You are, in effect, paying for the call twice.&lt;br /&gt;&lt;br /&gt;So, this solution is viable, albeit costly, if you find yourself in a situation where you need to use Vodafone&#39;s mobile telephony, and Vodafone alone is an option, and if you&#39;re in an area to which Vodafone&#39;s normal network does not extend.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;There are alternatives&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;If you stop and think about it, why do you absolutely have to make cellular calls with your mobile phone? A large proportion of phones produced over the past few years are also able to connect to standard WiFi wireless networks (WLAN), so why not turn to &lt;a href=&quot;http://en.wikipedia.org/wiki/Voice_over_Internet_Protocol&quot; target=&quot;_blank&quot;&gt;VoIP&lt;/a&gt;? Software exists for nearly all WLAN-enabled phones allowing you to place and receive VoIP calls on your phone.&lt;br /&gt;&lt;br /&gt;This can be achieved in either of two ways. The first and simplest solution is to use a system that&#39;s designed specifically for use on internet-enabled mobile phones. Such services include &lt;a href=&quot;http://www.fring.com&quot; target=&quot;_blank&quot;&gt;Fring&lt;/a&gt;, &lt;a href=&quot;http://www.nimbuzz.com&quot; target=&quot;_blank&quot;&gt;Nimbuzz&lt;/a&gt; and &lt;a href=&quot;http://www.truphone.com&quot; target=&quot;_blank&quot;&gt;Truphone&lt;/a&gt;. These systems usually allow free calls between users of the same system and low-cost calls to normal phone lines almost anywhere in the world. Some of them also allow the user to log into various instant messaging services such as MSN messenger, AIM, Yahoo! messenger and google chat. They also allow limited access to certain social networks like twitter and facebook.&lt;br /&gt;&lt;br /&gt;Internet telephony solutions normally associated with desktop computers are also available to mobile phones nowadays. I&#39;m thinking in particular of &lt;a href=&quot;http://www.skype.com/intl/en-gb/mobile/&quot; target=&quot;_blank&quot;&gt;Skype&lt;/a&gt;, which is available as a native application on many mobile platforms. If it is not available on yours, then you can always try using Fring because that service can also interface with Skype, allowing you to place and receive Skype calls via Fring.&lt;br /&gt;&lt;br /&gt;The second alternative solution is to use traditional VoIP providers, whose systems use a widely implemented protocol called SIP, or &lt;a href=&quot;http://en.wikipedia.org/wiki/Session_Initiation_Protocol&quot; target=&quot;_blank&quot;&gt;Session Initiation Protocol&lt;/a&gt;. There are numerous manufacturers of hardware SIP phones, such as &lt;a href=&quot;http://www.cisco.com/en/US/products/hw/phones/ps379/index.html&quot; target=&quot;_blank&quot;&gt;Cisco&lt;/a&gt;, &lt;a href=&quot;http://www.snom.com/en/home/&quot; target=&quot;_Blank&quot;&gt;Snom&lt;/a&gt; and &lt;a href=&quot;http://www.grandstream.com/&quot; target=&quot;_blank&quot;&gt;Grandstream&lt;/a&gt;, for example. These products all &quot;talk&quot; SIP, which is a pretty universal protocol.&lt;br /&gt;&lt;br /&gt;The implementation of SIP is just a question of software. If appropriate software is available for your phone, you can get it to &quot;talk&quot; SIP, too, and use the services of any mainstream SIP provider. Your mobile phone will, in effect, be a SIP phone just like any of the phones from the manufacturers mentioned above. This, too, usually gets you free calls to other users of the same service and cheap calls to normal phone lines. My main providers of IP telephony are &lt;a href=&quot;http://www.voiptalk.org&quot; target=&quot;_blank&quot;&gt;VoipTalk&lt;/a&gt; and &lt;a href=&quot;http://www.voipfone.co.uk&quot; target=&quot;_blank&quot;&gt;VoipFone&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Even if there is no software to turn your mobile phone into a SIP phone, all is not lost. Fring, at least, can log into your VoIP provider on your behalf and relay SIP calls to/from you through your Fring account at no extra charge. Given how ubiquitous SIP is, I assume other systems similar to Fring can do likewise. The only disadvantages to this particular kind of setup (and to using Skype like this through a third party) are the comparatively poor audio quality that is a result of multiple transcodings in order to reduce bandwidth and the sometimes borderline unacceptable lag between one person speaking and the other hearing what was said on the other end of the line.&lt;br /&gt;&lt;br /&gt;To sum this up, you have three possible solutions other than a femtocell for your telecommunications needs. In order from lowest to highest desireability, they are:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;3rd position&lt;/i&gt;: use a third party system such as Fring, Nimbuzz or Truphone, which can interface with well-known network-based solutions such as Skype or straightforward SIP. The cost involved is nil except for the communications themselves, which can be free anyway under some circumstances.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;2nd position&lt;/i&gt;: use standard SIP service from a run-of-the-mill SIP provider and access it with a dedicated hardware SIP phone. This is the best solution from the point of view of call quality and ease of use. It does, however, mean buying a dedicated SIP phone, although that SIP phone will probably be cheaper than the femtocell...&lt;br /&gt;&lt;br /&gt;&lt;i&gt;1st position&lt;/i&gt;: use your WLAN-enabled mobile phone as a SIP phone. You get call quality that&#39;s maybe just a bit lower than you would with a dedicated, hardware SIP phone, and it might also be marginally less flexible to use depending on how well the SIP software integrates with your phone. There is little to no expense, though, because the software is more often than not either absolutely free or extremely low cost.&lt;br /&gt;&lt;br /&gt;The femtocell does, however, have one major advantage over all of these three solutions: &lt;b&gt;convergence&lt;/b&gt;. Whether your mobile is connected to a conventional base station or to your femtocell, if someone dials your mobile number then your phone will ring. This is not the case with any of the VoIP solutions outlined above.&lt;br /&gt;&lt;br /&gt;Does it matter?&lt;br /&gt;&lt;br /&gt;It depends on the reason why you want the femtocell in the first place.&lt;br /&gt;&lt;br /&gt;Do you want the femtocell so that you can still be reached on your mobile when you&#39;re otherwise out of reach of your mobile network? If so then none of these VoIP solutions are really any good for you. In this case, you could always consider diverting all inbound calls from your mobile to your land line. You&#39;d most likely have to pay for any calls diverted this way on top of your contract, and you&#39;d have to weigh this cost against the cost of the femtocell.&lt;br /&gt;&lt;br /&gt;Do you want the femtocell so that you can place calls using the free minutes in your contract rather than letting them go to waste while paying for communications on your landline? If so then you might want to consider a VoIP solution, which will be cheaper than the femtocell and cheaper than normal landline calls.&lt;br /&gt;&lt;br /&gt;Food for thought...</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/126001712236795829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3697832350934094119/posts/default/126001712236795829'/><link rel='alternate' type='text/html' href='http://techy.horwits.com/2010/02/vodafone-access-gateway-femtocell.html' title='Vodafone Access Gateway femtocell'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpvmjIuVAxnptgJD_7R61nyhD96J4QazbrK7vdp2hLwbmcUsBgWvoD9oItkXzWyBUwxWTv50jk8sMPWvvTnjJhTz-3-xyA2M4-DdKhbRbO8gizOyvAUlLY9Wb2igmw_4EEmyAVp8oZPcg/s72-c/vodafone_access_gateway_2.jpg" height="72" width="72"/></entry></feed>