text: tag:blogger.com,1999:blog-36978323509340941192021-01-14T10:16:00.949+00:00Techy odds and endsG. Stewart "Expedition Field Chronograph 43mm" watch<div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"> <img alt="Photo of watch" border="0" data-</div><p>It's about a week since I bought one of these so I thought I'd jot down some of my first impressions of the timepiece.</p> <p>My overall impression is positive. There are a couple of negative points that I'll deal with but, on the whole, I like this watch.</p> <p>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.</p> <p.</p> <p.</p> <p.</p> <p.</p> <p".</p> <p.</p> <p.</p> <p.</p> <p>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't expecting and not really bothered by the rest.</p><img src="" height="1" width="1" alt=""/>G. Stewart just passed an impossible test on Facebook!<p>We'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 "<u>Nobody</u>.</p> <p>Remember the golden rule: if it looks too good to be true, then the chances are that it is <i>not</i> 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 <i>not</i> <b>money</b>. So how do they make their money? What is their business model?</p> <p>They all rely on <u>deception</u> to trick users into visiting their pages. One way to do this is to issue a challenge. "Nobody will get more than 60% of these questions right!"</p> <p>"Really? Hold my beer..."</p> <p>Another way to tempt people in is to tell them about how a friend did so well, which actually requires said friend's collaboration.</p> <p>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't shine. But you only <i>just</i>.</p> .</p> <p>What really happened here?</p> <p>Firstly, the site owners were paid by the advertisers to show you as many ads as humanly possible.</p> <p>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 <i>still</i>.</p> <p>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.</p> <p>Feel free to remove the blindfold, the ties and the broomstick now, and please burn the broomstick...</p><img src="" height="1" width="1" alt=""/>G. Stewart random numbers to compute the value of π<script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script> <script src="" type="text/javascript"> </script> <p>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 <a href="" target="_blank">SwissMicros DM42</a> for this because it uses Thomas Okken'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.</p> <p>Back in 1735, the Swiss mathematician, astronomer (and a few other things besides) <a href="" target="_blank">Leonhard Euler</a> 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\) (<a href="" target="_blank">Wikipedia</a>).</p> <p>So, what'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'll call this proportion that we find experimentally \(p\).</p> <p>\(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\).</p> <p>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: <a href="" target="_blank">"Basel" problem</a>, <a href="" target="_blank">Riemann Zeta function</a>.</p> <p>It's not going to take any longer to generate random numbers up to 1000 than it is random numbers up to 200, so I'll stick with 1000 for the purposes of this experiment.</p> <p>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'll take to run.</p> <p>Thirdly, the random number generator in Free42 is already pretty darn good but it'll never be perfect, so that will introduce a few errors as well.</p> <p>Given the three sources of errors above, I'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.</p> <p>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.</p> <p>First, here'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.</p> <pre>00 { 267-Byte Prgm }<br />01▸LBL "PI2"<br />02 ALL<br />03 6<br />04 1<br />05 NEWMAT<br />06 LSTO "REGS"<br />07 6<br />08 PI<br />09 X↑2<br />10 ÷<br />11 STO 02<br />12 CLST<br />13 CF 29<br />14▸LBL 10<br />15 "HIGHEST: "<br />16 ARCL 00<br />17 ├"[LF]SAMP SZ: "<br />18 ARCL 01<br />19 AVIEW<br />20 CLMENU<br />21 "HIGH"<br />22 KEY 1 GTO 21<br />23 "SAMP"<br />24 KEY 2 GTO 22<br />25 KEY 9 GTO 12<br />26 RCL 00<br />27 100<br />28 X>Y?<br />29 GTO 11<br />30 RCL 01<br />31 1ᴇ3<br />32 X>Y?<br />33 GTO 11<br />34 "GO→"<br />35 KEY 6 GTO 30<br />36▸LBL 11<br />37 MENU<br />38 STOP<br />39 GTO 10<br />40▸LBL 12<br />41 EXITALL<br />42 RTN<br />43▸LBL 21<br />44 ABS<br />45 IP<br />46 STO 00<br />47 GTO 10<br />48▸LBL 22<br />49 ABS<br />50 IP<br />51 STO 01<br />52 GTO 10</pre> <p>No doubt you'll notice that the "GO→" 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's there and you hit it, we go off to LBL 30 and start the run.</p> <pre>53▸LBL 30<br />54 RCL 01<br />55 STO 03<br />56 3<br />57 STO "GrMod"<br />58 CLLCD<br />59 -120<br />60 1<br />61 PIXEL</pre> <p>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.</p> <p>The main loop runs here:</p> <pre>62▸LBL 06<br />63 XEQ 04<br />64 XEQ 04<br />65 XEQ 01<br />66 1<br />67 X≠Y?<br />68 GTO 07<br />69 STO+ 04<br />70▸LBL 07<br />71 RCL 01<br />72 RCL- 03<br />73 1<br />74 +<br />75 STO ST Y<br />76 RCL 04<br />77 X<>Y<br />78 ÷<br />79 STO 05<br />80 RCL- 02<br />81 20<br />82 ×<br />83 120<br />84 ×<br />85 RCL+ ST L<br />86 X<0?<br />87 GTO 08<br />88 X<>Y<br />89 RCL÷ 01<br />90 400<br />91 ×<br />92 PIXEL<br />93▸LBL 08<br />94 DSE 03<br />95 GTO 06</pre> <p>The subroutine at LBL 04 just generates a random number from 1 to \(n\).</p> <p>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.</p> <p>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.</p> <pre>96 RCL 05<br />97 1/X<br />98 6<br />99 ×<br />100 SQRT<br />101 PI<br />102 RCL- ST Y<br />103 RCL÷ ST L<br />104 ABS<br />105 100<br />106 ×<br />107 FIX 04<br />108 GTO 12</pre> <p>This is the subroutine that calculates the gcd of X and Y:</p> <pre>109▸LBL 01<br />110 X>Y?<br />111 X<>Y<br />112▸LBL 02<br />113 MOD<br />114 X=0?<br />115 GTO 03<br />116 LASTX<br />117 X<>Y<br />118 GTO 02<br />119▸LBL 03<br />120 LASTX<br />121 RTN</pre> <p>And finally, this generates the random number from 1 to \(n\):</p> <pre>122▸LBL 04<br />123 RAN<br />124 RCL× 00<br />125 IP<br />126 1<br />127 +<br />128 END</pre> <p>This graph was generated using 5000 pairs of random numbers from 1 to 1000:</p> <p><img src="" style="width: 400px; height: 240px; border: 1px solid black; padding: 0; margin: 0;" /></p> <p>The computation gave me a value of \(π\approx 3.149704\), i.e. an error of 0.26%, roughly.</p> <p><img src="" style="width: 400px; height: 240px; border: 1px solid black; padding: 0; margin: 0;" /></p><img src="" height="1" width="1" alt=""/>G. Stewart of fun to come!><br /!<br /><br />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.<br /><br /.<br /><br /.<br /><br /.<br /><br /.<br /><br />In the meantime, here are a couple of tests that I did with the 75-300mm lens that is definitely a "starter" lens, not something professional, but which gave me some results that did impress me.<br /><br />Firstly there's this narcissus(?), i.e. a flower about 1" in diameter, growing outside about 10 feet from the window. This wasn't the full frame, I did crop the image on the flower.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-</a></div><br />Then there's this partial shot of Tony that I took from about 6 feet from him. He hasn't had a shave in a few days and it shows!<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-</a></div><br />Sadly I've not yet had a chance to take the camera outside and do what you're supposed to do with a telephoto lens: shoot stuff at a distance.<img src="" height="1" width="1" alt=""/>G. Stewart stack on the HP-41C and HP-42S<div style="text-align: justify;">A while back, another member of the MoHPC forum mentioned a program he'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'd look it up.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">NB: This program creates and manages a data file in Extended Memory called "ASTACK". 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 "X-Function" module.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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's 6 levels deep, for example, then you'll need room in your Extended Memory for a file that's 2+6*4= 26 registers in size. You'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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The three utilities provided are "ASINIT", "APUSH" and "APOP".</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><tt>ASINIT</tt></div><div style="text-align: justify;">Run this with the depth of the desired stack in X, The '41's own error detection will prevent you from creating a file that's too big or from running this on a machine with no "X-Function" module installed (remember, the 41CX and the DM41 have this module baked into their ROM).</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><tt>APUSH</tt></div><div style="text-align: justify;">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'll get -3 back instead. If the alpha stack hasn't been initialized (by running <tt>ASINIT</tt>) then you'll get -1 back in X.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><tt>APOP</tt></div><div style="text-align: justify;">This takes the string on the top of the alpha stack and transfers it into the '41'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'll get -1 back, or if the stack was already empty (everything already popped off it) when you called <tt>APOP</tt> then you'll get -2 back.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">You can go and grab these utilities here: <a href="">alpha-stack.zip</a></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Software provided, as usual, as a text listing, a .raw file and a PDF with bar codes.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Edit: I wrote something similar for HP-42S/DM42. This machine has no Extended Memory but can store register data into a matrix. That's exactly what we do with this version.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Grab the listing here: <a href="">astack.txt</a> and the .raw file for DM42/Free42 here: <a href="">astack.raw</a></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Listing reproduced here:</div><div style="text-align: justify;"><pre>00 { 196-Byte Prgm }<br />01▸LBL "ASINIT"<br />02 ABS<br />03 IP<br />04 STO ST Y<br />05 8<br />06 ×<br />07 2<br />08 +<br />09 1<br />10 NEWMAT<br />11 STO "ASTACK"<br />12 CLX<br />13 R↓<br />14 INDEX "ASTACK"<br />15 STOEL<br />16 RTN<br />17▸LBL 10<br />18 CLX<br />19 SF 25<br />20 INDEX "ASTACK"<br />21 FC?C 25<br />22 -1<br />23 RTN<br />24▸LBL "APOP"<br />25 XEQ 10<br />26 X≠0?<br />27 RTN<br />28 RCLEL<br />29 I+<br />30 RCLEL<br />31 X≠0?<br />32 GTO 01<br />33 -2<br />34 RTN<br />35▸LBL 01<br />36 8<br />37 ×<br />38 5<br />39 -<br />40 1<br />41 STOIJ<br />42 CLA<br />43 8<br />44▸LBL 11<br />45 RCLEL<br />46 I+<br />47 ARCL ST X<br />48 R↓<br />49 DSE ST X<br />50 GTO 11<br />51 FS?C 01<br />52 GTO 04<br />53 2<br />54 1<br />55 STOIJ<br />56 RCLEL<br />57 1<br />58 -<br />59 STOEL<br />60▸LBL 04<br />61 CLST<br />62 RTN<br />63▸LBL "APUSH"<br />64 XEQ 10<br />65 X≠0?<br />66 RTN<br />67 RCLEL<br />68 I+<br />69 RCLEL<br />70 X=Y?<br />71 GTO 02<br />72 1<br />73 +<br />74 STOEL<br />75 8<br />76 ×<br />77 5<br />78 -<br />79 1<br />80 STOIJ<br />81 8<br />82 R↑<br />83▸LBL 09<br />84 ASTO ST X<br />85 STOEL<br />86 I+<br />87 ASHF<br />88 DSE ST Y<br />89 GTO 09<br />90 SF 01<br />91 GTO "APOP"<br />92 END</pre></div><img src="" height="1" width="1" alt=""/>G. Stewart "N Queens" problem<div style="text-align: justify;">The "N Queens" problem is a puzzle where you take an <i>NxN</i> chequers or chess board (it'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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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'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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">I thought I'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'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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Here is a line-by-line explanation of the algorithm:</div><pre>10 DESTROY ALL @ DELAY 0</pre><div style="text-align: justify;">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 :)</div><pre>20 OPTION BASE 1 @ STD</pre><div style="text-align: justify;">I want the elements in the array that I'm creating later to be numbered from 1 onwards rather than 0, and we need integers to be displayed with no decimals or we're going to get a string overflow (and something far too long to display on screen) in line 200.</div><pre>30 INTEGER R,C,S,T,F,N,K<br />40 REAL W</pre>OK, let's set up a few variables.<br /><br /><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">S is the size of the board.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">T will be used as a counter while I'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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">F is the running count of solutions found so far.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">K will be used as a counter while building the string representing the solution that was found.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><pre>50 INPUT "Board size 1-9: ";S<br />60 IF S>9 OR S<1 THEN 50</pre><div style="text-align: justify;">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...</div><pre>70 INTEGER B(S) @ DISP "Working..."<br />80 R=0 @ F=0 @ N=0 @ W=TIME</pre><div style="text-align: justify;">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've started crunching numbers. Depending on the size of the board we're working with, it can take a while to find the first solution.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">We then initialize the row counter and the running counts and we make a note of the time when we started.</div><pre>90 R=R+1 @ IF R>S THEN 190<br />100 C=0</pre><div style="text-align: justify;">This is the point in the algorithm where we move on to the next row. If we've only just started then the "next" row is actually the <u>first</u> row. Otherwise, we come here when we've successfully placed a queen on the board and we want to try and place one on the next row.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><pre>110 C=C+1 @ IF C>S THEN 170</pre><div style="text-align: justify;">So, we move on to the next column. If we've only just started looking at the current row then this is the first column. Otherwise it means that we couldn't place a queen in the previous column or that we could, but we're looking for solutions that involve placing her on a different square in the same row.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><pre>120 T=0<br />130 N=N+1</pre><div style="text-align: justify;">We'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'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've found a new node to examine.</div><pre>140 T=T+1 @ IF T>=R THEN 160</pre><div style="text-align: justify;">We're going to look at the next row now, but if the next row happens to be <i>this</i> row (R), then it means we've found no threat coming from previous rows and a queen placed on the square that we're looking at right now is safe. This is handled in line 160.</div><pre>150 IF B(T)=C OR ABS(B(T)-C)=R-T THEN 110 ELSE 140</pre><div style="text-align: justify;">This is where we determine if the queen in row T is a threat to us in row R, column C.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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't place a queen on this square, so we go back to line 110 where we look at the next column.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><pre>160 B(R)=C @ GOTO 90</pre><div style="text-align: justify;">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're placing the queen. We then go back to line 90 so that we can move on to the next row.</div><pre>170 R=R-1 @ IF R=0 THEN 230<br />180 C=B(R) @ GOTO 110</pre><div style="text-align: justify;">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'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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">However, if we were on the first row anyway and we can'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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><pre>190 F=F+1<br />200 F$ = "Found " @ FOR K=1 TO S @ F$ = F$ & STR$(B(K)) @ NEXT K<br />210 F$ = F$ & " (" & STR$(F) & ")" @ DISP F$</pre><div style="text-align: justify;">We wind up here if we found a solution.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><tt>Found 53142 (10)</tt></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The five digits after "Found" indicate that this was a 5x5 puzzle and that the tenth solution found (indicated by "(10)" 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.</div><pre>220 R=R-1 @ GOTO 110</pre><div style="text-align: justify;">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.</div><pre>230 W=TIME-W @ IF W<0 THEN W=W+86400</pre><div style="text-align: justify;">This is the end of the puzzle!</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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. <tt>TIME</tt> 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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">What happens if you're like me and you sometimes leave a test to run its course overnight after you've gone to bed, resulting in the test starting before midnight and ending <i>after</i> midnight?</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Say the test starts at 11:50pm and finishes at 12:10am. 11:50pm is 10 minutes (600 seconds) to midnight, so <tt>TIME</tt> will return 86400-600=85800. Come 12:10am and the end of the test, <tt>TIME</tt> will return 600, so <tt>TIME-W</tt> 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...</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The HP-71B is a great machine, granted, but it hasn'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.</div><div style="text-align: justify;"><pre>240 DISP "SOLUT:" & STR$(F) & ", NODES:" & STR$(N)</pre></div><div style="text-align: justify;">We construct and display the string indicating how many solutions were found and how many nodes were examined to find them.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The short video below shows all of this in action, and the complete listing is provided below that.</div><br /><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-</iframe></div><br /><div style="text-align: justify;">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. </div><pre>10 DESTROY ALL @ DELAY 0<br />20 OPTION BASE 1 @ STD<br />30 INTEGER R,C,S,T,F,N,K<br />40 REAL W<br />50 INPUT "Board size 1-9: ";S<br />60 IF S>9 OR S<1 THEN 50<br />70 INTEGER B(S) @ DISP "Working..."<br />80 R=0 @ F=0 @ N=0 @ W=TIME<br />90 R=R+1 @ IF R>S THEN 190<br />100 C=0<br />110 C=C+1 @ IF C>S THEN 170<br />120 T=0<br />130 N=N+1<br />140 T=T+1 @ IF T>=R THEN 160<br />150 IF B(T)=C OR ABS(B(T)-C)=R-T THEN 110 ELSE 140<br />160 B(R)=C @ GOTO 90<br />170 R=R-1 @ IF R=0 THEN 230<br />180 C=B(R) @ GOTO 110<br />190 F=F+1<br />200 F$ = "Found " @ FOR K=1 TO S @ F$ = F$ & STR$(B(K)) @ NEXT K<br />210 F$ = F$ & " (" & STR$(F) & ")" @ DISP F$<br />220 R=R-1 @ GOTO 110<br />230 W=TIME-W @ IF W<0 THEN W=W+86400<br />240 DISP "SOLUT:" & STR$(F) & ", NODES:" & STR$(N)</pre><img src="" height="1" width="1" alt=""/>G. Stewart solver - Newton-Raphson method<div style="text-align: justify;"><script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script> <script src="" type="text/javascript"> </script>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$</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">There are several methods for this. One that requires little computing power is Newton's Method, or the Newton-Raphson method, a description of which can be <a href="" target="_blank">found on Wikipedia</a>.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">We have no way of knowing the exact value of $f'(x)$ on the HP-41CX used here because that machine has no symbolic math capabilities, so we calculate an approximation of $f'(x)$ by taking a small value $\epsilon$ and calculating:</div>\[ f'(x) \approx \frac {f(x+\epsilon)-f(x)} \epsilon \]<br /><div style="text-align: justify;">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're looking for:</div>\[ x_{n+1} = x_n - \frac {f(x_n)} {f'(x_n)} \]<br /><div style="text-align: justify;">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)$.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The same $\epsilon $ is used here as the small value added to $x$ to calculate $f'(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'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's call this number $p$ for precision.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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's some discussion of such cases on the Wikipedia page linked to above.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Finally, the link to download this HP-41 program is here: <a href="">newton-raphson.zip</a></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">It is provided in text listing format, a .raw file and a printable PDF with wand bar codes.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Here is a video of a HP-41CX finding various zeros of the function:</div>\[ f(x) = x^3-2x^2-11x+12 = (x+3)(x-1)(x-4) \]<br />The three zeroes are therefore $x=-3, x=1$ and $x=4$.<br /><br /><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-</iframe></div><br />And here is the equivalent in BASIC for HP-71:<br /><pre style="text-align: left;">10 DESTROY ALL @ DELAY 0<br />20 REAL X,Y,Y1,E @ INTEGER P,M<br />30 P=FLAG(-17)+2*FLAG(-18)+4*FLAG(-19)+8*FLAG(-20) @ E=10^(-P) @ M=2*P+8<br />40 INPUT "GUESS? ";X<br />50 Y=FNF(X) @ IF ABS(Y)<E THEN 120<br />60 "X=" & STR$(X)<br />70 Y1=(FNF(E+X)-FNF(X))/E<br />80 IF Y1=0 THEN "CONSTANT?" @ END<br />90 X=X-Y/Y1<br />100 IF M>0 THEN M=M-1 @ GOTO 50<br />110 "NO CONVERGENCE" @ END<br />120 "ZERO: " & STR$(X) @ END<br />130 DEF FNF(X) = (X+3)*(X-1)*(X-4)</pre><div style="text-align: justify;">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.</div><img src="" height="1" width="1" alt=""/>G. Stewart Integration - Simpson's Rule<div style="text-align: justify;"><script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script> <script src="" type="text/javascript"> </script>Numerical.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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 <a href="" target="_blank">Simpson's Rule</a>, 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:</div><div style="text-align: justify;">\[ \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) \]</div>Basically, Simpson's Rule states:<br />\[ \int_a^{a+2h} \! f(x) \, \partial{x} \approx \frac{h}{3}(f(a)+4\cdot f(a+h)+f(a+2h)) \]<br /><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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<c<b)<span style="background-color: white; color: black; display: inline; float: none; font-family: "times new roman"; 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;">:</span></div><div style="text-align: justify;">\[ \int_a^b \! f(x) \, \partial x = \int_a^c \! f(x) \, \partial x + \int_c^b \! f(x) \, \partial x \]</div><div style="text-align: justify;": <a href="">simpson.zip</a></div><div style="text-align: justify;"><br /><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-</iframe></div><br />In this example, I'm getting all four machines to calculate:<br />\[ \int_0^1 \! (x^4-3x^3+x^2+1) \, \partial x \]<br />The exact answer to this is $ \frac{47}{60} \approx 0.7833333 $<br /><br /%).<br /><br /></div><img src="" height="1" width="1" alt=""/>G. Stewart it really a Hewlett Packard?<div style="text-align: justify;">There are two scientific calculators recently produced that, I'm afraid, fall into the cheap, plasticky category. They are the HP300s+ and the HP10s+.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The question is, are they really Hewlett Packard machines at all?</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">They are not. They are in fact Casios that have been rebadged to look like HP machines.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"'.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">One good thing about this little machine is that I didn'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's enough light around.</div><br /><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-</iframe></div><br /><img src="" height="1" width="1" alt=""/>G. Stewart Prime benchmark<script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script> <script src="" type="text/javascript"> </script><br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-</a></div><div style="text-align: justify;">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 "G2" in August 2018 with faster hardware, much more RAM to work with and double the storage space in flash memory.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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 <a href="" target="_blank">derekenwinkel.nl</a> with whom I have no affiliation other than being a happy customer of theirs.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">As it became known that there was an updated version of the Prime, people in the <a href="" target="_blank">Museum of HP Calculators Forum</a> were interested in hard data showing the improvements in performance, so I went and wrote a benchmark.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The benchmark in itself is probably of limited value in absolute terms but gives a good idea of the differences between different machines.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">A benchmark run can comprise up to three different types of test.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Firstly, there's the "Savage" test, which gives an idea of the accuracy of the calculator.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">You start off with the value '1' in a variable. Let's say 'x' for argument's sake. You then calculate repeatedly:</div><div style="text-align: justify;">\[ x = tan(atan(e^{ln(\sqrt{x^2})})) + 1 \]</div><div style="text-align: justify;">If the calculator was absolutely accurate, this would be exactly the same thing as: \( x = x + 1 \)</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;".</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Secondly, there'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:</div><div style="text-align: justify;">\[ \sum_{k=1}^n \sqrt[^3]{e^{sin(atan(k))}} \]</div><div style="text-align: justify;">It's a function with no intrinsic value or meaning other than it gets the calculator to work on trigonometric and exponential functions.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Finally, there's an implementation of a solution to the <a href="" target="_blank">"N Queens" problem</a>. 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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;":</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-</a></div><br /><div style="text-align: justify;">Additional views in the "View" menu are "Reset", which as its name suggests, resets the preferences you set up in the "Num Setup" view, and "Last results", which displays again the results of the last test run without going through with the test.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Two variables are exported by this app: bmOptions and bmResults. Both are lists of raw data. bmOptions contains the options you gave in the "Num Setup" view and "bmResults" contains the results of the tests.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"> {a, b, c}</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">...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 "N Queens" test. These numbers are, for a and b:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"> 1: Skip the test</div><div style="text-align: justify;"> 2: 1000 iterations</div><div style="text-align: justify;"> 3: 2000 iterations</div><div style="text-align: justify;"> 4: 5000 iterations</div><div style="text-align: justify;"> 5: 10000 iterations</div><div style="text-align: justify;"> 6: 20000 iterations</div><div style="text-align: justify;"> 7: 50000 iterations</div><div style="text-align: justify;"> 8: 100000 iterations</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">For c, the number is:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"> 1: Skip the test</div><div style="text-align: justify;"> 2: 8x8 board</div><div style="text-align: justify;"> 3: 9x9 board</div><div style="text-align: justify;"> 4: 10x10 board</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">So, to run 20000 iterations of the Savage test, 10000 iterations of the Summation test and the "N Queens" problem on an 8x8 board from the Home screen:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"> DoBenchmark({6,5,2})</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">(Don't forget to qualify the function if you're calling it from a different app: Benchmark.DoBenchmark())</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">You should get a list back something like this:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">{</div><div style="text-align: justify;"> {"Savage", {20000, 0.14, 1.2980065E-6}},</div><div style="text-align: justify;"> {"Summation", {10000, 0.078, 13955.8578444}},</div><div style="text-align: justify;"> {"Queens", {8, 0.009, 876, 0.156, 92, 15720}}</div><div style="text-align: justify;">}</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The meanings of the values within the result list depend on the test itself.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;".</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">An individual test's result is {0} if the test is not performed, so:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"> DoBenchmark({1,1,2})</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Should give you something like this in return:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">{</div><div style="text-align: justify;"> {"Savage", {0}},</div><div style="text-align: justify;"> {"Summation": {0}},</div><div style="text-align: justify;"> {"Queens", {8, 0.009, 876, 0.156, 92, 15720}}</div><div style="text-align: justify;">}</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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 />You can download the benchmark app from here: <a href="">Benchmark.hpappdir.zip</a><img src="" height="1" width="1" alt=""/>G. Stewart timer in a 41CX<div style="text-align: justify;">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?</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><a href="" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="SwissMicros DM41" border="0" data-</a></div><div style="text-align: justify;".</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;".</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The program I'm showcasing here isn't restricted to the HP-41CX and DM41(L), it will also work on the HP-41C or HP-41CV as long as it's fitted with a Time Module (HP-82182A).</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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 '41. You can set the stopwatch to a negative time using <span style="font-family: "courier new" , "courier" , monospace;"><b>SETSW</b></span> and start it going with <span style="font-family: "courier new" , "courier" , monospace;"><b>RUNSW</b></span>. <span style="font-family: "courier new" , "courier" , monospace;"><b>XYZALM</b></span>. With this option you won'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 <span style="font-family: "courier new" , "courier" , monospace;"><b>CDOWN</b></span>.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;" <span style="font-family: "courier new" , "courier" , monospace;"><b>CDOWN</b></span> does.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><span style="font-family: "courier new" , "courier" , monospace;"><b>CDOWN</b></span> is easy to use:</div><ol><li><div style="text-align: justify;">Set the alpha register as you would if creating an alarm manually. So, that's with a message, blank, or with a global label (refer to the Time Module manual for details).</div></li><li><div style="text-align: justify;">Enter the time to count down in the form <span style="font-family: "courier new" , "courier" , monospace;">HH.MMSS</span> (e.g. 0.0530 for 5m30s)</div></li><li><div style="text-align: justify;">Run <span style="font-family: "courier new" , "courier" , monospace;"><b>CDOWN</b></span> (either XEQ it or assign it to a USER key)</div></li></ol><div style="text-align: justify;">You'll see the time of day when the alarm is set to go off in X after <span style="font-family: "courier new" , "courier" , monospace;"><b>CDOWN</b></span> runs.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">You can grab CDOWN from here: <a href="">cdown.zip</a><br /><br />The archive contains a text listing of the program that's compatible with <a href="" target="_blank">hp41uc</a> and <a href="">dm41.swissmicros.com</a>, a .raw file and a printable PDF with wand bar codes.</div><img src="" height="1" width="1" alt=""/>G. Stewart are a-changing<div style="text-align: justify;"><p>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.</p><p.</p><p.</p><p <a href="" target="_blank">41 Club</a> in just over 3 months from now, when I step down from the Association's National Executive.</p><p>If you've seen <a href="">my previous post on this blog</a> "<a href="" target="_blank">SwissMicros</a>", who build calculators that behave like some of the popular models made by Hewlett Packard in the '80s.</p><p>Edit: November 2020. I have been working part time for SwissMicros as an independent contractor since July this year.</p><p>So, that is how my interests have shifted over the past 10 years. You can now expect a few blog entries about vintage calculators :)</p><p>If this is of interest to you then another blog you might want to consider following is <a href="" target="_blank">Eddie Shore's Math and Calculator Blog</a>.</p></div><img src="" height="1" width="1" alt=""/>G. Stewart collectionThis 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'll give a link to that website here.<br /><br />Running total of items collected so far: 272<br /><ul> <li>Hewlett Packard (64) <ul> <li>HP 10s</li> <li>HP 10s+</li> <li>HP-10C</li> <li>HP-12C (2x)</li> <li>HP-12C Platinum</li> <li>HP-12C Platinum 25th Anniversary</li> <li>HP-15C</li> <li>HP-16C</li> <li>HP-18C</li> <li>HP-19BII</li> <li>HP-28C</li> <li>HP-28S</li> <li>HP-32S</li> <li>HP-35</li> <li>HP-35S</li> <li>HP 38G</li> <li>HP 39G</li> <li>HP 39gII</li> <li>HP 39gs (2x)</li> <li>HP 40gs (2x)</li> <li>HP-41C</li> <li>HP-41CV (converted to a <a href="" target="_blank">Systemyde International</a> 41CL)</li> <li>HP-41CX</li> <li>HP-42S</li> <li>HP-45</li> <li>HP-48G</li> <li>HP-48GX (2x)</li> <li>HP-48G+</li> <li>HP-48S</li> <li>HP-48SX (2x)</li> <li>HP 48gII 2× (1× 2003 version, 1× 2007 version)</li> <li>HP 49G (2x)</li> <li>HP 49g+</li> <li>HP 50g (12x black, 2x blue)</li> <li>HP-67</li> <li>HP-71B</li> <li>HP 95LX (not strictly a calculator but still a handheld computing device)</li> <li>HP 320LX Palmtop with docking station</li> <li>HP 300s+</li> <li>HP Prime (1x Rev. A, 1x Rev. C pale keys, 2x Rev. C dark keys, 1x G2)</li> </ul> </li> <li>Hewlett Packard Accessories/Modules (25) <ul> <li>HP 82240B IR printer (2x)</li> <li>HP 82153A Barcode wand</li> <li>HP 82160A HP-IL module for HP-41C</li> <li>HP 82170A Quad Memory module for HP-41C</li> <li>HP 82180A Extended Functions module for HP-41C/CV (2x)</li> <li>HP 82181A Extended Memory module for HP-41C/CV/CX (4x)</li> <li>HP 82182A Time Module for HP-41C/CV</li> <li>HP 00041-14023 MATH 1B PAC</li> <li>HP 00041-14011 Structural Analysis Pac STRCTA 1A</li> <li>HP 00041-15006 Circuit Analysis Pac</li> <li>HP 00041-15004 Financial Decisions Pac</li> <li>HP 5061-7285 Advantage Module 1A</li> <li>L119 Howitzer Firing Solution module</li> <li>HP 82120A Battery Pack for HP-41C/CV/CX with charger</li> <li>HP 82104A Magnetic Card Reader for HP-41C/CV/CX</li> <li>HP 82401A HP-IL Module for HP-71B</li> <li>HP 82211A HP SOLVE Equation Library for HP-48SX</li> <li>HP 82215A 128KB RAM card for HP-48SX/GX</li> <li>CMT48 128KB RAM card for HP-48SX/GX</li> <li>PIL-Box</li> </ul> </li> <li>SwissMicros (17) <ul> <li>DM10L Collector's Edition</li> <li>DM11L</li> <li>DM12L</li> <li>DM15</li> <li>DM15L (2x)</li> <li>DM16</li> <li>DM16L</li> <li>DM41</li> <li>DM41L (2x)</li> <li>DM41X alpha unit</li> <li>DM41X beta unit</li> <li>DM41X production unit</li> <li>DM42 (3x)</li> </ul> </li> <li>Texas Instruments (62) <ul> <li>TI-Math Explorer</li> <li>TI-Business Analyst II</li> <li>TI-5025</li> <li>TI-1006 Light Powered</li> <li>TI-1025</li> <li>TI-15</li> <li>TI-30</li> <li>TI-30X Solar</li> <li>TI-35</li> <li>TI-36X Solar</li> <li>TI-53 (4x)</li> <li>TI-55-II</li> <li>TI-56</li> <li>TI-57 LCD</li> <li>TI-57 II (2x)</li> <li>TI Programmable 58</li> <li>TI-65 Technical Analyst</li> <li>TI-66 (4x)</li> <li>TI-67 Galaxy (2x)</li> <li>TI-73</li> <li>TI-73 Explorer</li> <li>Ti-74 BASICALC</li> <li>TI-80</li> <li>TI-81 (2x)</li> <li>TI-82</li> <li>TI-82 (2001)</li> <li>TI-83</li> <li>TI-83 Plus</li> <li>TI-83 Plus Silver Edition</li> <li>TI-84 Plus</li> <li>TI-84 Plus Silver Edition (2x)</li> <li>TI-84 Plus C Silver Edition (2x)</li> <li>TI-84 Plus <i>Pocket SE</i></li> <li>TI-84 Plus CE-T</li> <li>TI-85</li> <li>TI-86</li> <li>TI-89</li> <li>TI-89 Titanium (2x grey, 1x black)</li> <li>TI-92</li> <li>TI-92 II</li> <li>TI-92 Plus</li> <li>Voyage 200</li> <li>TI-95 PROCALC (2x, 1 of which with 8KB RAM module)</li> <li>TI NSpire</li> <li>TI NSpire CAS Touchpad</li> <li>TI NSpire CX</li> <li>TI NSpire CX CAS</li> <li>TI LCD Programmer</li> </ul> </li> <li>Casio (70) <ul> <li>FX-180P (2x)</li> <li>FX-180Pv</li> <li>FX-200P</li> <li>FX-373ES</li> <li>FX-570</li> <li>FX-570ES PLUS</li> <li>FX-702P (2x)</li> <li>FX-730P (2x)</li> <li>FX-795P</li> <li>FX-802P</li> <li>FX-880P</li> <li>FX-991ES PLUS</li> <li>FX-1000F</li> <li>FX-2700P</li> <li>FX-3400P</li> <li>FX-3500P</li> <li>FX-3600P</li> <li>FX-3650PII</li> <li>FX-3800P</li> <li>FX-3900PV</li> <li>FX-4000P</li> <li>FX-4200P</li> <li>FX-4500P</li> <li>FX-5000F</li> <li>FX-5500</li> <li>FX-5800P (2x)</li> <li>FX-6000G</li> <li>FX-6300G</li> <li>FX-7000G/GA/GB (5x)</li> <li>FX-7300G</li> <li>FX-7400G PLUS</li> <li>FX-7500G (2x)</li> <li>FX-7700G</li> <li>FX-8000G</li> <li>FX-8500G</li> <li>FX-8700G</li> <li>FX-9700GE</li> <li>FX-9750G</li> <li>FX-9750GII</li> <li>CFX-9800G</li> <li>CFX-9850G</li> <li>CFX-9850GB PLUS (2 variants)</li> <li>FX-9860G SD</li> <li>FX-9860G Slim (2x)</li> <li>FX-9860GII</li> <li>FX-9860GII SD</li> <li>FX-9860GIII</li> <li>FX-9900GC</li> <li>CFX-9940GT</li> <li>CFX-9950GB PLUS</li> <li>FX-CG20</li> <li>FX-CG50 (2x)</li> <li>PB-110</li> <li>PB-410F</li> <li>RC-4 RAM pack (3x)</li> <li>RP-8 RAM pack</li> </ul> </li> <li>Others (34) <ul> <li>Canon LC-64T</li> <li>Canon LS-25HII</li> <li>Canon F-73P</li> <li>Citizen SRP-45</li> <li>Ericsson MC12 "Mobile Companion" (rebranded HP 320LX Palmtop)</li> <li>Sharp EL-W531</li> <li>Sharp EL-5020</li> <li>Sharp EL-9300</li> <li>Sharp EL-9450</li> <li>Sharp EL-9600</li> <li>Sharp EL-9900 (5x)</li> <li>Sharp PC-1246</li> <li>Sharp PC-1248</li> <li>Sharp PC-1360 (2x)</li> <li>Sharp PC-1401 (extended to 10kB)</li> <li>Sharp PC-1421</li> <li>Sharp PC-1500</li> <li>Sharp PC-G850VS</li> <li>Sharp CE-124 Cassette Interface</li> <li>Sharp CE-211M 4KB RAM card</li> <li>Sharp CE-212M 8KB RAM card (7x)</li> <li>National Semiconductor 4650</li> <li>Tandy EC-4019 (rebranded Casio fx-3800P)</li> </ul> </li></ul><img src="" height="1" width="1" alt=""/>G. Stewart N9 PR1.3 update<div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><img border="0" height="100" src="" /></a></div><div style="text-align: justify;">The much awaited update landed on my own N9 yesterday.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">At first sight there's nothing really new in it despite Nokia's surprisingly undetailed claims of over 1000 improvements in various areas (see <a href="" target="_blank">here</a>).</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">As far as I can see there are only 3 visual changes, but it goes a little deeper than that. Read on...</div><div style="text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: justify;"><img border="0" src="" /></a></div><div style="text-align: justify;">Firstly, there is now a small status icon that appears when the phone's "beep" profile is selected (see photo to the right, screenshot of the top-right corner of the display). Previously, there was only such an icon when the phone was in silent mode, a similar musical note with a bar through it.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.</div><div style="text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="160" src="" /></a></div><div style="text-align: justify;">Finally, there has been some improvement to the camera. Focussing seems to be improved, as does the camera's ability to function in poor lighting conditions. The photo on the left provides an example of this. Click <a href="" target="_blank">here</a> to view the image in its full 8MP resolution.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">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.<br /><br />I use a small app called <a href="" target="_blank">Battery Usage</a> to monitor the charge state of my phone'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.<br /><br />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 "dual" 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.<br /><br />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.<br /><br />Thanks to <a href="" target="_blank">@ibrakalifapuspa</a> on <a href="" target="_blank">twitter</a>, 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.<br /><br />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.<br /><br />Given the unlikelihood of there ever being an update to the N9's firmware (Nokia's MeeGo dev team <a href="" target="_blank">jumped ship</a> shortly after the release of the update), this bug will probably never be fixed now, so while I used to dismiss the old "switch bluetooth off to save power" adage, it has now become true.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="" /></a></div>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's something else eating a bit more power than before. I have no way of proving this but I think it's the RF receiver. The reason I think it's that is because I live in an area with extremely poor coverage. There's a dense row of trees between me and the base station that'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't always suffice. Right now, the signal strength indicator on my screen is showing 3 bars out of 5, which is more than I'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?<br /><br />So, to recap, this is what I have noticed in PR1.3:<br /><br /><ul><li>New icon to indicate the phone is in "beep" profile</li><li>Smoother UI</li><li>Improved camera</li><li>Bug in the bluetooth stack causing power drain even when disconnected</li><li>Improved gain in the RF receiver allowing better signal acquisition</li></ul><br /><br /></div><img src="" height="1" width="1" alt=""/>G. Stewart account on a Nokia N9<div style="color: #990000;">Since writing this, I have found a "solution" to the problem. "Solution" in quotes because it is merely a work-around and doesn't actually solve the underlying problem.</div><div style="color: #990000;"><br /></div><span style="color: #990000;">All I did was install </span><a href="" style="color: #990000;" target="_blank">firefox</a><span style="color: #990000;">, set it as the default browser and start over with the procedure described below.</span><br /><hr />Here's one that has me stumped. Rest assured, if I do get an answer to this problem I'll publish it here so that other people coming up against the same problem can find help.<br /><br /.<br /><br />So, step 1 is to go into Accounts > Add accounts > Flickr on the N9. You're presented with this screen:<br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="" width="179" /></a></div>By tapping on the "continue" button, you are taken to the flickr login page:<br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="" width="179" /></a></div>Once you'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:<br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="" width="179" /></a></div>Meanwhile, the account setup process is still waiting for the auth token:<br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="" width="179" /></a></div>If anyone has some ideas, I'm all ears!<br /><br />My phone is a Nokia N9 running PR1.2.<br /><br /><br /><br /><br /><img src="" height="1" width="1" alt=""/>G. Stewart a new mobile networkThe time has come for me to choose a new mobile network! I'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<sub>2</sub> (the former uses the latter's network anyway) seemed the logical choice and I took out a 12-month SIM-only contract.<br /><div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1"><img border="0" src="" /></a></div>The big 5 available here in the UK are <a href="" target="_blank">Orange UK</a>, <a href="" target="_blank">O<sub>2</sub></a>, <a href="" target="_blank">Vodafone</a>, <a href="" target="_blank">Hutchison 3G</a> and <a href="" target="_blank">T-Mobile</a>. MVNOs piggybacking on some of these networks are, among others, <a href="" target="_blank">Virgin Mobile</a> (on T-Mobile), <a href="" target="_blank">Tesco Mobile</a> (on O<sub>2</sub>) and <a href="" target="_blank">Asda Mobile</a> (on Vodafone). They all provide different levels of coverage in the various locations that I frequent and different levels of service.<br /><br />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'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't actually have any coverage in the places where you spend most of your life and therefore can't use those minutes etc.<br /><br />At my workplace I get full 3.5G coverage on all of the major networks so that part isn't even a consideration. At home, things are a little different.<br /><br />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'd be very unhappy as it would be absolutely useless as anything other than a paperweight.<br /><br />O<sub>2</sub> (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'm looking at alternatives now.<br /><br />Hutchison 3G would be a good solution if it weren't for two severe drawbacks. Firstly, Three UK is a 3G <u>only</u> 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're in a zone that's not covered by Three'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's network is sometimes rather random. They just don't always get through. While nobody in their right mind should rely on text messaging for important information, it's still extremely annoying not to receive messages and simply not know about it.<br /><br />Three UK is therefore out of the equation.<br /><br />That leaves me with T-Mobile (or Virgin) and Orange. Essentially, they're the same network after their <a href="" target="_blank">merger</a> in late 2010, which resulted in the creation of <a href="" target="_blank">"Everything, Everywhere"</a>. Not only do they share their 2G networks, but they both can use Three's 3G network in the absence of 3G coverage under the umbrella of <a href="" target="_blank">Mobile Broadband Network Ltd.</a>, a 50/50 joint venture between Three UK and Everything, Everywhere.<br /><br />These networks give me reasonable 3G or 3.5G coverage almost everywhere on the ground floor. In the few areas where I don'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.<br /><br />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.<br /><br />That leaves T-Mobile and Orange, and I'm leaning towards the former because the SIM-only deals that they're offering do seem to match my requirements better than those from Orange.<br /><br />My 12-month contract with Tesco is up in June. I'm going to keep an eye on the operators' offerings between now and then in order to choose the one that suits my needs best of all.<br /><br /><span style="color: #990000;">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's <a href="" target="_blank">SMS gateway</a>. I'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.</span><img src="" height="1" width="1" alt=""/>G. Stewart N9 and CalDAV on Google<div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="190" width="200" src="" /></a></div>Wow! It'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.<br /><br /> The idea here is to synchronise your Google calendar(s) with your N9 (and presumably N950 since they both run MeeGo Harmattan), which isn't that hard in itself. What caught me out and had me searching was how to sync <em>all</em> my Google calendars with the phone.<br /><br /> <u>Single calendar</u><br /><br /> In its most basic form, this system allows you to sync just your main Google calendar with a mobile device.<br /><br /> On your phone, go into "Accounts" and start setting up a new CalDAV account: <div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="180" src="" /></a></div> Fill in your Google e-mail address (eg. your.name@googlemail.com) and your Google account password, and in the "Server/URL" field enter: <pre style="text-align: center;"></pre> Tap on the "Sign in" 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's going to be synced and added to your phone's calendar: <div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="180" src="" /></a></div> 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't exporting both calendars.<br /><br /> <u>Multiple calendars</u><br /><br /> Point your browser (mobile or desktop, it doesn't matter) at this URL: <pre style="text-align: center;"><a href="" target="_blank"></a></pre> 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 "Save" button. Now go back to the CalDAV account on your phone, tap the "Sync" button, and all the accounts should appear and be added to the phone's calendar: <div class="separator" style="clear: both; text-align: center;"><a href="" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="320" width="180" src="" /></a></div> 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.<br /><br /><img src="" height="1" width="1" alt=""/>G. Stewart OVI Suite and marking SMS messages readWow! 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 <a href="" target="_blank">other blog</a>.<br /><br />So here goes...<br /><br />How many of you have become irritated at Nokia OVI Suite's stubborn refusal to mark as read text messages that you have, well... read? Am I the only one?<br /><br />You can click wherever you like on a message marked as unread and nothing will change that status. I'd read posts elsewhere that sugessted sorting the list of messages by date rather than grouped by contact but even that didn't work.<br /><br />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 <a href="" target="_blank">sqliteexpert.com</a>. The free, "personal" version will work fine for this, although I'm sure the author would appreciate you purchasing a full version...<br /><br />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'm using V3.1.1.80 here.<br />. <br /><br />Once you've installed SQLite Expert, fire it up and then go to "File" / "Open database". Browse to the following location:<br /><br /><tt>C:\Users\<span style="font-style:italic;">your_username</span>\AppData\Local\Nokia\Nokia Ovi Suite\Messages\Database</tt> and load the database called <tt>msg_db.sqlite</tt>.<br /><br />With that database open, you'll see a kind of tree view on the left and several tabs to its right. One of the tabs is called 'SQL'. Click on it.<br /><br /):<br /><br /><tt>SELECT * FROM messages ORDER BY msg1259079412898" /></a><br /><br />Note that bits of the output that are personal and that can identify my correspondents have been blurred in order to protect their privacy.<br /><br />The column that we're interested in here is the one headed "<tt>msg_status</tt>"..<br /><br /:<br /><br /><tt>UPDATE messages SET msg_status = msg_status & 4553166734274" /></a><br /><br />That's it!<br /><br />(Optionally) go into "File" / "Close database". Then exit SQLite Expert.<br /><br />You can now fire up OVI Suite again and all of those unread messages will now appear as read.<img src="" height="1" width="1" alt=""/>G. Stewart objects and namespacesThere seems to be quite a bit of confusion as to what these beasts are and what they'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.<br /><br />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 "components". 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 <a href="" target="_blank">AJAX</a> call) and, given that AJAX obviously involves <a href="" target="_blank">JavaScript</a>, 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're not all very careful.<br /><br />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's toes in the process. Each developer's work is tucked away in its own namespace or object and can't interfere with any other developer's work.<br /><br />So, how do we go about this tidy stuff?<br /><br />Firstly, let's look at the namespace approach.<br /><br />Consider this declaration of a generic object with a single property in JavaScript and an alert() that will display that property:<br /><br /><pre style="margin: 0; font-size: 90%;">var myObject = { aNumber: 10 };<br />alert(myObject.aNumber);</pre><br />A namespace is merely an extension of this concept in that we're also adding functions to the object <tt style="font-size: 90%;">myObject</tt>. Without them, the whole namespace thing is pretty pointless.<br /><br />Let's add a function to <tt style="font-size: 90%;">myObject</tt> that displays the value <tt style="font-size: 90%;">aNumber</tt> and add some indentation to make reading this stuff easier:<br /><br /><pre style="margin: 0; font-size: 90%;">var myObject = {<br /> aNumber: 10,<br /> display: function() { alert(this.aNumber); }<br />};</pre><br />In order to get this working, you need to call the function called <tt style="font-size: 90%;">display</tt> within the <tt style="font-size: 90%;">myObject</tt> namespace:<br /><br /><pre style="margin: 0; font-size: 90%;">myObject.display();</pre><br />Note the use of the reserved word <tt style="font-size: 90%;">this</tt> used to refer to the property <tt style="font-size: 90%;">aNumber</tt> belonging to the object whose <tt style="font-size: 90%;">display</tt> method is being called.<br /><br />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's get a bit more adventurous and create a simple guessing game. This should do the trick.<br /><br />First, the HTML for the page that is going to run the game:<br /><br /><pre style="margin: 0; font-size: 90%;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ""><br /><html xmlns="" xml:<br /><br /><head><br /> <title>JavaScript guessing game</title><br /> <meta http-<br /> <script type="text/javascript" src="guessinggame.js"></script><br /></head><br /><br /><body><br /><br /><input type="text" id="guess" value="" size="3" /><br /><input type="button" value="guess" onclick="guessingGame.play()" /><br /><input type="button" id="startbutton" value="start game" onclick="guessingGame.start()" /><br /><input type="button" value="cheat!" onclick="guessingGame.cheat()" /><br /><br /></body><br /><br /></html></pre><br />Note that the text input box has been given the id <tt style="font-size: 90%;">guess</tt> and the button to start the game has been given the id <tt style="font-size: 90%;">startbutton</tt>. The text input and button are going to be accessed by the JavaScript.<br /><br />And now the JavaScript file, guessinggame.js:<br /><br /><pre style="margin: 0; font-size: 90%;">var guessingGame = {<br /><br /> initialised: false,<br /><br /> found: false,<br /><br /> numToGuess: 0,<br /><br /> start: function() {<br /> this.numToGuess = 1 + Math.floor( Math.random() * 10 );<br /> this.initialised = true;<br /> this.found = false;<br /> document.getElementById("startbutton").disabled = true;<br /> },<br /> <br /> cheat: function() {<br /> if ( !this.initialised )<br /> alert("The game hasn't started so you can't cheat yet!");<br /> else if ( this.found )<br /> alert("You've already found the answer, so why cheat now?");<br /> else {<br /> alert("The number to guess was: " + this.numToGuess);<br /> this.found = true;<br /> document.getElementById("startbutton").disabled = false;<br /> }<br /> },<br /> <br /> play: function() {<br /> if ( !this.initialised )<br /> alert("The game hasn't yet started. Start one before guessing");<br /> else if ( this.found )<br /> alert("The game is over, you already got the right number!");<br /> else {<br /> guess = parseInt(document.getElementById("guess").value);<br /> if ( guess == this.numToGuess ) {<br /> this.found = true;<br /> document.getElementById("startbutton").disabled = false;<br /> alert("Correct! The number was indeed " + guess);<br /> }<br /> else<br /> alert("Nope! Try again.");<br /> }<br /> }<br /><br />};</pre><br />Our namespace, <tt style="font-size: 90%;">guessingGame</tt> 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'll see later on) they can'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 <strong>is</strong> the point is the fact that despite there being six "things" to play with here, there is only <strong>ONE</strong> thing in the global namespace: <tt style="font-size: 90%;">guessingGame</tt>. 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's namespace has a different name, there will be no clashes whatsoever. Both can cohabit on the same page without any risk of confusion.<br /><br />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.<br /><br />Let'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 "guessesLeft" 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 "guessesLeft" property to a positive number before calling the <tt style="font-size: 90%;">play</tt> function because that property is exposed to the outside world. This is how to avoid that situation using private properties.<br /><br />Consider this declaration of a very simple object:<br /><br /><pre style="margin: 0; font-size: 90%;">var simpleObject = function() {<br /> var aNumber = 10;<br />};<br /><br />var myObject = new simpleObject();</pre><br />The first three lines define the class of our to-be object and give a name to that structure: <tt style="font-size: 90%;">simpleObject</tt>. The function defined in this way also acts as the constructor of that class. The last line actually instantiates that class. The object <tt style="font-size: 90%;">myObject</tt> is now an instance of the <tt style="font-size: 90%;">simpleObject</tt> class.<br /><br />If you now try to display the property <tt style="font-size: 90%;">aNumber</tt> using something like this:<br /><br /><pre style="margin: 0; font-size: 90%;">alert(myObject.aNumber);</pre><br />All you'll get back is the response "undefined".<br /><br />Why?<br /><br />Because <tt style="font-size: 90%;">aNumber</tt> is a <u>private</u> property of the object. It can only be seen from within that instance of the object (or within a so-called "privileged" method that we'll be dealing with later). If you want to be able to use a property of an object, it must be a <u>public</u> property:<br /><br /><pre style="margin: 0; font-size: 90%;">var simpleObject = function() {<br /> this.aNumber = 10;<br />};<br /><br />var myObject = new simpleObject();<br />alert(myObject.aNumber);</pre><br />This time you get the expected result.<br /><br />Rather than access the public property directly, let's now create a method of the <tt style="font-size: 90%;">simpleObject</tt> called "disp" that we can call and that will display the value of that property:<br /><br /><pre style="margin: 0; font-size: 90%;">var simpleObject = function() {<br /><br /> this.aNumber = 10;<br /><br /> function disp() {<br /> alert(this.aNumber);<br /> }<br /><br />}<br /><br />var myObject = new simpleObject();<br /><br />myObject.disp();</pre><br />Uh oh... That didn't work! Why? Because "disp" is a private method and as such is not visible from the outside world! We need to create "disp" as a <u>public</u> 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 <tt style="font-size: 90%;">myObject</tt>, our instance of the <tt style="font-size: 90%;">simpleObject</tt> class:<br /><br /><pre style="margin: 0; font-size: 90%;">var simpleObject = function() {<br /> this.aNumber = 10;<br />};<br /><br />var myObject = new simpleObject();<br />myObject.disp = function() { alert(this.aNumber); };<br /><br />myObject.disp();</pre><br />The other way is to add the method to the definition of the class itself by adding it to the "prototype" property of that class:<br /><br /><pre style="margin: 0; font-size: 90%;">var simpleObject = function() {<br /> this.aNumber = 10;<br />};<br /><br />var myObject = new simpleObject();<br />simpleObject.prototype.disp = function() { alert(this.aNumber); };<br /><br />myObject.disp();</pre><br />The first way is the "quick and dirty" 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 <tt style="font-size: 90%;">simpleObject</tt>. 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.<br /><br />Let's change our class slightly to add a private property and try and access it using a public method:<br /><br /><pre style="margin: 0; font-size: 90%;">var simpleObject = function() {<br /> var privatenum = 20;<br />}<br /><br />var myObject = new simpleObject();<br />myObject.disp = function() { alert(this.privateNum); };</pre><br />Uh oh... That didn't work either! Why? Because public methods can only access public properties, not private properties.<br /><br />Enter the <u>privileged</u> method:<br /><br /><pre style="margin: 0; font-size: 90%;">var simpleObject = function() {<br /><br /> var privatePr = 'private property';<br /> this.publicPr = 'public property';<br /><br /> this.disp = function() {<br /> alert(privatePr + " / " + this.publicPr);<br /> }<br /><br />}<br /><br />var myObject = new simpleObject();<br />myObject.disp();</pre><br />That's better! This shows that a privileged method can access not only public properties of an object but also that object's private properties.<br /><br />So far we've seen private and public properties and we've accessed them using public and privilieged methods. One thing we've not yet been able to use is a <u>private</u> method.<br /><br />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.<br /><br />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:<br /><br /><pre style="margin: 0; font-size: 90%;">var gameObject = function() {<br /><br /> var guessesLeft;<br /> var found;<br /> var numToGuess;<br /> var yourGuess;<br /> var initialised = false;<br /> <br /> this.start = function() {<br /> guessesLeft = 5;<br /> found = false;<br /> numToGuess = 1 + Math.floor( Math.random() * 10 );<br /> document.getElementById("startbutton").disabled = true;<br /> initialised = true;<br /> }<br /><br /> this.cheat = function() {<br /> if ( !initialised )<br /> alert("You can't cheat before even starting the game!");<br /> else if ( found )<br /> alert("You already found the number, why cheat now?");<br /> else {<br /> alert("The number to guess was: " + numToGuess);<br /> gameOver();<br /> }<br /> }<br /><br /> this.play = function() {<br /> if ( !initialised )<br /> alert("Start a game before guessing!");<br /> else if ( found )<br /> alert("You already guessed the number, the game is over!");<br /> else if ( guessesLeft > 0 ) {<br /> yourGuess = parseInt(document.getElementById("guess").value);<br /> if ( yourGuess == numToGuess ) {<br /> alert("Congratulations! You guessed that the secret number was "<br /> + numToGuess + " with " + --guessesLeft + " guess(es) left.");<br /> gameOver();<br /> }<br /> else {<br /> if ( --guessesLeft > 0 )<br /> alert("Nope. Try again. You have " + guessesLeft + " guess(es) left.");<br /> else {<br /> alert("Nope. You're out of guesses!");<br /> gameOver();<br /> }<br /> document.getElementById("guess").value = '';<br /> }<br /> }<br /> else alert("Sorry, you've already run out of guesses!");<br /> }<br /><br /> function gameOver() {<br /> found = true;<br /> document.getElementById("startbutton").disabled = false;<br /> document.getElementById("guess").value = '';<br /> alert("Game over!");<br /> }<br /><br />}<br /><br />var guessingGame = new gameObject();</pre><br />The interesting thing here is that the only things we'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'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 <tt style="font-size: 90%;">guessesLeft</tt> 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 <u>private</u> properties.<br /><br />So, to recap:<br /><br /><u>Private properties:</u><br /><br />Declaration:<br /><br /><pre style="margin: 0; font-size: 90%;">var myClass = function() {<br /> var privateProperty;<br />};</pre><br />Can be accessed by: private methods and privileged methods.<br />Are not visible outside the object's scope.<br /><br /><u>Public properties:</u><br /><br />Declaration:<br /><br /><pre style="margin: 0; font-size: 90%;">var myClass = function() {<br /> this.publicProperty = 'whatever';<br />};</pre><br />Can be accessed by: public methods, private methods(*), privileged methods.<br />Are visible outside the object's scope.<br /><br /><u>Private methods:</u><br /><br />Declaration:<br /><br /><pre style="margin: 0; font-size: 90%;">var myClass = function() {<br /> function privateMethod() {<br /> /* stuff goes here */<br /> }<br />};</pre><br />Can access: public methods(*), other private methods, privileged methods(*), private properties, public properties(*).<br />Can be accessed by: other private methods, privileged methods.<br />Are not visible outside the object's scope.<br /><br /><u>Public methods:</u><br /><br />Declaration:<br /><br /><pre style="margin: 0; font-size: 90%;">yourObject.publicMethod = function() {<br /> /* stuff goes here */<br />};</pre><br />- or -<br /><br /><pre style="margin: 0; font-size: 90%;">yourClass.prototype.publicMethod = function() {<br /> /* stuff goes here */<br />};</pre><br />Can access: other public methods, privileged methods, public properties.<br />Can be accessed by: other public methods, private methods(*), privileged methods.<br />Are visible outside the object's scope.<br /><br /><u>Privileged methods:</u><br /><br />Declaration:<br /><br /><pre style="margin: 0; font-size: 90%;">var myClass = function() {<br /> this.privilegedMethod = function() {<br /> /* stuff goes here */<br /> };<br />};</pre><br />Can access: private methods, public methods, other privileged methods, private properties, public properties.<br />Can be accessed by: public methods, private methods(*), other privileged methods.<br />Are visible outside the object's scope.<br /><br />The more astute readers will have noticed that an asterisk appears sometimes when it comes to private methods' access to public properties and methods and privileged methods. This is down to an error in the implementation of ECMA-262 where <tt style="font-size: 90%;">this</tt> incorrectly references the <tt style="font-size: 90%;">window</tt> 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:<br /><br /><pre style="margin: 0; font-size: 90%;" />This <em>should</em> work. Upon invoking <tt style="font-size: 90%;">myObj.privilegedMeth()</tt>, the private method <tt style="font-size: 90%;">privMeth()</tt> is invoked. This, in turn should be able to access the public property <tt style="font-size: 90%;">publProp</tt> and display it in an alert box. Well, it doesn't, because once execution enters the private method, <tt style="font-size: 90%;">this</tt> no longer references your instance of the <tt style="font-size: 90%;">myClass</tt> class, <tt style="font-size: 90%;">myObj</tt>. Instead, it references <tt style="font-size: 90%;">window</tt>. Given that global variables and functions are actually properties and methods of <tt style="font-size: 90%;">window</tt>, you can see this in action by creating a global variable called <tt style="font-size: 90%;">publProp</tt> and giving it a content different from the public property of your object:<br /><br /><pre style="margin: 0; font-size: 90%;">var publProp = 'variable in the global namespace';<br /><br / />An alert box saying "variable in the global namespace" will be displayed, which is definitely not the expected behaviour!<br /><br />We can get around this problem with a bit of a kludge. We create a private property (usually called <tt style="font-size: 90%;">that</tt>, but "that" is a matter of personal taste...) and assign the value of <tt style="font-size: 90%;">this</tt> 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 "that." instead of "this." and everything works again because <tt style="font-size: 90%;">that</tt> hasn't changed since the object was instantiated (whereas <tt style="font-size: 90%;">this</tt> now references <tt style="font-size: 90%;">window</tt>). The code snippet above becomes:<br /><br /><pre style="margin: 0; font-size: 90%;">var myClass = function() {<br /><br /> var that = this;<br /> this.publProp = 'I am a public property of myClass';<br /><br /> this.privilegedMeth = function() { privMeth(); };<br /><br /> function privMeth() { alert(that.publProp); }<br /><br />}<br /><br />var myObj = new myClass();<br />myObj.privilegedMeth();</pre><br />You now get the expected result.<br /><br />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's the result of a flaw in most browsers' implementation of ECMA-262 and provided a way to bypass that flaw.<br /><br />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'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:<br /><br /><pre style="margin: 0; font-size: 90%;">var gameObject = function(maxG) {<br /><br /> var guessesLeft;<br /> var found;<br /> var numToGuess;<br /> var yourGuess;<br /> var initialised = false;<br /> var maxGuesses = maxG;<br /><br /> this.start = function() {<br /> guessesLeft = maxGuesses;<br /> found = false;<br /> numToGuess = 1 + Math.floor( Math.random() * 10 );<br /> document.getElementById("startbutton").disabled = true;<br /> initialised = true;<br /> }<br />...<br />...<br />}<br /><br />var guessingGame = new gameObject(3);</pre><br />This time, when the class is instantiated, the parameter passed to the constructor, the value 3, is assigned to the private property <tt style="font-size: 90%;">maxGuesses</tt>. When the privileged method <tt style="font-size: 90%;">start()</tt> is called, we no longer blindly assign the value 5 to the private property <tt style="font-size: 90%;">guessesLeft</tt>, we assign <tt style="font-size: 90%;">maxGuesses</tt> 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.<br /><br />References to methods can also be passed to functions and used as callbacks. This is used frequently in the AJAX subsystems of <a href="" target="_blank">Prototype</a> and <a href="" target="_blank">jQuery</a>, 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 "that" 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's <a href="" target="_bind"><tt style="font-size: 90%;">bind</tt></a> method to ensure that your methods run in the desired scope/context.<img src="" height="1" width="1" alt=""/>G. Stewart E72 firmware version V51 <i>down</i>graded between versions V31 and V51.<br /><br />V51 is currently available via Nokia Software Updater and as Firmware-over-the-air.<br /><br />There are various sources of information on the internet listing things that are supposed to have changed. What I'd like to do here is give you an idea of what the new firmware feels like, which is something you can't put on paper.<br /><br />Visually, very little has changed. To be honest, the only difference I've noticed is a smaller clock at the bottom of the screen.<br /><br />People who tend to use the keypad to select elements in the phone's menus will be pleased to hear that the '7' and '8' keys can now be used again. That ability was removed in V31 for some reason or other.<br /><br />The menus do seem a little more responsive generally, although the digits still take ages to display while you're dialling a number.<br /><br /.<br /><br /.<br /><br /.<br /><br />Even though we are all told that the browser, media player and messaging application have been updated, there is no perceptible change.<br /><br />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 <b>downgrades</b> Adobe LE to version 1.5. I have no idea why this is.<br /><br /.<br /><br /.<br /><br />The e-mail client <i>still</i>.<br /><br />Reading the <a href="" target="_blank">Nokia Support Discussions</a> forum, you will hear about various problems that people say that they have had. Among the problems I've seen, there are:<br /><br /><i>I don't see the names of people calling me, only the number.</i><br /><br />It's unlikely that that happened since the update. Read <a href="">here</a>.<br /><br /><i>The phone has become unstable and never stops crashing.</i><br /><br />This is the same as any update on any phone. The usual things to try are to clear the phone's settings (*#7780#) or to attempt a re-install of the firmware.<br /><br /><i>I can't zoom into pictures using the gallery, only using the file manager.</i><br /><br />Can't say I've noticed this. I just tried to do just that and the zoom works fine in the gallery.<br /><br /><i>Received calls are no longer logged!</i><br /><br />Can't say I've noticed this either. They are logged on my handset.<br /><br />This and many other problems reported can most likely be solved in the same way as the general instability problem.<br /><br />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.<img src="" height="1" width="1" alt=""/>G. Stewart "Experiences"<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 270px; height: 65px;" src="" alt="" id="BLOGGER_PHOTO_ID_5437352461297849042" border="0" /></a>WOMWorld/Nokia have recently unveiled their "Experiences" page. It offers a view of the devices they currently have out on loan and the cities where said devices are currently being evaluated.<br /><br />Privacy.<br /><br /><div style="text-align: center;"><a style="font-style: italic;" href="" target="_blank">WOMWorld/Nokia Experiences</a><br /></div><br />I'm not sure exactly what the purpose of this is but hey, it'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.<br /><br />Speaking of the N900 I have here, I still have just over a week to evaluate it. I'll digest my findings and report back shortly thereafter.<img src="" height="1" width="1" alt=""/>G. Stewart Access Gateway femtocell<b>Or, How To Spend Lots Of Money And Then Pay For Your Mobile Calls Twice</b><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 160px;" src="" alt="" id="BLOGGER_PHOTO_ID_5434800404357620802" border="0" /></a>There's no denying that this product can be of use if you'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...<br /><br /><u>What is a femtocell and how does it work?</u><br /><br />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'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'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's own network. In effect, you have a base station in your home.<br /><br />This base station allows you to place and receive calls and to connect your phone to the internet using the 3G signal.<br /><br />In theory...<br /><br />Also, this device is 3G <i>only</i>, no GSM signal is broadcast. If your mobile phone is not a 3G phone, it will not work with this device.<br /><br /><u>A few figures</u><br /><br />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.<br /><br />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.<br /><br /><u>So, what's the problem?</u><br /><br />On the face of it, it looks like a useful piece of kit providing 3G coverage where there was none before. However...<br /><br />There have been numerous complaints (head over to Vodafone'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's network at all. You will miss calls and you won't even know about it until you try (and fail) to place a call yourself.<br /><br />Whenever your phone connects to a base station (and this device <i>is</i> a base station even though it's a lot smaller), your operator's network is updated with the ID of the base station you'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't work how it should, meaning that Vodafone doesn't know that you're connected via your femtocell and therefore can't reach you.<br /><br />The "solution" 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...<br /><br />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'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.<br /><br />But that's not all, it gets better!<br /><br />This femtocell uses your broadband connection. So, not only are you paying for the hardware, but you'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.<br /><br />Wait... There's even more...<br /><br />Not only are you using your own internet connection and hardware that you've had to pay for to extend Vodafone's network at your expense, but you're not even getting a discount on your mobile calls.<br /><br />Here's the best bit...<br /><br />If you happen to use Vodafone'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're also using your broadband allowance that you're paying for elsewhere. You are, in effect, paying for the call twice.<br /><br />So, this solution is viable, albeit costly, if you find yourself in a situation where you need to use Vodafone's mobile telephony, and Vodafone alone is an option, and if you're in an area to which Vodafone's normal network does not extend.<br /><br /><u>There are alternatives</u><br /><br />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 <a href="" target="_blank">VoIP</a>? Software exists for nearly all WLAN-enabled phones allowing you to place and receive VoIP calls on your phone.<br /><br />This can be achieved in either of two ways. The first and simplest solution is to use a system that's designed specifically for use on internet-enabled mobile phones. Such services include <a href="" target="_blank">Fring</a>, <a href="" target="_blank">Nimbuzz</a> and <a href="" target="_blank">Truphone</a>. 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.<br /><br />Internet telephony solutions normally associated with desktop computers are also available to mobile phones nowadays. I'm thinking in particular of <a href="" target="_blank">Skype</a>, 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.<br /><br />The second alternative solution is to use traditional VoIP providers, whose systems use a widely implemented protocol called SIP, or <a href="" target="_blank">Session Initiation Protocol</a>. There are numerous manufacturers of hardware SIP phones, such as <a href="" target="_blank">Cisco</a>, <a href="" target="_Blank">Snom</a> and <a href="" target="_blank">Grandstream</a>, for example. These products all "talk" SIP, which is a pretty universal protocol.<br /><br />The implementation of SIP is just a question of software. If appropriate software is available for your phone, you can get it to "talk" 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 <a href="" target="_blank">VoipTalk</a> and <a href="" target="_blank">VoipFone</a>.<br /><br />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.<br /><br />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:<br /><br /><i>3rd position</i>: 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.<br /><br /><i>2nd position</i>: 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...<br /><br /><i>1st position</i>: use your WLAN-enabled mobile phone as a SIP phone. You get call quality that'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.<br /><br />The femtocell does, however, have one major advantage over all of these three solutions: <b>convergence</b>. 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.<br /><br />Does it matter?<br /><br />It depends on the reason why you want the femtocell in the first place.<br /><br />Do you want the femtocell so that you can still be reached on your mobile when you'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'd most likely have to pay for any calls diverted this way on top of your contract, and you'd have to weigh this cost against the cost of the femtocell.<br /><br />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.<br /><br />Food for thought...<img src="" height="1" width="1" alt=""/>G. Stewart E72: review<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 109px; height: 200px;" src="" alt="" id="BLOGGER_PHOTO_ID_5432697247339583618" border="0" /></a>On Friday (22/01/10) I took delivery of a Nokia E72 handset on loan from Nokia so that I could test-drive it and write this review. The whole thing could in fact be summed up in three words: "I want one". That is not, however, particularly helpful for other people so I'll go ahead and give you the longer version as well...<br /><br /.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 109px; height: 200px;" src="" alt="" id="BLOGGER_PHOTO_ID_5432697511460338370" border="0" /></a>First impressions are very important. The build of this device is impressive. It certainly doesn't feel plasticky and flimsy like many competing phones, it has a metallic coolness and weight (128g) about it. Given that the E72 sports a full, 4-row QWERTY keypad, each of the keys is comparatively small at roughly 5mm (W) by 7mm (H) in size. At first I thought I'd have great difficulty using it because of this but I was pleasantly surprised at the speed with which I got used to it. The keys are domed, which helps you feel your way around the keypad, and the action is gentle yet well defined. The ergonomics make the keypad far easier to use than you'd initially think looking at its somewhat reduced size.<br /><br /.<br /><br /.<br /><br /.<br /><br />Knowing that this phone has native VoIP support, one of the first things I did was to set up a SIP profile on the E72 and then pay a visit to <a href="" target="_blank">forum.nokia.com</a> in order to grab and install the SIP VoIP Settings application for this model. The setup was painless and literally within seconds I had connected the phone via my wireless network to my PBX at home running <a href="" target="_blank">Asterisk</a> and was using it as my "landline" phone. Now, <i>that</i> is a feature that I missed from the N95 and which disappeared when I "upgraded" to the N96.<br /><br / <a href="" target="_blank">Spotify mobile</a>..<br /><br />The battery in this phone is a mighty 1500 mAh BP-4L, the same battery as in the N97. The <a href="" target="_blank">official specs</a>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 140px; height: 140px;" src="" alt="" id="BLOGGER_PHOTO_ID_5432697755731736626" border="0" /></a>The E72 ships with a few nice accessories, and some not so nice. First of all, the stereo earphones. I'm afraid they're a waste of space. They reproduce virtually no bass or treble and they're the kind that you're supposed to wedge in your ear, and they invariably fall out all the time despite coming with three different sizes of rubber grommet. Not only that but the inline remote control only has volume up/down keys and a call key, and looks (and feels) cheap and nasty. This phone is fully compatible with the more complete remote control of the 5800 XpressMusic, which also includes track skip, fast-forward, rewind, pause/play and stop controls, and a lock. It also has a standard 3.5 mm stereo socket on it into which you can plug a standard set of earphones, such as noise-isolating in-ear buds. Forget the supplied earphones, get yourself an <a href="" target="_blank">AD-54 audio adapter</a> and some decent earbuds. Your ears will thank you.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 142px; height: 106px;" src="" alt="" id="BLOGGER_PHOTO_ID_5432698000840351794" border="0" /></a>You can use a microUSB cable to connect the phone to your computer. The supplied CA-101D "cable" (in quotes because it's a bit of a joke, "stub" would be a more accurate description) is only about 10 cm long and therefore probably OK for laptop users. It's no good whatsoever for users of desktop systems because it's just far too short. The photo above shows it next to an SD card, which gives you an idea of its size, or rather lack thereof. You'll definitely want to invest in a normal <a href="" target="_blank">CA-101</a> cable. Note that the E72 can be charged through the USB port. The rate at which it charges is, however, much slower than if you use the supplied AC-8 charger, which takes approximately 2 hours to charge the battery fully. For the phone's USB port to be fully functional, it needs to be connected to a USB 2.0 port on your computer. My (rather old) laptop only has USB 1.1 and the phone will not charge when connected to it, nor will "mass storage" mode work. USB charging is comparatively rare on Nokia handsets.<br /><br / <i>send</i> large volumes of data, HSUPA at up to 2 megabits per second.432698319420095586" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="" alt="" id="BLOGGER_PHOTO_ID_5432698314999671042" border="0" /></a><br /.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 100px;" src="" alt="" id="BLOGGER_PHOTO_ID_5432698630778474706" border="0" /></a><br /.<br /><br / <i>a priori</i> developed specifically for the series of phones not use it?<br /><br /...<br /><br />The killer application on the E72, in particular since Nokia announced <a href="" target="_blank">free navigation</a> on several devices including this one, is <a href="" target="_blank">OVI Maps</a>. <a href="" target="_blank">maps.ovi.com</a> account. Another feature added in this version is "location sharing", whereby you can update your <a href="" target="_blank">facebook</a> status with your location and an optional photo. The resulting status update on your facebook profile will include a link to a map marking the coordinates of the location you shared in this manner.<br /><br / <a href="" target="_blank">acknowledged by Nokia</a>.<br /><br /><span style="color: #600;">Update 06/02/2010: The fix I was given to test has now been officially released by Nokia. You can grab it from <a href="" target="_blank">this support page</a>.</span><br /><br / <i>down</i>grade).<br /><br /.<br /><br />Incidentally, I signed up with <a href="" target="_blank">Virgin Mobile</a> <u>is<!<img src="" height="1" width="1" alt=""/>G. Stewart navigation with OVI Maps!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 341px; height: 142px;" src="" alt="" id="BLOGGER_PHOTO_ID_5429309926136878754" border="0" /></a><br />On the morning of January 21st 2010, Nokia announced that turn-by-turn navigation would be free for all to use on their Nokia handsets.<br /><br />Until now, the OVI Maps software (formerly known as Nokia Maps) was free to use for finding your current position and managing locations, but obtaining step-by-step directions from one location to another with vocal prompts was subject to the purchase of a navigation licence.<br /><br />The roll-out of free navigation is not yet global. The ability to use it is subject to installing OVI Maps V3.03, which is not yet ported to all models. As of writing, the models supported are:<br /><br /><div style="text-align: center; font-weight: bold;">5230, 5800 XpressMusic, 5800 Navigation Edition<br />6710 Navigator, 6730 classic, X6<br />E52, E55, E72, N97 mini</div><br />Current speculation is that this new version of OVI Maps will be embedded in the V21 firmware update of the N97 that is due to be released later this month. It is also thought that OVI Maps V3.03 is the reason why the V21 update, originally announced for December 2009, was delayed.<br /><br />Visit <a href="" target="_blank"><b></b></a> for more details.<img src="" height="1" width="1" alt=""/>G. Stewart 5800 XpressMusic V40 firmware update<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href=""><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 190px;" src="" alt="" id="BLOGGER_PHOTO_ID_5426549859989309042" border="0" /></a><br />What better way to kick off the New Year's blogs than with the announcement of a great firmware update from Nokia?<br /><br /.<br /><br / <i>did</i> notice may be totaly subjective.<br /><br /><b>BUGFIXES</b><br /><br />There were three (most likely related) bugs introduced in V30 and carried over to V31 that almost ruined the experience of using the 5800XM for me:<br /><br />1) Scheduled backups would not happen<br />2) The alarm would go off late<br />3) Timed profiles would expire late<br /><br />These bugs would appear to have been eradicated in V40. The scheduled backup <u>did</u> happen last night, my alarm went off at 07:45 precisely instead of some indeterminate time between 07:45 and 07:55, and the timed profile expired at 08:00 dead on. That is a major relief, it's been random since I installed <a href="" target="_blank">V30 in October</a> last year.<br /><br /><b>NEW THINGS I LIKE</b><br /><br /><u>More responsive</u><br /><br /.<br /><br /><u>More RAM</u><br /><br />Running <a href="" target="_blank">x-plore<.<br /><br /><u>More battery life</u><br /><br />Preliminary investigations using Nokia's "<a href="" target="_blank">Energy Profiler</a>" suggest that the operating system has been optimized to use less battery power and thus increase battery life when in standby, which is the status in which the phone finds itself most of the time.<br /><br /><u>Swipe action</u><br /><br / <u>and silences the ringtone</u> but doesn't reject the call. You have to tap a button on the screen after you've unlocked the keypad in order to do that. The green and red keys still, however, function as normal (answer and reject).<br /><br /.<br /><br /><u>Visual feedback</u><br /><br /.<br /><br /><b>NEW THINGS I HAVE MIXED FEELINGS ABOUT</b><br /><br /><u>Auto QWERTY keypad</u><br /><br /.<br /><br /><u>New "Contacts Bar" homescreen theme</u><br /><br /.<br /><br /.<br /><br />Nice try but it needs more work.<br /><br /><u>Kinetic scrolling</u><br /><br /, <a href="" target="_blank">Gravity</a> and Nokia's own touch screen <a href="" target="_blank">Photo Browser</a>.<br /><br />The trouble is, its implementation is inconsistent. Kinetic scrolling does not function in the phone's menus, nor can you use it to scroll through the text of a message or an e-mail.<br /><br />Personally, I never had any problem sliding the scroll bar to the right of the screen and I find myself still using that rather than kinetic scrolling. At least it's implemented consistently, you can use it everywhere.<br /><br /><b>THINGS THAT LEFT ME PERPLEXED</b><br /><br / <i>Connectivity > Data transfer</i>, where it seemed perfectly at home, to <i>Settings</i> leaves me thinking "What was that in aid of?".<br /><br /><b>THINGS I DEFINITELY DISLIKED</b><br /><br /><u>Subscription to "My Nokia"</u><br /><br /.<br /><br /!<br /><br /><u>FM radio</u><br /><br />The FM Radio no longer works. It'll start, but then it becomes totally unresponsive. You can't change preset stations, retune manually or do anything other than exit the radio application.<br /><br />I never use the thing so it doesn't really bother me, but I do appreciate the frustration of people who do use it in much the way that not many people were bothered about the bugs present in V30/V31 while I definitely was!<br /><br /><b>IN CONCLUSION</b><br /><br /.<br /><br /.<br /><br />This is a major update so it won't be available over-the-air. If you want it (and I certainly recommend that you do install it), you'll need to update the phone on your computer using <a href="" target="_blank">Nokia Software Updater</a>.<img src="" height="1" width="1" alt=""/>G. Stewart