tag:blogger.com,1999:blog-41996004332418855892024-02-07T16:06:21.788+13:00Ziglio's Tech BlogEmanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.comBlogger85125tag:blogger.com,1999:blog-4199600433241885589.post-33226913809638453672018-06-11T22:14:00.001+12:002018-06-11T22:14:34.982+12:00Embedded Flight Controller TutorialThis is an excellent series. I'll post the links here because I keep losing them:<br />
<br />
<br />
<ul>
<li><a href="http://lyfkyle.blogspot.com/2016/11/project-1-custom-flight-controller-part.html">Project 1: Custom Flight Controller Part 0: Overview</a></li>
<li><a href="http://lyfkyle.blogspot.com/2016/11/custom-flight-controller-part-1-simple.html">Custom Flight Controller Part 1: A Simple Revision on Quadcopter Flying Principle</a></li>
<li><a href="http://lyfkyle.blogspot.com/2016/11/custom-flight-controller-part-21.html">Custom Flight Controller Part 2.1: Getting the Orientation --- Get Data from MPU9250 Sensor Module</a> </li>
<li><a href="http://lyfkyle.blogspot.com/2016/11/custom-flight-controller-part-22.html">Custom Flight Controller Part 2.2: Getting the Orientation --- The Quaternion Kalman Filter</a></li>
<li>
<a href="http://lyfkyle.blogspot.com/2016/11/custom-flight-controller-part-22_16.html">Custom Flight Controller Part 2.3: Getting the Orientation --- The Matlab Simulation</a> </li>
<li><a href="http://lyfkyle.blogspot.com/2017/01/custom-flight-controller-part-23.html">Custom Flight Controller Part 2.4: Getting the Orientation --- Migrate to STM32</a> </li>
<li><a href="http://lyfkyle.blogspot.com/2017/01/custom-flight-controller-part-25.html">Custom Flight Controller Part 2.5: Getting the Orientation --- QKF on STM32 </a></li>
<li>
<a href="http://lyfkyle.blogspot.com/2017/01/custom-flight-controller-part-26.html">Custom Flight Controller Part 2.6: Getting the Orientation --- Using Interrupt to Get Data from MPU9250 </a></li>
<li>
<a href="http://lyfkyle.blogspot.com/2017/01/custom-flight-controller-part-27.html">Custom Flight Controller Part 2.7: Getting the Orientation --- Mag Calibration and Overall Algorithm Structure. </a></li>
<li>
<a href="http://lyfkyle.blogspot.com/2017/01/custom-flight-controller-part-28.html">Custom Flight Controller Part 2.8: Getting the Orientation --- Processing Orientation Visualization</a></li>
</ul>
<div>
And here's <a href="https://github.com/lyf44/Custom-Flight-Controller" target="_blank">a link to the code on GitHub</a>.</div>
<div>
<br /></div>
<div>
Thank you Lyfkyle, great work!</div>
<div>
<br /></div>
Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-13999943082317925972017-03-15T10:57:00.000+13:002017-03-16T13:04:59.860+13:00Using Java 8's Function to refactor Decorator and Adapter patterns
<br />
<div class="tr_bq">
Two days into using Java 8 (I know, long overdue, but you know... <a href="https://groups.google.com/forum/?fromgroups#!topic/google-appengine/Zn7X3D7o584" target="_blank">App Engine</a>), I'm having fun refactoring some legacy (Swing, ouch) codebase.</div>
<br />
One of the most powerful new tools is "Function", and I'm discovering how you can refactor entire classes, anymous or not, with one line of code, see for example <a href="http://stackoverflow.com/questions/5107158/how-to-pass-parameters-to-anonymous-class/42797150#42797150" target="_blank">this question</a>:<br />
<br />
<blockquote style="background-color: white; border: 0px; clear: both; color: #242729; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 15px; margin-bottom: 1em; padding: 0px;">
<div style="border: 0px; clear: both; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; margin-bottom: 1em; padding: 0px;">
Is it possible to pass parameters, or access external parameters to an anonymous class? For example:</div>
<pre class="lang-java prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; margin: 0px; padding: 0px; white-space: inherit;"><span class="kwd" style="border: 0px; color: #101094; margin: 0px; padding: 0px;">int</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> myVariable </span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">=</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> </span><span class="lit" style="border: 0px; color: #7d2727; margin: 0px; padding: 0px;">1</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">;</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">
myButton</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">.</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">addActionListener</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">(</span><span class="kwd" style="border: 0px; color: #101094; margin: 0px; padding: 0px;">new</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> </span><span class="typ" style="border: 0px; color: #2b91af; margin: 0px; padding: 0px;">ActionListener</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">()</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> </span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">{</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">
</span><span class="kwd" style="border: 0px; color: #101094; margin: 0px; padding: 0px;">public</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> </span><span class="kwd" style="border: 0px; color: #101094; margin: 0px; padding: 0px;">void</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> actionPerformed</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">(</span><span class="typ" style="border: 0px; color: #2b91af; margin: 0px; padding: 0px;">ActionEvent</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> e</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">)</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> </span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">{</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">
</span><span class="com" style="border: 0px; color: #858c93; margin: 0px; padding: 0px;">// How would one access myVariable here?</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">
</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">}</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">
</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">});</span></code></pre>
</blockquote>
<div style="background-color: white; border: 0px; clear: both; color: #242729; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 15px; margin-bottom: 1em; padding: 0px;">
Here's<a href="http://stackoverflow.com/a/42797150/809536" target="_blank"> my proposed solution</a>, using Function:</div>
<pre class="lang-java prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; margin: 0px; padding: 0px; white-space: inherit;"><span class="typ" style="border: 0px; color: #2b91af; margin: 0px; padding: 0px;">Function</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"><</span><span class="typ" style="border: 0px; color: #2b91af; margin: 0px; padding: 0px;">Integer</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">,</span><span class="typ" style="border: 0px; color: #2b91af; margin: 0px; padding: 0px;">ActionListener</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">></span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> printInt </span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">=</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">
intvar </span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">-></span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> ae </span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">-></span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> </span><span class="typ" style="border: 0px; color: #2b91af; margin: 0px; padding: 0px;">System</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">.</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">out</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">.</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">println</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">(</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">intvar</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">);</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">
</span><span class="kwd" style="border: 0px; color: #101094; margin: 0px; padding: 0px;">int</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> myVariable </span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">=</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> </span><span class="lit" style="border: 0px; color: #7d2727; margin: 0px; padding: 0px;">1</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">;</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">
myButton</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">.</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">addActionListener</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">(</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> printInt</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">.</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">apply</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">(</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">myVariable</span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">)</span><span class="pln" style="border: 0px; color: #303336; margin: 0px; padding: 0px;"> </span><span class="pun" style="border: 0px; color: #303336; margin: 0px; padding: 0px;">);</span></code></pre>
<div style="background-color: white; border: 0px; clear: both; margin-bottom: 1em; padding: 0px;">
<div style="color: #242729; font-family: arial, "helvetica neue", helvetica, sans-serif; font-size: 15px;">
<br /></div>
<div style="color: #242729; font-family: arial, "helvetica neue", helvetica, sans-serif; font-size: 15px;">
I think the power of Function becomes obvious when we apply it to refactoring patters such as Decorator, Adapter or other type of proxies.</div>
<div style="color: #242729; font-family: arial, "helvetica neue", helvetica, sans-serif; font-size: 15px;">
Here's some code I've just refactored, showing how you can refactor an entire class with a one liner Function:</div>
<script src="https://gist.github.com/ZiglioNZ/0b5039650300c2375c64b1ed2e3aacb8.js"></script>
<br />
<div style="color: #242729; font-family: arial, "helvetica neue", helvetica, sans-serif; font-size: 15px;">
<br /></div>
<div style="color: #242729; font-family: arial, "helvetica neue", helvetica, sans-serif; font-size: 15px;">
<br /></div>
</div>
PS Don't miss this talk by Trisha Gee
<iframe width="560" height="315" src="https://www.youtube.com/embed/NcetKbGayZY" frameborder="0" allowfullscreen></iframe>
Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-17080560450988423242016-09-14T13:29:00.002+12:002016-09-14T13:29:27.578+12:00Transposing vectors of complex numbers in MatlabCareful when applying the transpose (apostophe) operator to a vector of complex numbers. <a href="https://au.mathworks.com/matlabcentral/answers/18151-fft-of-row-and-column-vectors-not-equal" target="_blank">See here</a>:<div>
<br /></div>
<div>
<blockquote class="tr_bq" style="background-color: white; box-sizing: border-box; color: #404040; font-family: Arial, Helvetica, sans-serif; font-size: 12.75px; padding: 0px;">
You have to use .' (dot transpose)<br />If you use the tranpose operator on a complex-valued vector, matrix in MATLAB, it returns the conjugate transpose by default.</blockquote>
</div>
<div>
<br /></div>
<div>
<br /></div>
Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-9026853085396455192016-09-01T22:43:00.000+12:002016-09-01T22:44:56.701+12:00Correlation vs ConvolutionThis is a basic relationship in DSP.<br />
<br />
When we talk about similarity between signals, we normally talk about "correlation".<br />
When we talk about filtering, in the time domain that's a "convolution".<br />
<br />
Correlation and convolution are basically the same thing.<br />
The only difference is that correlation is a convolution by the inverted (or flipped) version of the same signal in the time domain:<br />
<br />
y(n) = h(n)*x(n) --> convolution<br />
y(n)=h(n)*x(-n) -> correlation<br />
<br />
In Matlab/Octave that would be:<br />
<br />
y = conv( h, x) for convolution<br />
<br />
or<br />
<br />
y = conv( h, flip(x)) for correlation.<br />
<br />
In the frequency domain, the operation of flipping in the time domain translates into the "conjugate" version of the transform, that is with an inverted sign for its imaginary part.<br />
<br />
<br />Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-4774459703685104552016-08-02T11:35:00.002+12:002016-08-02T11:49:30.331+12:00Fix for FR_NO_FILESYSTEM error with the embedded FatFS file system<a href="http://elm-chan.org/fsw/ff/00index_e.html" target="_blank">FatFs</a> is a popular file system for embedded applications.<br />
Occasionally though I was having trouble accessing some SD cards, a problem that's been reported <a href="https://www.lpcware.com/content/forum/frnofilesystem-error-fafts-working-sd-card-fat32-mci-interface-lpc1788" target="_blank">here</a>.and <a href="https://community.nxp.com/thread/416897" target="_blank">here</a>.<br />
I've looked at a working SD card and a not working one.<br />
They were different models and size but the problem came down to the second card not having its logical partition defined as primary. Using Minitool Partition Wizard you can fix this by doing:<br />
<br />
1. Right Click on First Partition<br />
2. Select Set Partition as Primary<br />
2. Click on Apply Changes<br />
<br />
The partition goes from Logical to Primary.<br />
<br />
FAT32 also works, I've tried up to 8GB.<br />
<br />
<br />Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com2tag:blogger.com,1999:blog-4199600433241885589.post-20437013240438002422014-01-23T10:03:00.004+13:002014-01-23T10:03:32.054+13:00How to reduce memory usage when marshalling large KML files with JAK (the Java API for KML)This is something I discovered a while ago and never got around to publish it on this blog.<br />
<br />
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
for a while I've been experiencing memory issues when marshalling large files.</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
I've monitored this usage with some crude profiling:</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
25,000 locations: 72MB</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
50,000 locations: 140MB</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
So I've looked for ways to reduce this problem. One approach is to marshal the file in chunks instead of all at once. Here are some useful links:</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<a href="http://stackoverflow.com/questions/1775202/how-to-stream-large-files-using-jaxb-marshaller" style="border: 0px; color: #6611cc; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank">http://stackoverflow.com/<wbr></wbr>questions/1775202/how-to-<wbr></wbr>stream-large-files-using-jaxb-<wbr></wbr>marshaller</a></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<a href="http://rezarahim.blogspot.co.nz/2010/05/chunking-out-big-xml-with-stax-and-jaxb.html" style="border: 0px; color: #6611cc; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank">http://rezarahim.blogspot.co.<wbr></wbr>nz/2010/05/chunking-out-big-<wbr></wbr>xml-with-stax-and-jaxb.html</a></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
Example:</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<pre style="background-color: #eeeeee; border: 0px; color: black; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.600000381469727px; line-height: 17.600000381469727px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="background-color: transparent; border: 0px; color: #2b91af; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">JAXBContext</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"> context </span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span style="background-color: transparent; border: 0px; color: #2b91af; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">JAXBContext</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">newInstance</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">type</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">);</span></code></pre>
<pre style="background-color: #eeeeee; border: 0px; color: black; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.600000381469727px; line-height: 17.600000381469727px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="background-color: transparent; border: 0px; color: #2b91af; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">Marshaller</span></span></code><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"> m </span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"> context</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">createMarshaller</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">();</span></pre>
<pre style="background-color: #eeeeee; border: 0px; color: black; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.600000381469727px; line-height: 17.600000381469727px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><pre style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.600000381469727px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">m</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">setProperty</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span style="background-color: transparent; border: 0px; color: #2b91af; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">Marshaller</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">JAXB_<wbr></wbr>FRAGMENT</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span style="background-color: transparent; border: 0px; color: #2b91af; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">Boolean</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">TRUE</span><span style="background-color: transparent; border: 0px; font-size: 13.600000381469727px; margin: 0px; padding: 0px; vertical-align: baseline;">);</span></code></pre>
</pre>
</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
java.io.StringWriter sw = new java.io.StringWriter();</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
XMLStreamWriter xmlOut = XMLOutputFactory.newFactory().<wbr></wbr>createXMLStreamWriter(sw);</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeStartDocument("<wbr></wbr>UTF-8", "1.0");</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeStartElement("kml"<wbr></wbr>);</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeDefaultNamespace("<a href="http://www.opengis.net/kml/2.2" style="border: 0px; color: #6611cc; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank"><wbr></wbr>http://www.opengis.net/kml/2.2</a><wbr></wbr>");</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeNamespace("atom", "<a href="http://www.w3.org/2005/Atom" style="border: 0px; color: #6611cc; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank">http://www.w3.org/2005/Atom</a>")<wbr></wbr>;</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeNamespace("kml", "<a href="http://www.opengis.net/kml/2.2" style="border: 0px; color: #6611cc; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank">http://www.opengis.net/kml/2.<wbr></wbr>2</a>");</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeNamespace("gx", "<a href="http://www.google.com/kml/ext/2.2" style="border: 0px; color: #6611cc; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank">http://www.google.com/kml/<wbr></wbr>ext/2.2</a>");</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeNamespace("xal", "urn:oasis:names:tc:ciq:<wbr></wbr>xsdschema:xAL:2.0");</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeStartElement("<wbr></wbr>Document");</div>
</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
// iterate through your placemarks here</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
Placemark placemark = new Placemark()</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
...</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
m.marshal(placemark, xmlOut);</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeEndElement(); // Document</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.writeEndElement(); // kml</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
xmlOut.close();</div>
</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
This is an intermediate solution that sacrifices elegance but this way I've been able to reduce memory usage at least by 60%:</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
25,000 locations: 20MB</div>
<div style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
50,000 locations: 40MB</div>
</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
I believe a similar approach can be used when parsing large documents.</div>
<div style="background-color: white; border: 0px; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 12.800000190734863px; margin: 0px; padding: 0px; vertical-align: baseline;">
I hope someone finds this useful</div>
Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-35921195987482316982013-07-30T12:09:00.004+12:002013-07-30T12:22:24.519+12:00My journey from Python to Java, to Scala... and back to Java<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Here's an update on my work for improving the Construct library in java and make it more type safe and easy to use </span><br />
<a class="ot-anchor" href="https://github.com/ZiglioNZ/construct" rel="nofollow" style="-webkit-transition: color 0.218s; background-color: white; color: #427fed; cursor: pointer; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px; text-decoration: none; transition: color 0.218s;">https://github.com/ZiglioNZ/construct</a><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Previous versions would work like this.</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">1. define a Struct at runtime, and composite it by passing in static constructors of other Constructs:</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Struct s = Struct( "struct",</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> UBInt8("a"),</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> UBInt16("b"),</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> Struct("foo",</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> UBInt8("c"),</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> UBInt8("d")))</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">2. then we can use this struct to parse a byte array. That returns a Map type called Container:</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Container c = struct.parse(ByteArray(1, 0, 2, 3, 4));</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">3. we can then extract the parsed value from the map/container:</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">assertEquals( 1, c.get("a"));</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">assertEquals( 2, c.get("b")); </span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">assertEquals( 3, ((Container)c.get("foo")).get("c"));</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">assertEquals( 4, ((Container)c.get("foo")).get("d"));</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">You can see there are a few problems that make this API not so nice to use: </span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">first, the problem with maps and key strings, one has to remember the names and refactoring for those names is painful</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">second, all that casting: due to java's lack of type inference, it's difficult to deal with HMaps, of the type that parsers return, therefore casting has to be added.</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">As a way to mitigate these problems, I've looked at Scala.</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Scala offers nice things like elegant default constructor and case classes. Those two things combined could help creating a CLASS, instead of a runtime collection of fields. </span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Having a class would help the IDE with code completion: no longer I would have to remember field names, they would be class fields, therefore IDE code completion and refactoring.</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">I've thought long and hard and tried different things, and stumbled against some limitations of scala, case classes and inheritance.</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">At the end I went back to using Java reflection, with the idea that later I will look into Scala macros to improve it.</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">How have I done it?</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Well, first instead of passing objects to a Struct at runtime, I statically define a Struct with a number of fields:</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> class Foo extends Struct {</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> public Foo(String name ){super(name);}</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> public UBInt8 c;</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> public UBInt8 d;</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> }</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> class S extends Struct {</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> public UBInt8 a;</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> public UBInt16 b;</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> public Foo foo;</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> }</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Then I've added code to the Stuct constructor that at runtime uses reflection to inspect the Struct fields and create an instance of it, by passing the name of the field, that is also inspected via reflection.</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">The last trick is a way for each field to hold an Object, that is the result of a call to parse(). The Struct itself updates this value for each field, after parsing.</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">Now I have a get() method that returns that value for each field, see:</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> S s = new S();</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> s.parse(ByteArray(1, 0, 2, 3, 4));</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> assertEquals(1, s.a.get());</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> assertEquals(2, s.b.get());</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> assertEquals(3, s.foo.c.get());</span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> assertEquals(4, s.foo.d.get());</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">I think it's much nicer to use. It's not type safe yet, since I need to update all my field definition in order to return the correct type, but I'm definitely getting there.</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">I think this is a win for java, that is still kicking.</span><br />
<span class="proflinkWrapper" style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"><span class="proflinkPrefix" style="-webkit-transition: color 0.218s; color: #427fed; transition: color 0.218s;">+</span><a class="proflink" href="https://plus.google.com/118250856084877669014" oid="118250856084877669014" style="-webkit-transition: color 0.218s; color: #427fed; cursor: pointer; font-weight: bold; text-decoration: none; transition: color 0.218s;">Pascal Voitot Dev</a></span><span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;"> can definitely explain all the subtleties why scala reflection would be better than java's, and why macros would be even better. </span><br />
<span style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">From the practical point of view I think this is a good compromise,</span><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<a class="ot-anchor" href="https://github.com/ZiglioNZ/construct/blob/83c01e14e30f7c04875f303cd423eecd14d97834/src/main/java/com/sirtrack/construct/Core.java" rel="nofollow" style="-webkit-transition: color 0.218s; background-color: white; color: #427fed; cursor: pointer; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px; text-decoration: none; transition: color 0.218s;">https://github.com/ZiglioNZ/construct/blob/83c01e14e30f7c04875f303cd423eecd14d97834/src/main/java/com/sirtrack/construct/Core.java</a><br />
<br style="background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;" />
<a class="ot-anchor" href="https://github.com/ZiglioNZ/construct/blob/83c01e14e30f7c04875f303cd423eecd14d97834/src/test/java/com/sirtrack/construct/ConstructTest.java" rel="nofollow" style="-webkit-transition: color 0.218s; background-color: white; color: #427fed; cursor: pointer; font-family: Roboto, arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px; text-decoration: none; transition: color 0.218s;">https://github.com/ZiglioNZ/construct/blob/83c01e14e30f7c04875f303cd423eecd14d97834/src/test/java/com/sirtrack/construct/ConstructTest.java</a>Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-33540608623535458442013-03-14T15:18:00.002+13:002013-04-02T12:42:14.592+13:00Google Reader AlternativesGoogle Reading is shutting down 1 July 2013. What are (cloud based) alternatives?<br />
<br />
Promising<br />
<ol>
<li><a href="http://www.newsblur.com/">http://www.newsblur.com/</a></li>
<li><a href="http://feedly.com/">http://feedly.com/</a></li>
</ol>
<div>
Both products promise seamless integration with Reader, that is the ability to import all existing feeds. Both services are experiencing an obvious surge in traffic and are unable at the moment to accept new users.</div>
<div>
Newsblur looks like it has good client support, web and mobile. Also it is an <a href="https://github.com/samuelclay/NewsBlur" target="_blank">open source project</a>.</div>
<div>
From the FAQ thought it looks like their web service might not be able to poll regularly all the newsfeeds, but mainly the ones that people request the most.</div>
<div>
I'd like to try it, and I'll be more than happy to pay for a good service.</div>
<div>
<br /></div>
<div>
Google's move also means definitive death for Listen, the podcast catcher I've been using all these years on Android.</div>
<div>
Well, there are other solutions I know, but will they integrate with either newsblur or feedly?<br />
<br />
[UPDATE, 2 April]<br />
The <a href="https://play.google.com/store/apps/details?id=com.noinnion.android.greader.readerpro&hl=en" target="_blank">latest Android update</a> for <a href="http://www.greader.co/" target="_blank">gReader Pro</a> claims "<span style="background-color: white; color: #666666; font-family: Roboto, Arial, sans-serif; font-size: 12.727272033691406px; line-height: 16.363636016845703px;">gReader will work after the closure. We are working on a solution.</span>" Fingers crossed</div>
<div>
<br /></div>
<div>
<br /></div>
Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-716084645418903062013-02-23T20:04:00.004+13:002013-02-23T20:35:51.991+13:00Loving Open Source<span style="background-color: white; font-family: Arial, sans-serif; line-height: 12px;">Pretty much every component of our system is made out of open source components I can and have changed/contributed to.</span><br />
<span style="background-color: white; font-family: Arial, sans-serif; line-height: 12px;">Not every one of these components has a large community behind but sometimes I'm surprised by Pull Requests and Q&A on google groups or stack overflow.</span><br />
<span style="background-color: white; font-family: Arial, sans-serif; line-height: 12px;">I find it invaluable having direct access to people who have implemented a library, sharing ideas, asking questions about their design.</span><br />
<span style="background-color: white; font-family: Arial, sans-serif; line-height: 12px;">These days sometimes it feels like I'm not growing as much as I used to, I don't learn entirely new things every day anymore. But looking back, gosh! the progress over the years has been constant and the accumulate knowledge significant. More than anything: written software still appears sound. If I go back, and I look at how certain things got implemented, even smaller things, they look simple and beautiful (not everything of course).</span><br />
<span style="background-color: white; font-family: Arial, sans-serif; line-height: 12px;">As a proof of that, extending and providing new services doesn't take too long. </span><br />
<span style="background-color: white; font-family: Arial, sans-serif; line-height: 12px;">Iterative refactoring allows me to consolidate the good things and to get rid of the bad (copy&paste) ones.</span><br />
<br />
<span style="background-color: white; font-family: Arial, sans-serif; line-height: 12px;">I'd like to take a chance and thank all the contributors to these projects:</span><br />
<span style="background-color: white; font-family: Arial, sans-serif; line-height: 12px;"><a href="http://www.sienaproject.com/index.html" target="_blank">Siena Project</a></span><br />
<a href="http://code.google.com/p/objectify-appengine/" target="_blank">Objectify</a><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><a href="https://construct.readthedocs.org/en/latest/" target="_blank">Construct</a></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><a href="http://openlayers.org/" target="_blank">Open Layers</a></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><a href="https://github.com/mleibman/SlickGrid" target="_blank">SlickGrid</a></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><a href="http://knockoutjs.com/" target="_blank">KnockoutJS</a></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><a href="http://www.vosao.org/" target="_blank">Vosao CMS</a></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><a href="http://code.google.com/p/sfdc-wsc/" target="_blank">Force.com Web Service Connector</a></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;">All Google's Contributions and Resources!</span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><br /></span></span>
<br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;">plus several others... </span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;">For my contributions in my free time and at work go to:</span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><br /></span></span>
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><a href="http://github.com/ZiglioNZ/">github.com/ZiglioNZ/</a></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><a href="http://github.com/sirtrack">github.com/sirtrack</a></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><br /></span></span>
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><br /></span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;">PS Recently I've been invited to take part of a project related to my latest interest: <a href="http://en.wikipedia.org/wiki/Strabismus" target="_blank">strabismus</a> and <a href="http://en.wikipedia.org/wiki/Amblyopia" target="_blank">amblyopia</a>.</span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;">There's no public information available for this particular project yet but it will eventually become Open Source on GitHub!</span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="line-height: 12px;"><br /></span></span>
<br />
<span style="font-family: Arial, sans-serif; font-size: x-small;"><span style="line-height: 12px;"><br /></span></span>Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-86567949731579300032012-07-17T09:11:00.005+12:002020-12-10T23:08:40.503+13:00Java Construct 1.1.2 ReleaseJava Construct 1.1.2 is now available!<br />
<br />
You can download it from <a href="https://github.com/ZiglioUK/construct/tags" style="background-color: white;">https://github.com/ZiglioUK/construct/tags</a><br />
<br />
Also available from Maven Central<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJm8Gnh9VBAzW6Ztp9n6KRJ-FjDK68x3NuWN3TjFl4E9oRrRninoEcqi-sivdO66k7U9A58GA_Y7F-NQZXuRM7dq_6Nr2sr6BorvElSHWCdAknJ59HtVU1sL4S5hmWMnhXQmMWZplNaAv2/s320/codebg.gif); background: rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> <dependency>
<groupId>com.sirtrack</groupId>
<artifactId>javaconstruct</artifactId>
<version>1.1.2</version>
</dependency>
</code></pre>
<br />
New features:<br />
<br />
<ol>
<li>a CRC/Checksum Construct, see example on how to use it: <a href="https://github.com/ZiglioUK/construct/blob/master/src/main/java/com/sirtrack/construct/protocols/layer3/ipv4.java" target="_blank">IPv4</a> </li>
<li>Implemented Restreams (dynamic Structs) - only parsing for now</li>
<li>Implemented MetaArray, Sequence, more Adapters and Macros</li>
<li>Added an experimental BeanAdapter for typesafe conversion from/to a Container</li>
</ol>
<div>
TODOs:</div>
<div>
<ol>
<li>Improve formatting. I'm sorry but each new release of Eclipse loses my settings. It looks good on Eclipse, but for anyone else tabs are all over the place</li>
<li>Implement Restream.build() at a certain point </li>
</ol>
<div>
Nice to have:</div>
</div>
<div>
<ol>
<li>Do some performance testing, using the <a href="https://github.com/eishay/jvm-serializers" target="_blank">Jvm Serializers</a> benchmark</li>
<li>Cleanup the low level, possibly moving away from ByteBuffer, in similar way as <a href="https://groups.google.com/forum/?fromgroups#!forum/kryo-users" target="_blank">Kryo 2</a> did.</li>
</ol>
</div>
<h3>
<span style="font-size: large;"><b>About Construct</b></span></h3>
<div>
<a href="https://github.com/construct/construct" target="_blank">Python Construct</a> is a library for parsing and building binary messages. </div>
<div>
<a href="https://github.com/ZiglioUK/construct" target="_blank">Java Construct</a> is an "as faithful as possible" translation to Java of Python Construct 2.x. </div>
<div>
See the <a href="http://construct.readthedocs.org/en/latest/index.html" target="_blank">docs</a> for explanations and examples. </div>
<div>
<br /></div>
<div>
<br /></div>Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com3tag:blogger.com,1999:blog-4199600433241885589.post-33628915817260700732012-01-20T10:17:00.005+13:002020-12-10T23:11:04.062+13:00Java Construct 1.0.0 Release<span class="Apple-style-span" face="arial, sans-serif" style="font-size: 14px;"></span><br />
<pre>I'm pleased to announce release 1.0.0 of Java Construct, a faithful
port to Java of Python Construct.
About Python Construct: <a href="http://construct.wikispaces.com/">http://construct.wikispaces.com/</a>
"Construct is a python library for parsing and building of data
structures (binary or textual). It is based on the concept of defining
data structures in a declarative manner, rather than procedural code:
more complex constructs are composed of a hierarchy of simpler ones.
It's the first library that makes parsing fun, instead of the usual
headache it is today."
About Java Construct: <a href="https://github.com/ZiglioUK/construct/">https://github.com/ZiglioUK/construct/</a>
This Java version employs some syntactic sugar (i.e. static methods)
to make the syntax as close as possible to the original Construct
library in Python.
Example of a Construct:
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJm8Gnh9VBAzW6Ztp9n6KRJ-FjDK68x3NuWN3TjFl4E9oRrRninoEcqi-sivdO66k7U9A58GA_Y7F-NQZXuRM7dq_6Nr2sr6BorvElSHWCdAknJ59HtVU1sL4S5hmWMnhXQmMWZplNaAv2/s320/codebg.gif); background: rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> import static construct.Core.*;
import static construct.Macros.*;
import static construct.Adapters.*;
import static construct.lib.Containers.*;
Construct struct = BitStruct(
"foo",
BitField("a", 3),
Flag("b"),
Padding(3),
Nibble("c"),
Struct("bar",
Nibble("d"),
Bit("e")
)
);
</code></pre>
A Java Construct can parse byte arrays and produces Objects like
Containers. Viceversa, it can take Objects to produce byte arrays.
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJm8Gnh9VBAzW6Ztp9n6KRJ-FjDK68x3NuWN3TjFl4E9oRrRninoEcqi-sivdO66k7U9A58GA_Y7F-NQZXuRM7dq_6Nr2sr6BorvElSHWCdAknJ59HtVU1sL4S5hmWMnhXQmMWZplNaAv2/s320/codebg.gif); background: rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> public Object parse(byte[] data);
public byte[] build( Object obj);
</code></pre>
Parsing example:
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJm8Gnh9VBAzW6Ztp9n6KRJ-FjDK68x3NuWN3TjFl4E9oRrRninoEcqi-sivdO66k7U9A58GA_Y7F-NQZXuRM7dq_6Nr2sr6BorvElSHWCdAknJ59HtVU1sL4S5hmWMnhXQmMWZplNaAv2/s320/codebg.gif); background: rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"> Container c1 = Container(
"a", 7,
"b", false,
"bar",
Container(
"d", 15 ,
"e", 1
),
"c",8
);
Container c2 = struct.parse( ByteArray( 0xe1, 0x1f ));
assertEquals( c1, c2 );
</code></pre>
Currently Java Construct supports enough Macros, Adapters and
Repeaters to parse and build these protocols:
<span class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif" style="font-size: 15px; line-height: 19px; white-space: normal;"><ul style="margin-bottom: 0px !important; margin-left: 36px; margin-right: 0px; margin-top: 21px; margin: 21px 0px 0px 36px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px;">
<li style="margin-bottom: 7px; margin-left: 0px; margin-right: 0px; margin-top: 7px; margin: 7px 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px;">Layer 2: <a href="https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/layer2/ethernet.java" style="color: #4183c4; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px; text-decoration: none;">ethernet</a>, <a href="https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/layer2/arp.java">arp</a><a href="https://github.com/ZiglioNZ/construct/blob/master/src/main/construct/protocols/layer2/arp.java" style="color: #4183c4; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px; text-decoration: none;">arp</a></li>
<li style="margin-bottom: 7px; margin-left: 0px; margin-right: 0px; margin-top: 7px; margin: 7px 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px;">Layer 3: <a href="https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/layer3/ipv4.java" style="color: #4183c4; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px; text-decoration: none;">ipv4</a>, <a href="https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/layer3/ipv6.java" style="color: #4183c4; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px; text-decoration: none;">ipv6</a></li>
<li style="margin-bottom: 7px; margin-left: 0px; margin-right: 0px; margin-top: 7px; margin: 7px 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px;">Layer 4: <a href="https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/layer4/udp.java" style="color: #4183c4; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px; text-decoration: none;">udp</a>, <a href="https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/layer4/tcp.java">tcp</a><a href="https://github.com/ZiglioNZ/construct/blob/master/src/main/construct/protocols/layer4/tcp.java" style="color: #4183c4; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px; text-decoration: none;">tcp</a></li>
<li style="margin-bottom: 7px; margin-left: 0px; margin-right: 0px; margin-top: 7px; margin: 7px 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px;"><a href="https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/ipstack.java" style="color: #4183c4; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; padding: 0px; text-decoration: none;">ipstack</a></li>
</ul>
</span>
Full ipstack example: <a href="https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/ipstack.java">https://github.com/ZiglioUK/construct/blob/master/src/main/construct/protocols/ipstack.java</a>
Notes:
1. I haven't tested for threadsafety but it's a priority
2. Streams are not supported so a message has to be contained in
memory. If there are segments, they have to re-assambled prior to
parsing
3. Text protocols like http are not supported, it's questionable
whether Construct would be the right tool for text parsing.</pre>
<pre></pre>Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com7tag:blogger.com,1999:blog-4199600433241885589.post-20874343465552745312011-11-14T10:54:00.001+13:002011-11-14T11:24:34.126+13:00Using MapReduce to refactor entities on GAEI've been following Ikai Lan's good tutorial for MapReduce on App Engine (Java):<br />
<a href="http://ikaisays.com/2010/07/09/using-the-java-mapper-framework-for-app-engine/">http://ikaisays.com/2010/07/09/using-the-java-mapper-framework-for-app-engine/</a><br />
<br />
As a simple excercise I've managed to succesfully refactor some entities on the production server.<br />
The goal is to take existing rows of an existing entity called Event and rename a field from Program to Project.<br />
On the App Engine dashboard I can query for them with this GQL String:<br />
"SELECT * FROM Event WHERE program != null".<br />
At the end of this procedure, the GQL query shouldn't return any row.<br />
<br />
Here are four simple steps.<br />
<br />
1. Edit mapreduce.xml where I specify my mapper class and pass the Entity kind 'Event' as a parameter<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJm8Gnh9VBAzW6Ztp9n6KRJ-FjDK68x3NuWN3TjFl4E9oRrRninoEcqi-sivdO66k7U9A58GA_Y7F-NQZXuRM7dq_6Nr2sr6BorvElSHWCdAknJ59HtVU1sL4S5hmWMnhXQmMWZplNaAv2/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> <configurations>
<configuration name="Program to Project">
<property>
<name>mapreduce.map.class</name>
<value>com.sirtrack.iridium.mapper.ProgramToProject</value>
</property>
<property>
<name>mapreduce.inputformat.class</name>
<value>com.google.appengine.tools.mapreduce.DatastoreInputFormat</value>
</property>
<!--property>
<name human="Entity Kind to Map Over">mapreduce.mapper.inputformat.datastoreinputformat.entitykind</name>
<value template="optional">Event</value>
</property-->
<property>
<name human="Entity Kind to Map Over">mapreduce.mapper.inputformat.datastoreinputformat.entitykind</name>
<value>Event</value>
</property>
</configuration>
</configurations>
</code></pre>
<br />
2. Implement the mapper class<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJm8Gnh9VBAzW6Ztp9n6KRJ-FjDK68x3NuWN3TjFl4E9oRrRninoEcqi-sivdO66k7U9A58GA_Y7F-NQZXuRM7dq_6Nr2sr6BorvElSHWCdAknJ59HtVU1sL4S5hmWMnhXQmMWZplNaAv2/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> package com.sirtrack.iridium.mapper;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.tools.mapreduce.AppEngineMapper;
import com.googlecode.objectify.cache.CachingDatastoreServiceFactory;
import org.apache.hadoop.io.NullWritable;
import java.util.logging.Logger;
public class ProgramToProject extends AppEngineMapper< Key,Entity,NullWritable,NullWritable>
{
private static final Logger log = Logger.getLogger( ProgramToProject.class.getName() );
private DatastoreService datastore;
public ProgramToProject()
{
}
@Override
public void taskSetup( Context context )
{
this.datastore = DatastoreServiceFactory.getDatastoreService();
}
@Override
public void map( Key key, Entity value, Context context )
{
log.warning( "Mapping key: " + key );
if( value.hasProperty( "program" ) )
{
Object program = value.getProperty( "program" );
value.setProperty( "project", program );
value.setProperty( "program", null );
datastore.put( value );
}
}
}
</code></pre>
<br />
3. Add a link to the MapReduce admin page to the dashboard (appengine-web.xml). In my case, I've mapped the mapreduce serverlet to /_ah/mapreduce, a protected address<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJm8Gnh9VBAzW6Ztp9n6KRJ-FjDK68x3NuWN3TjFl4E9oRrRninoEcqi-sivdO66k7U9A58GA_Y7F-NQZXuRM7dq_6Nr2sr6BorvElSHWCdAknJ59HtVU1sL4S5hmWMnhXQmMWZplNaAv2/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> <admin-console>
<page name="Appstats" url="/_ah/appstats" />
<page name="Mapreduce" url="/_ah/mapreduce/status" />
</admin-console>
</code></pre>
<br />
4. Run the job from the dashboard<br />
<br />
<br />
<h1 id="detail-page-title" style="font-family: Arial, sans-serif; font-size: 2em; margin-bottom: 0.4em; margin-top: 0px;">
Program to Project</h1>
<h3 id="detail-page-undertext" style="font-family: Arial, sans-serif; font-size: 1em; margin-bottom: 0.7em; margin-top: 0px;">
Job #job_1321220718997aeac4fdbfc3f4a7cba174e4f28845724_0001</h3>
<div id="detail" style="font-family: Arial, sans-serif; font-size: 13px;">
<div id="detail-graph" style="float: left; margin-left: 1em;">
<div>
Processed items per shard</div>
<img height="200" src="http://chart.apis.google.com/chart?cht=bvg&chxt=y,x&chbh=a,4,1&chs=300x200&chd=e:ycNua9.1&chxl=1:|0|1|2|3&chxr=0,0.0,406.0" width="300" /></div>
<div id="detail-params-container" style="float: left; margin-left: 1em;">
<h2 style="font-size: 1.2em; margin-bottom: 0.4em; margin-top: 1em;">
Overview</h2>
<ul id="detail-params">
<li class="status-text" style="text-transform: capitalize;">DONE</li>
<li><span class="param-key">Elapsed time</span><span>: </span><span class="param-value">00:00:23</span></li>
<li><span class="param-key">Start time</span><span>: </span><span class="param-value">Mon Nov 14 2011 10:45:19 GMT+1300 (NZDT)</span></li>
</ul>
</div>
<div id="aggregated-counters-container" style="float: left; margin-left: 1em;">
<h2 style="font-size: 1.2em; margin-bottom: 0.4em; margin-top: 1em;">
Counters</h2>
<ul id="aggregated-counters">
<li><span class="param-key">org.apache.hadoop.mapred.Task$Counter:MAP_INPUT_RECORDS</span><span>: </span><span class="param-value">983</span><span> </span><span class="param-aux">(42.21/sec avg.)</span></li>
</ul>
</div>
<div style="clear: both;">
</div>
<div>
</div>
</div>
<br />
<br />
<div>
Done! I can now verify that it all worked using the same GQL query I used before.<br />
<br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">Conclusion and Future Improvements</span></b><br />
<br /></div>
MapReduce is a great tool for GAE, and also very easy to use but I'd like to use my favourite API (<a href="https://github.com/mandubian/siena/" target="_blank">Siena</a>) instead of the low level access to the datastore. It shouldn't be difficult.<br />
There's also a more efficient way of performing this task, also covered by Ikai's tutorial.<br />
<br />
<br />
<br />Emanuele Zigliolihttp://www.blogger.com/profile/06779960218386244155noreply@blogger.com0Goddard Ln, Havelock North 4130, New Zealand-39.6637225 176.8812451-39.6652505 176.8787776 -39.6621945 176.8837126tag:blogger.com,1999:blog-4199600433241885589.post-27213005374674006182010-12-19T23:58:00.003+13:002010-12-20T00:32:16.755+13:00'Google Listen' for Podcasts on Android<img src="http://listen.googlelabs.com/img/screenshot_home.png" style="cursor: move;" /><br />
<br />
Last week the <a href="http://googlereader.blogspot.com/2010/11/android-google-reader-app-is-here.html">Google Reader app for Android</a> was released.<br />
To be honest, I've been disappointed. I find the application really slow, and that may be due to a number of reasons:<br />
- too many feeds (hundreds for me)<br />
- slow connection (3G not always available)<br />
- uncompressed XML on Android 2.1<br />
<br />
Also, I've been experiencing an annoying bug: items that appear as 'read' on my mobile are in reality still unread. Sometimes, after spending some time on my mobile going through all items, when I connect to Reader I find them all again as 'unread'. Strangely enough items I've 'starred' on Android seem to maintain that state but not always. I wonder whether that might related to me having multiple accounts.<br />
<br />
I've been using Reader for a long time on the desktop also as a sort of iTune for podcasts. I've got a number, not large but very active, of subscriptions that I keep in a special folder within Reader.<br />
While that works fairly well on the desktop, it doesn't suit very well as podcast catcher on mobile. That's mainly because when you click on a podcast in Reader, that starts streaming but it's not saved anywhere in particular. Basically you either listen to it or you'll have to stream it later, there's no way in Reader to automatically save the podcast for later use.<br />
<br />
Until now! I've tried '<a href="http://listen.googlelabs.com/">Google Listen</a>' as a suggested application by App Brain.<br />
I had previously installed another Podcast application but never got to use it.<br />
The main feature that attracted me to Listen was its <i>integration with Google Reader</i>.<br />
<br />
How does that work?<br />
<br />
Well, there are a few ways to enter a subscription in Listen:<br />
1. by hand<br />
2. by clicking on an RSS link<br />
3. as a newly created folder in Reader<br />
<br />
The first way is really painful, RSS urls are usually long and tiresome to type on a small screen.<br />
The second way, I haven't tried yet but it involves, I presume, visiting a web page with a link to a podcast.<br />
The third way is brilliant in my case because it just meant moving my existing subscriptions in Reader from my old Podcast folder to the new 'Listen Subscriptions' folder.<br />
<br />
As an application Listen allows you to do all the expected: create a list of podcasts to download, set when they will be downloaded, etc.<br />
It's also way faster and more pleasant to use than Reader itself on Android.<br />
<br />
Still there's room for improvements, I'd like to be able to:<br />
1. share podcasts to Facebook, Twitter, E-mail etc<br />
2. automatically set an item as read, same as in Reader<br />
3, star an item and prevent it from being deleted<br />
4. save an item to a preferred location<br />
<br />
Google Listen for Android is a great little app, it'll become the one I use the most.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-61531188705250158362010-09-18T20:24:00.000+12:002010-09-18T20:24:19.700+12:00App Inventor for AndroidJust received this e-mail from Google<br />
<br />
<blockquote><table border="0" cellpadding="0" cellspacing="0" style="font-family: arial, sans-serif; font-size: 1px; width: 550px;"><tbody>
<tr><td bgcolor="#FFFFFF" style="color: black; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 29px; padding-right: 29px; padding-top: 12px;"><span style="border-collapse: collapse; color: #500050; font-family: arial, sans-serif; font-size: 13px;"><div></div></span></td></tr>
<tr><td bgcolor="#FFFFFF" style="color: #2158d7; font-family: arial; font-size: 20px; line-height: 27px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 29px; padding-right: 29px; padding-top: 18px;">Welcome to App Inventor!</td></tr>
<tr><td bgcolor="#FFFFFF" style="color: black; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 10px; padding-left: 29px; padding-right: 29px; padding-top: 12px;"><span style="border-collapse: collapse; color: #500050; font-family: arial, sans-serif; font-size: 13px;"><div><div><strong><span style="color: black;">About App Inventor:</span></strong></div><div><span style="font-family: Arial; white-space: pre-wrap;"><span style="color: black;">App Inventor for Android allows people with minimal programming experience to create simple, personal apps for Android devices. It has a number of features which ease app development. </span></span><span style="font-family: Arial; white-space: pre-wrap;"><span style="color: black;">App Inventor is </span><span style="white-space: normal;"><span style="color: black;">best suited for people who are eager to learn the basics of programming and are interested in making basic apps for their personal use.</span></span><span style="color: black;"> </span></span></div><div><span style="color: black;"><br />
</span></div><div><div style="background-color: transparent; font-family: Times; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span style="font-family: Arial;"><strong><span style="color: black;">Remember the Beta Tag:</span></strong><span style="color: black;"><br />
</span></span><span style="background-color: transparent; font-family: Arial; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="color: black;">App Inventor is currently available as an invitation-based beta product. We are limiting access in order to ensure that our systems can handle the load. As a beta product App Inventor still has rough edges and missing features. </span></span><span style="font-family: Arial; white-space: pre-wrap;"><span style="color: black;">In some cases the rough edges include un-pleasantries</span></span><span style="font-family: Arial; white-space: pre-wrap;"><span style="color: black;"> such as: installing Windows device drivers, installing Java on your computer, and fiddling with settings on your phone. We are working hard to smooth out the rough edges and we appreciate your use of App Inventor while we are in this beta state. It may sound a bit cliche but it really is true, your use of App Inventor today will help us make it better for the future! Now on to the good stuff.</span></span></div></div><div><span style="color: black;"><br />
</span></div><div><strong><span style="color: black;">Getting Started with App Inventor:</span></strong></div><div><strong><span style="color: black;"><br />
</span></strong></div><div><span style="color: black;">Complete these 3 steps to start using App Inventor:</span></div><div><ol><li style="margin-left: 15px;"><a href="http://appinventor.googlelabs.com/learn/setup/index.html" style="color: #406480;" target="_blank">Set up</a> <span style="color: black;">your phone and computer.</span></li>
<li style="margin-left: 15px;"><a href="http://appinventor.googlelabs.com/learn/setup/starting.html" style="color: #406480;" target="_blank">Connect</a> <span style="color: black;">your phone to your computer.</span></li>
<li style="margin-left: 15px;"><span style="color: black;">Complete the</span> <a href="http://appinventor.googlelabs.com/learn/tutorials/index.html" style="color: #406480;" target="_blank">basic tutorials</a>.</li>
</ol></div><div><span style="color: black;">Take your App Inventor knowledge to the next level by:</span></div><div><ul><li style="margin-left: 15px;"><span style="color: black;">Working through the</span> <a href="http://appinventor.googlelabs.com/learn/tutorials/index.html" style="color: #406480;" target="_blank">advanced tutorials</a>.</li>
<li style="margin-left: 15px;"><span style="color: black;">Reading the App Inventor</span> <a href="http://appinventor.googlelabs.com/learn/reference/index.html" style="color: #406480;" target="_blank">reference material.</a></li>
<li style="margin-left: 15px;"><span style="color: black;">Subscribing to the App Inventor</span> <a href="https://groups.google.com/group/appinventor?pli=1" style="color: #406480;" target="_blank">user forum</a>.</li>
</ul></div><div><span style="color: black;">Happy Inventing!</span></div><div><span style="color: black;">Google's App Inventor Team</span></div></div><div><span style="color: black;"><br />
</span></div></span></td></tr>
</tbody></table></blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-89270197222679325352010-09-05T23:45:00.001+12:002010-09-05T23:50:50.210+12:00Keeping track of changes with Google ReaderRecently I heard <a href="http://www.javaposse.com/">JavaPosse</a>'s Dick Wall stating: "Google Reader is my lifeline".<br />
<div><span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></span><br />
<span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></span></span></span><br />
<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><div style="margin: 0px;">I agree! More and more content is user generated. But not all content is quality and most of it still comes from traditional sites. </div><div style="margin: 0px;">That's where a feed aggregator like <a href="http://www.google.com/reader">Google Reader</a> can help.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.google.com/reader" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Google - Google Reader" border="0" src="http://www.google.com/images/logos/reader_logo.gif" /></a></div><br />
A feed aggregator is a software that collates syndicated content called <a href="http://en.wikipedia.org/wiki/RSS">RSS feed</a>. That is a machine readable file that reports parts or all the content of a page. When available, a special icon usually appears somewhere on the page or on the browser's url field.<br />
<a href="http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/16px-Feed-icon.svg.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Feed-icon.svg" border="0" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/16px-Feed-icon.svg.png" /></a>If you click on that icon you'll be taken to the Url of the Rss feed. The page appears as scrambled text. It is in reality an XML representation of the page you were looking at. You can grab that Url and paste into a feed aggregator such as Google Reader.<br />
The feed aggregator will start polling that Url and will prompt you when the page is updated.<br />
<blockquote><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px;"></span><br />
<span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px;"><div class="section lhn-section " id="lhn-selectors" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-top-color: rgb(194, 207, 241); border-top-style: solid; border-top-width: 1px; font-size: 13px; line-height: 21px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; position: relative; zoom: 1;"><div class="lhn-section-secondary" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div class="selector" id="overview-selector" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-left: 23px; zoom: 1;"><a class="link" href="http://www.google.com/reader/view/#overview-page" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; text-decoration: none;"><span class="text" style="color: black; float: left; text-decoration: none;">Home</span></a></div></div><div class="lhn-section-primary" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div class="selector selected unread" id="reading-list-selector" style="background-color: #c2cff1; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-left: 23px; zoom: 1;"><a class="link" href="http://www.google.com/reader/view/user/-/state/com.google/reading-list" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; text-decoration: none;"><span class="text" style="color: black; float: left; font-weight: bold; text-decoration: none;">All items<span class="unread-count" id="reading-list-unread-count"> (2)</span></span></a></div></div><div class="lhn-section-secondary" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div class="selector" id="star-selector" style="background-color: #ffffcc; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-left: 23px; zoom: 1;"><a class="link" href="http://www.google.com/reader/view/user/-/state/com.google/starred" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; text-decoration: none;"><span class="text" style="color: black; float: left; text-decoration: none;">Starred items</span></a><br />
<a class="link" href="http://www.google.com/reader/view/user/-/state/com.google/starred" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; text-decoration: none;"><div class="selector-icon" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.google.com/reader/ui/1225119760-lhn-sprite.png); background-origin: initial; background-position: initial initial; background-repeat: no-repeat no-repeat; float: left; height: 16px; margin-bottom: 0px; margin-left: 3px; margin-right: 0px; margin-top: 3px; width: 16px;"></div></a></div><div class="scroll-tree-container" id="your-items-tree-container" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative; zoom: 1;"><ul class="scroll-tree" id="your-items-tree" style="font-size: 13px; line-height: 21px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"><li class="folder unselectable expanded" id="your-items-tree-item-0-main" style="-webkit-user-select: none; background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative; zoom: 1;"><br />
<div class="toggle folder-toggle toggle-d-0" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.google.com/reader/ui/1225119760-lhn-sprite.png); background-origin: initial; background-position: 9px -58px; background-repeat: no-repeat no-repeat; cursor: pointer; height: 18px; left: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: absolute; top: 0px; width: 23px; z-index: 2;"></div><a class="link" href="http://www.google.com/reader/view/user/-/state/com.google/self" id="your-items-tree-item-0-link" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; padding-left: 23px; position: relative; text-decoration: none; white-space: nowrap; zoom: 1;"><span class="name folder-name name-d-0" id="your-items-tree-item-0-name" style="color: black; padding-left: 0px;" title="Your stuff"><span class="name-text folder-name-text name-text-d-0">Your stuff</span><span class="unread-count folder-unread-count unread-count-d-0" id="your-items-tree-item-0-unread-count"></span></span></a><br />
<ul style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-left: 0px; position: relative;"><li class="broadcast unselectable expanded" id="your-items-tree-item-1-main" style="-webkit-user-select: none; background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative; zoom: 1;"><a class="link" href="http://www.google.com/reader/view/user/-/state/com.google/broadcast" id="your-items-tree-item-1-link" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; padding-left: 23px; position: relative; text-decoration: none; white-space: nowrap; zoom: 1;"><span class="icon broadcast-icon icon-d-1" id="your-items-tree-item-1-icon" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.google.com/reader/ui/1225119760-lhn-sprite.png); background-origin: initial; background-position: -64px 0px; background-repeat: no-repeat no-repeat; height: 16px; position: absolute; top: 1px; width: 16px;"></span><span class="name broadcast-name name-d-1" id="your-items-tree-item-1-name" style="color: black; padding-left: 18px;" title="Shared items"><span class="name-text broadcast-name-text name-text-d-1">Shared items</span><span class="unread-count broadcast-unread-count unread-count-d-1" id="your-items-tree-item-1-unread-count"></span></span></a></li>
<li class="created unselectable expanded" id="your-items-tree-item-2-main" style="-webkit-user-select: none; background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative; zoom: 1;"><a class="link" href="http://www.google.com/reader/view/user/-/state/com.google/created" id="your-items-tree-item-2-link" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; padding-left: 23px; position: relative; text-decoration: none; white-space: nowrap; zoom: 1;"><span class="icon created-icon icon-d-1" id="your-items-tree-item-2-icon" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.google.com/reader/ui/1225119760-lhn-sprite.png); background-origin: initial; background-position: -64px -32px; background-repeat: no-repeat no-repeat; height: 16px; position: absolute; top: 1px; width: 16px;"></span><span class="name created-name name-d-1" id="your-items-tree-item-2-name" style="color: black; padding-left: 18px;" title="Notes"><span class="name-text created-name-text name-text-d-1">Notes</span><span class="unread-count created-unread-count unread-count-d-1" id="your-items-tree-item-2-unread-count"></span></span></a></li>
</ul></li>
</ul></div><div class="selector" id="trends-selector" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-left: 23px; zoom: 1;"><a class="link" href="http://www.google.com/reader/view/#trends-page" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; text-decoration: none;"><span class="text" style="color: black; float: left; text-decoration: none;">Trends</span></a><br />
<a class="link" href="http://www.google.com/reader/view/#trends-page" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; text-decoration: none;"><div class="selector-icon" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.google.com/reader/ui/1225119760-lhn-sprite.png); background-origin: initial; background-position: -16px 0px; background-repeat: no-repeat no-repeat; float: left; height: 16px; margin-bottom: 0px; margin-left: 3px; margin-right: 0px; margin-top: 2px; width: 16px;"></div></a></div><div class="selector" id="directory-selector" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-left: 23px; zoom: 1;"><a class="link" href="http://www.google.com/reader/view/#directory-page" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; text-decoration: none;"><span class="text" style="color: black; float: left; text-decoration: none;">Browse for stuff</span></a></div></div></div><div class="section lhn-section section-minimized " id="lhn-friends" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-top-color: rgb(194, 207, 241); border-top-style: solid; border-top-width: 1px; font-size: 13px; line-height: 21px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; position: relative; zoom: 1;"><div class="section-button lhn-indicator" id="lhn-friends-indicator" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.google.com/reader/ui/1621835028-comment-marker.png); background-origin: initial; background-position: initial initial; background-repeat: no-repeat no-repeat; cursor: pointer; font-size: 1px; height: 12px; line-height: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: absolute !important; right: 31px; top: 3px; width: 12px; z-index: 2;" title="You have new unread comments"></div><div class="section-button section-minimize" id="lhn-friends-minimize" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.google.com/reader/ui/1225119760-lhn-sprite.png); background-origin: initial; background-position: 0px -28px; background-repeat: no-repeat no-repeat; cursor: pointer; font-size: 1px; height: 12px; line-height: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: absolute !important; right: 17px; top: 3px; width: 12px; z-index: 2;"></div><div class="section-button section-menubutton goog-menu-button goog-inline-block" id="lhn-friends-menubutton" style="-webkit-user-select: none; background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://www.google.com/reader/ui/1225119760-lhn-sprite.png); background-origin: initial; background-position: 0px -40px; background-repeat: no-repeat no-repeat; cursor: pointer; display: inline-block; font-size: 1px; height: 12px; line-height: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; position: absolute !important; right: 3px; top: 3px; width: 12px; z-index: 2;" tabindex="0"><div class="goog-inline-block goog-menu-button-outer-box" style="display: inline-block; font-size: 1px; line-height: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative;"><div class="goog-inline-block goog-menu-button-inner-box" style="display: inline-block; font-size: 1px; line-height: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative;"><div class="goog-inline-block goog-menu-button-caption" style="display: inline-block; font-size: 1px; line-height: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative;"></div><div class="goog-inline-block goog-menu-button-dropdown" style="border-bottom-color: rgb(238, 238, 238); border-bottom-style: none; border-bottom-width: 0px; border-color: initial; border-left-color: rgb(238, 238, 238); border-left-style: none; border-left-width: 4px; border-right-color: rgb(238, 238, 238); border-right-style: none; border-right-width: 4px; border-top-color: rgb(136, 136, 136); border-top-style: none; border-top-width: 4px; border-width: initial; display: inline-block; font-size: 1px; height: 0px; line-height: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: absolute; right: 4px; top: 8px; width: 0px;"></div></div></div></div><div class="selector scroll-tree-container" id="friends-tree-container" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative; zoom: 1;"><ul class="scroll-tree" id="friends-tree" style="font-size: 13px; line-height: 21px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;"><li class="folder unselectable expanded" id="friends-tree-item-0-main" style="-webkit-user-select: none; background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: relative; zoom: 1;"><a class="link lhn-section-primary" href="http://www.google.com/reader/view/user/-/state/com.google/broadcast-friends" id="friends-tree-item-0-link" style="color: black; cursor: pointer; display: block; overflow-x: hidden; overflow-y: hidden; padding-left: 10px; position: relative; text-decoration: none; white-space: nowrap; zoom: 1;"><span class="name folder-name name-d-0" id="friends-tree-item-0-name" style="color: #333333; padding-left: 0px;" title="People you follow"><span class="name-text folder-name-text name-text-d-0">People you follow</span><span class="unread-count folder-unread-count unread-count-d-0" id="friends-tree-item-0-unread-count"></span></span></a></li>
</ul></div></div><div class="section lhn-section " id="lhn-recommendations" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-top-color: rgb(194, 207, 241); border-top-style: solid; border-top-width: 1px; font-size: 13px; line-height: 21px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; position: relative; zoom: 1;"></div></span></blockquote><br />
The initial effort of copying and pasting that link soon pays off: you don't have to go and visit web sites you follow regularly in order to check updates. The updates come to you soon after they're published via the feed reader.<br />
That way I've been able to monitor much more interesting stuff than I could have done by hand.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.google.com/chart?cht=bvg&chd=s:MGRUUXWOJQaVUUKHOYYZaMJQdaXZUJ,ON9PYdOYHQbOTZGRNVWbcMOMtfTZXH&chds=0.0,567.0&chs=575x200&chco=c2cff1ff,fdb04aff&chf=bg,s,ffffff&chg=0.0,35.27336860670194&chbh=6,0,3&chxt=x,y&chxr=0,0.0,575.0%7C1,0.0,567.0&chxl=0:%7C8/7%7C+%7C+%7C8/10%7C+%7C+%7C8/13%7C+%7C+%7C8/16%7C+%7C+%7C8/19%7C+%7C+%7C8/22%7C+%7C+%7C8/25%7C+%7C+%7C8/28%7C+%7C+%7C8/31%7C+%7C+%7C9/3%7C+%7C+%7C1:%7C0%7C200%7C400&chxp=1,0.0,200.0,400.0&chxs=0,999999,10.0,0.0%7C1,999999,10.0,0.0" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" height="137" src="http://www.google.com/chart?cht=bvg&chd=s:MGRUUXWOJQaVUUKHOYYZaMJQdaXZUJ,ON9PYdOYHQbOTZGRNVWbcMOMtfTZXH&chds=0.0,567.0&chs=575x200&chco=c2cff1ff,fdb04aff&chf=bg,s,ffffff&chg=0.0,35.27336860670194&chbh=6,0,3&chxt=x,y&chxr=0,0.0,575.0%7C1,0.0,567.0&chxl=0:%7C8/7%7C+%7C+%7C8/10%7C+%7C+%7C8/13%7C+%7C+%7C8/16%7C+%7C+%7C8/19%7C+%7C+%7C8/22%7C+%7C+%7C8/25%7C+%7C+%7C8/28%7C+%7C+%7C8/31%7C+%7C+%7C9/3%7C+%7C+%7C1:%7C0%7C200%7C400&chxp=1,0.0,200.0,400.0&chxs=0,999999,10.0,0.0%7C1,999999,10.0,0.0" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px;" usemap="#day-bucket-map" width="400" /></a></div></div></span></span></span></div><span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></span></span></span><br />
<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><div style="font-style: normal;"><br />
</div><div style="font-style: normal;">Not all Rss feeds reports the whole content of the page is linked to. Often news sites provide just an excerpt from their stories and a link back to the stories themselves. That's for obvious reasons: generating traffic to their ad hosting pages, fair enough.</div><div style="font-style: normal;"><br />
</div><div style="font-style: normal;">Not all syndicated content is interesting or original. A lot of times, the same news comes from different sources. That's where Google Reader's Key Shortcuts are really useful.</div><div style="font-style: normal;">If you click '?' on Google Reader, a list of those shortcuts will appear.</div><div style="font-style: normal;">The ones I use a lot are:</div><div style="font-style: normal;">- g+a: go to new posts</div><div style="font-style: normal;">- n: skip to the next post</div><div style="font-style: normal;"><br />
</div><div style="font-style: normal;">At a certain point it may become too much, with hundreds of new feeds being collected every day. It's then time to decide what sites is worth following and what's not.</div><div style="font-style: normal;"><br />
</div><div style="font-style: normal;">Google Reader, being web based, has a series of advantages with respect to stand-alone readers:</div><div style="font-style: normal;"></div><ul><li>it's connected to your gmail or google apps account, so it's always updated and available wherever you connect from. That's useful when you follow a mix of work and personal sites</li>
<li>you can search across your subscriptions to find interesting stuff you've read before</li>
<li>with time you build a profile of what you're interested in and Google Reader can suggest you sources you might be interested in. </li>
</ul><br />
But there's another neat feature. Google Reader allows you <i>track changes of</i> <i>any web page</i>, even those that don't offer Rss! If you enter the location of a page without Rss, Reader will start polling that page and over time it will automatically build a summary of changes.<br />
<br />
<div style="font-style: normal;">That's useful for pages like 'job opportunities' or 'current exhibitions' at museums such as: <a href="http://www.pataka.org.nz/48977/links/bulletpages.html">http://www.pataka.org.nz/48977/links/bulletpages.html</a></div><div style="font-style: normal;"><br />
<blockquote><span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><h2 class="entry-title" style="font-size: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-width: 650px;">Google feed for "http://www.pataka.org.nz/48977/links/bulletpages.html"</h2><div class="entry-author" style="color: #666666; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-decoration: none;"><div class="entry-likers" style="background-color: white; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-width: 650px;"></div></div><div class="entry-debug" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"></div><div class="entry-annotations" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"></div><div class="entry-body" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-width: 650px; padding-top: 0.5em;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div class="item-body" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Google will watch for changes in "<a href="http://www.pataka.org.nz/48977/links/bulletpages.html" style="color: #2244bb;" target="_blank">http://www.pataka.org.nz/48977/links/bulletpages.html</a>" and summarize them for you.</div></div></div></div></span></blockquote><br />
</div><div style="font-style: normal;">If I wanted to follow the news about the recent earthquake in Christchurch, I could go to Google News and simply enter the keyword 'Christchurch'. </div><div style="font-style: normal;">At the end of the result page, Google offers a way to receive the updates via e-mail.</div><div style="font-style: normal;">But who wants to get tens of news alerts in their mailboxes. The e-mail is for personal messages that often need a reply! </div><div style="font-style: normal;">There's a much better way to keep track of updates: the Rss feed.</div><div style="font-style: normal;">Search for the <span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px;"><a href="http://news.google.co.nz/news?pz=1&cf=all&ned=nz&hl=en&q=christchurch&cf=all&output=rss" style="color: #1111cc;"><img alt="" class="icon feed-icon" height="15" src="http://www.gstatic.com/news/img/cleardot.gif" style="background-image: url(http://www.gstatic.com/news/img/488041444-news-icons.png); background-position: -95px 0px; background-repeat: no-repeat no-repeat; border-bottom-style: none; border-bottom-width: 0px; border-color: initial; border-left-style: none; border-left-width: 0px; border-right-style: none; border-right-width: 0px; border-top-style: none; border-top-width: 0px; height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 2px; margin-top: 0px; vertical-align: text-bottom; width: 15px;" width="15" /></a><a href="http://news.google.co.nz/news?pz=1&cf=all&ned=nz&hl=en&q=christchurch&cf=all&output=rss" style="color: #1111cc;">RSS</a> </span>icon at the bottom of the news results. You can copy and paste that link into Google Reader, a much better way!</div><div style="font-style: normal;"><br />
</div><div style="font-style: normal;"><br />
</div></span></span></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4199600433241885589.post-21269560208489202022010-06-25T11:36:00.002+12:002010-06-25T11:36:32.373+12:00I'm human!<div style="font-family: verdana, arial, sans-serif;"><table><tbody>
<tr><td><b><span style="color: #0039b6; font-family: times;">G</span><span style="color: #c41200; font-family: times;">o</span><span style="color: #f3c518; font-family: times;">o</span><span style="color: #0039b6; font-family: times;">g</span><span style="color: #30a72f; font-family: times;">l</span><span style="color: #c41200; font-family: times;">e</span></b></td><td style="padding-bottom: 15px; text-align: left; vertical-align: bottom; width: 143px;"><div style="border-bottom-color: rgb(223, 223, 223); border-bottom-style: solid; border-bottom-width: 1px;">Sorry...</div></td></tr>
</tbody></table></div><div style="font-family: verdana, arial, sans-serif; margin-left: 4em;"><h1>We're sorry...</h1>... but your computer or network may be sending automated queries. To protect our users, we can't process your request right now.<br />
<form action="http://sorry.google.com/sorry/Captcha" method="get"><table border="0" cellpadding="4" cellspacing="0"><tbody>
<tr><td align="left" valign="top"><span style="color: #aa1002;"><b>To continue searching, please type the characters you see below:</b> </span><input id="captcha" name="captcha" size="12" type="text" value="" /> <input name="submit" type="submit" value="I'm human!" /></td></tr>
<tr><td><div align="right"><img alt="Please enable images on your browser." border="1" src="http://sorry.google.com/sorry/image?id=12595494921356758988&hl=en" /></div></td></tr>
</tbody></table></form></div><div style="font-family: verdana, arial, sans-serif; margin-left: 4em;">See <a href="http://www.google.com/support/bin/answer.py?answer=86640">Google Help</a> for more information.<br />
</div><div style="border-top-color: rgb(223, 223, 223); border-top-style: solid; border-top-width: 1px; font-family: verdana, arial, sans-serif; text-align: center;">© 2010 Google - <a href="http://www.google.com/">Google Home</a></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-80909464425329502322010-06-11T13:55:00.000+12:002010-06-11T13:55:24.239+12:00Phitek CEO Donaldson pushed out<a href="http://www.nzherald.co.nz/business/news/article.cfm?c_id=3&objectid=10651158">http://www.nzherald.co.nz/business/news/article.cfm?c_id=3&objectid=10651158</a><br />
<br />
That's quite rude... Engineers are not necessarily good CEOs. I hope Mark finds another role, or another idea!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-30892217121506234132010-06-10T00:06:00.000+12:002010-06-10T00:06:58.635+12:00The integration layer<a href="http://feedproxy.google.com/~r/CiscoIosHintsAndTricks/~3/-_S-Qhe4_yY/integration-layer.html">The integration layer</a>: "<a href="http://dilbert.com/strips/comic/2010-06-09/" title="Dilbert.com"><img src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/90000/1000/700/91763/91763.strip.gif" border="0" alt="Dilbert.com" style="width:540px" /></a><br />A comment would be superfluous.<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/23021255-8362092395241767221?l=blog.ioshints.info" alt="" /></div><div><br /><a href="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?a=-_S-Qhe4_yY:lycaGYR4CC4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?d=yIl2AUoC8zA" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?a=-_S-Qhe4_yY:lycaGYR4CC4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?d=qj6IDK7rITs" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?a=-_S-Qhe4_yY:lycaGYR4CC4:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?d=I9og5sOYxJI" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?a=-_S-Qhe4_yY:lycaGYR4CC4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?i=-_S-Qhe4_yY:lycaGYR4CC4:F7zBnMyn0Lo" border="0" /></a> <a href="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?a=-_S-Qhe4_yY:lycaGYR4CC4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/CiscoIosHintsAndTricks?i=-_S-Qhe4_yY:lycaGYR4CC4:V_sGLiPBpWU" border="0" /></a><br /></div><img src="http://feeds.feedburner.com/~r/CiscoIosHintsAndTricks/~4/-_S-Qhe4_yY" height="1" width="1" />"Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-60878263304382899052010-06-08T22:16:00.002+12:002010-06-08T22:16:31.334+12:00Anywhere will be better than here!<div style="font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div class="modlabel" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><a class="w_lnk" href="http://www.google.com/ig?t=1#" style="color: #0000cc; font-weight: bold;">Milan</a></div><div class="w_box" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1px;"><div class="w_ccs" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"><div class="w_ccis" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;"><img alt="Mostly Cloudy" class="w_cci" height="40" id="w_3_c0_icon" src="http://img0.gmodules.com/ig/images/weather/mostly_cloudy.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /></div><div class="w_cc_temp" id="w_3_c0_temp" style="float: left; font-size: 23px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 5px; padding-right: 10px; padding-top: 0px;">22°C</div><div class="w_cc_text" id="w_3_c0_text" style="height: 60px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Current: Mostly Cloudy<br />
Wind: N at 8 km/h<br />
Humidity: 73%</div></div><div class="w_fcs" id="w_3_c0_fcs" style="height: 77px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Showers">Tue<br />
<img alt="Showers" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>27° | 18°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Scattered Showers">Wed<br />
<img alt="Scattered Showers" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>27° | 18°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Rain">Thu<br />
<img alt="Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>23° | 17°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Rain">Fri<br />
<img alt="Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>25° | 17°</nobr></div></div></div></div><hr class="w_spr" style="background-attachment: initial; background-clip: initial; background-color: #bbbbbb; background-image: initial; background-origin: initial; border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: #bbbbbb; font-family: arial, sans-serif; font-size: 13px; height: 1px;" /><div style="font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div class="modlabel" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><a class="w_lnk" href="http://www.google.com/ig?t=1#" style="color: #0000cc; font-weight: bold;">Singapore</a></div><div class="w_box" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1px;"><div class="w_ccs" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"><div class="w_ccis" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;"><img alt="Light rain" class="w_cci" height="40" id="w_3_c1_icon" src="http://img0.gmodules.com/ig/images/weather/mist.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /></div><div class="w_cc_temp" id="w_3_c1_temp" style="float: left; font-size: 23px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 5px; padding-right: 10px; padding-top: 0px;">28°C</div><div class="w_cc_text" id="w_3_c1_text" style="height: 60px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Current: Light rain<br />
Wind: N at 0 km/h<br />
Humidity: 79%</div></div><div class="w_fcs" id="w_3_c1_fcs" style="height: 77px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Thunderstorm">Tue<br />
<img alt="Thunderstorm" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/thunderstorm.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>34° | 26°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Storm">Wed<br />
<img alt="Chance of Storm" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_storm.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>31° | 25°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Rain">Thu<br />
<img alt="Chance of Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>34° | 25°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Clear">Fri<br />
<img alt="Clear" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/sunny.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>33° | 26°</nobr></div></div></div></div><hr class="w_spr" style="background-attachment: initial; background-clip: initial; background-color: #bbbbbb; background-image: initial; background-origin: initial; border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: #bbbbbb; font-family: arial, sans-serif; font-size: 13px; height: 1px;" /><div style="font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div class="modlabel" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><a class="w_lnk" href="http://www.google.com/ig?t=1#" style="color: #0000cc; font-weight: bold;">Paraparaumu, New Zealand</a></div><div class="w_box" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1px;"><div class="w_ccs" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"><div class="w_ccis" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;"><img alt="" class="w_cci" height="40" id="w_3_c2_icon" src="http://www.google.com/ig?t=1" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /></div><div class="w_cc_temp" id="w_3_c2_temp" style="float: left; font-size: 23px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 5px; padding-right: 10px; padding-top: 0px;">4°C</div><div class="w_cc_text" id="w_3_c2_text" style="height: 60px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br />
Wind: S at 10 km/h<br />
Humidity: 82%</div></div><div class="w_fcs" id="w_3_c2_fcs" style="height: 77px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Rain">Tue<br />
<img alt="Chance of Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>9° | 3°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Rain">Wed<br />
<img alt="Chance of Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>10° | 3°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Rain">Thu<br />
<img alt="Chance of Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>13° | 6°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Rain">Fri<br />
<img alt="Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>15° | 7°</nobr></div></div></div></div><hr class="w_spr" style="background-attachment: initial; background-clip: initial; background-color: #bbbbbb; background-image: initial; background-origin: initial; border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: #bbbbbb; font-family: arial, sans-serif; font-size: 13px; height: 1px;" /><div style="font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div class="modlabel" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><a class="w_lnk" href="http://www.google.com/ig?t=1#" style="color: #0000cc; font-weight: bold;">Hong Kong</a></div><div class="w_box" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1px;"><div class="w_ccs" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"><div class="w_ccis" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;"><img alt="Rain Showers" class="w_cci" height="40" id="w_3_c3_icon" src="http://img0.gmodules.com/ig/images/weather/storm.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /></div><div class="w_cc_temp" id="w_3_c3_temp" style="float: left; font-size: 23px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 5px; padding-right: 10px; padding-top: 0px;">26°C</div><div class="w_cc_text" id="w_3_c3_text" style="height: 60px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Current: Rain Showers<br />
Humidity: 84%</div></div><div class="w_fcs" id="w_3_c3_fcs" style="height: 77px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Light rain">Wed<br />
<img alt="Light rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/mist.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>29° | 25°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Rain">Thu<br />
<img alt="Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>28° | 25°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Light rain">Fri<br />
<img alt="Light rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/mist.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>29° | 26°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Showers">Sat<br />
<img alt="Chance of Showers" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>30° | 26°</nobr></div></div></div><div class="w_as" style="color: #6f6f6f; font-size: 10px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"><a href="http://www.weather.gov.hk/" style="color: #2357c3;" target="_blank">香港天文台</a> 6月8日17時2分發布</div></div><hr class="w_spr" style="background-attachment: initial; background-clip: initial; background-color: #bbbbbb; background-image: initial; background-origin: initial; border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: #bbbbbb; font-family: arial, sans-serif; font-size: 13px; height: 1px;" /><div style="font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div class="modlabel" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><a class="w_lnk" href="http://www.google.com/ig?t=1#" style="color: #0000cc; font-weight: bold;">Leipzig, Saxony</a></div><div class="w_box" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1px;"><div class="w_ccs" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"><div class="w_ccis" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;"><img alt="Mostly Cloudy" class="w_cci" height="40" id="w_3_c4_icon" src="http://img0.gmodules.com/ig/images/weather/mostly_cloudy.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /></div><div class="w_cc_temp" id="w_3_c4_temp" style="float: left; font-size: 23px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 5px; padding-right: 10px; padding-top: 0px;">22°C</div><div class="w_cc_text" id="w_3_c4_text" style="height: 60px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Current: Mostly Cloudy<br />
Wind: SE at 11 km/h<br />
Humidity: 60%</div></div><div class="w_fcs" id="w_3_c4_fcs" style="height: 77px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Mostly Sunny">Tue<br />
<img alt="Mostly Sunny" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/mostly_sunny.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>24° | 14°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Rain">Wed<br />
<img alt="Chance of Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>29° | 17°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Mostly Sunny">Thu<br />
<img alt="Mostly Sunny" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/mostly_sunny.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>32° | 21°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Clear">Fri<br />
<img alt="Clear" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/sunny.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>27° | 15°</nobr></div></div></div></div><hr class="w_spr" style="background-attachment: initial; background-clip: initial; background-color: #bbbbbb; background-image: initial; background-origin: initial; border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; color: #bbbbbb; font-family: arial, sans-serif; font-size: 13px; height: 1px;" /><div style="font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div class="modlabel" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><a class="w_lnk" href="http://www.google.com/ig?t=1#" style="color: #0000cc; font-weight: bold;">Berlin, Berlin</a></div><div class="w_box" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 1px;"><div class="w_ccs" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"><div class="w_ccis" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;"><img alt="Cloudy" class="w_cci" height="40" id="w_3_c5_icon" src="http://img0.gmodules.com/ig/images/weather/cloudy.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /></div><div class="w_cc_temp" id="w_3_c5_temp" style="float: left; font-size: 23px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 5px; padding-right: 10px; padding-top: 0px;">21°C</div><div class="w_cc_text" id="w_3_c5_text" style="height: 60px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Current: Cloudy<br />
Wind: N at 6 km/h<br />
Humidity: 49%</div></div><div class="w_fcs" id="w_3_c5_fcs" style="height: 77px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Mostly Sunny">Tue<br />
<img alt="Mostly Sunny" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/mostly_sunny.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>25° | 16°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Rain">Wed<br />
<img alt="Chance of Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>29° | 17°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Mostly Sunny">Thu<br />
<img alt="Mostly Sunny" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/mostly_sunny.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>33° | 21°</nobr></div><div class="w_fc" style="float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 10px; padding-top: 0px; text-align: center;" title="Chance of Rain">Fri<br />
<img alt="Chance of Rain" class="w_fci" height="40" src="http://img0.gmodules.com/ig/images/weather/chance_of_rain.png" style="border-bottom-color: rgb(187, 187, 204); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-color: initial; border-left-color: rgb(187, 187, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 204); border-right-style: solid; border-right-width: 1px; border-style: initial; border-style: initial; border-top-color: rgb(187, 187, 204); border-top-style: solid; border-top-width: 1px; height: 40px; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; vertical-align: middle; width: 40px;" width="40" /><br />
<nobr>28° | 17°</nobr></div></div></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-33914099537092371142010-05-31T11:19:00.001+12:002010-05-31T11:19:37.346+12:00Google Power Meter<a href="http://www.currentcost.com/images/lightbox-classic-thumb_04.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://www.currentcost.com/images/lightbox-classic-thumb_04.jpg" /></a><br />
<br />
An <a href="http://www.stuff.co.nz/technology/digital-living/3755698/Google-tie-up-lets-you-check-power-use#share">article on stuff</a> presents a device made by <a href="http://www.currentcost.com/product-theclassic.html">Current Cost </a>that monitors energy consumption in real time and sends data usage to <a href="http://www.google.com/powermeter/">Google Power Meter</a>.<br />
<br />
<a href="http://www.google.com/powermeter/about/images/powermeter-ui-info.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="155" src="http://www.google.com/powermeter/about/images/powermeter-ui-info.jpg" width="200" /></a><br />
<br />
A user though has to keep a computer running all the time in order to collect data wirelessly from the device and update it to Google.<br />
Through <a href="http://powershop.co.nz/">Powershop</a>, that is also possible today. I've personally spent a few nights working with Powershop's developer API and managed so far to collect data from Powershop and then send it to Google.<br />
Check this thread out: <a href="http://groups.google.com/group/powershop-developers/browse_thread/thread/54460039ec71fa1b">http://groups.google.com/group/powershop-developers/browse_thread/thread/54460039ec71fa1b</a><br />
<br />
<a href="http://groups.google.com/group/powershop-developers/browse_thread/thread/54460039ec71fa1b"></a>My aim is to develop a Google App Engine application that could collect that for me at a set interval.<br />
Powershop's Ari Sargent has also experimented with Google Powermeter and they may provide a link with that tool themselves.<br />
By the way, their web site is excellent and they could provide similar, or better, gadgets.Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-4199600433241885589.post-63624372947352321232010-05-14T12:38:00.001+12:002010-05-14T12:38:32.411+12:00ASB has blocked all credit card electronic transactions to Italy (this week)I tried a couple of days ago to purchase a domain from a reputable Italian provider and for the first time it was denied. I managed do it via Paypal though.<br />
Today ASB rang me to say that credit card transactions to the whole italian country are blocked, as a (hopefully) temporary measure. Here's their e-mail:<br />
<br />
<span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"></span><br />
<blockquote>Recently you attempted a transaction at an Italian merchant. This transaction was declined. Unfortunately we have had to take action to prevent any and all transactions from being processed at any Italian merchant where the card is not present. This is a result of recent fraud activity and while we understand that this has inconvenienced you, and we apologise for this inconvenience, we feel this is necessary to protect our customers by preventing any possible fraud. Should you be travelling to Italy your card will be accepted where you present it at the merchant just not available for internet, mail order or phone transactions.</blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-34490281263299694622010-03-06T05:08:00.000+13:002010-03-06T05:08:03.574+13:00D2D support for browsersWorth trying: Firefox Nightly Build <a href="http://www.basschouten.com/blog1.php/2010/03/02/presenting-direct2d-hardware-acceleratio">http://www.basschouten.com/blog1.php/2010/03/02/presenting-direct2d-hardware-acceleratio</a><br />
<br />
Also interesting<a href="http://channel9.msdn.com/posts/Charles/IE-9-Surfing-on-the-GPU-with-D2D/"> http://channel9.msdn.com/posts/Charles/IE-9-Surfing-on-the-GPU-with-D2D/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-42183688706238052312010-02-02T09:45:00.001+13:002010-02-02T11:25:27.398+13:00Phitek Blackbox C14 earphones review<div class="separator" style="clear: both; text-align: center;"><a href="http://www.iphoneworld.ca/wp-content/uploads/2010/01/bb2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="http://www.iphoneworld.ca/wp-content/uploads/2010/01/bb2.jpg" width="320" /></a></div><br />
<blockquote style="text-align: center;"><span class="Apple-style-span" style="color: #414141; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 23px;"><i>T</i></span><i>he bass will shake the wax out of your ears!</i></blockquote><a href="http://www.iphoneworld.ca/iphone-reviews/2010/01/31/phitek-blackbox-c14-earphones/">http://www.iphoneworld.ca/iphone-reviews/2010/01/31/phitek-blackbox-c14-earphones/</a><br />
<br />
Noise cancelling earphones (not headphones) with a kick-ass bass. Designed in NZ<br />
<br />
<div><br />
</div><div><span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><br />
</span></span></div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4199600433241885589.post-57880467811045889422010-01-29T10:43:00.000+13:002010-01-29T10:43:22.899+13:00The Complete Software DeveloperVery good article:<br />
<a href="http://www.ericdaugherty.com/blog/2010/01/complete-software-developer.html">http://www.ericdaugherty.com/blog/2010/01/complete-software-developer.html</a><br />
<br />
<blockquote>Education</blockquote><blockquote>While a Computer Science or Computer Engineering degree is not required to develop software, it can provide an understanding of the foundational elements on which everything else is built. Understanding both how a computer actually works, and the fundamentals of algorithms, data structures, and operating system design will provide a solid theoretical foundation for an entire career. I also believe it is important that the degree focuses on theory more than practice </blockquote><br />
I find that a lot embedded software engineers lack knowledge of experience whatsoever with OO concepts. That's gonna hurt when devices become big enough so that C won't just cope with large projects.<br />
I hope though we'll skip C++ altogether.<br />
<br />
<br />
<blockquote>Consulting</blockquote><span class="Apple-style-span" style="font-family: 'Helvetica Neue', helvetica; font-size: 14px;"><blockquote><br />
</blockquote><blockquote>I believe that every new college graduate's first job should be with a consulting company. Not just any consulting company, but one large enough and experienced enough that it provides real training on how to be a Consultant, in addition to how to develop software. Consulting is a skill, and it is one that will pay dividends through an entire career.</blockquote></span><br />
<br />
It's been true for me.<br />
<br />
<span class="Apple-style-span" style="font-family: 'Helvetica Neue', helvetica; font-size: 14px;"></span><br />
<ul><li><blockquote>Build a product </blockquote></li>
<li><blockquote>Work for a startup</blockquote></li>
<li><blockquote>Learn</blockquote></li>
<li><blockquote>Mentor</blockquote></li>
<li><blockquote>Build and mantain your Network</blockquote></li>
</ul><div>I couldn't agree more</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4199600433241885589.post-70619532726820884682009-11-02T11:45:00.000+13:002009-11-02T11:45:55.561+13:004RF unveils a new radio productToday 4RF launches Aprisa SR, a point to multi-point radio product we've been working on for the last couple of years. Here's the press release from <a href="http://4rf.com/">4rf.com</a>:<br />
<br />
<br />
<br />
<table background="http://www.4rf.com/himages/grid2.gif" border="0" cellpadding="0" cellspacing="0" height="230"><tbody>
<tr height="54"><td align="left" bgcolor="#FFFFFF" height="211" valign="top" width="664"><blockquote><div class="body2" style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px;"><b>4RF Communications launches the Aprisa SR multipoint radio for future-proof, security-enhanced, Smart SCADA networks</b><br />
</div><div align="justify" class="body2" style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px;">We have unveiled our new product, the Aprisa SR Smart SCADA multipoint radio, at the <a href="http://www.eutc2009.utc.org/">European Utilities Telecom Council</a> annual conference.<br />
</div><div align="justify" class="body2" style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px;">Used by oil, gas, and utility companies for a wide range of monitoring and control applications, the Aprisa SR is a point-to-multipoint Smart SCADA radio operating in the 400-470 MHz licensed spectrum band, with a 12.5 kHz channel size and narrowband 9.6 kbps capacity. The Aprisa SR has been designed to address the key concerns facing the industry: the need for enhanced security, the need to efficiently handle the increasing complexity of SCADA networks, and the evolution to an IP-based and smart grid infrastructure.<br />
</div><div align="justify" class="body2" style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px;">See the press release here - <a href="http://www.4rf.com/site/downloads/4RFCommunications_PressRelease_2Nov09.pdf" style="color: #cc0000; font-family: Arial, Helvetica, sans-serif; font-size: 11px; text-decoration: none;" target="_blank">Aprisa SR Press Release</a><br />
</div><div align="justify" class="body2" style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px;">See the datasheet here - <a href="http://www.4rf.com/site/downloads/AprisaSR_datasheet.pdf" style="color: #cc0000; font-family: Arial, Helvetica, sans-serif; font-size: 11px; text-decoration: none;" target="_blank">Aprisa SR Datasheet</a><br />
</div><div align="justify" class="body2" style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px;">If you have any questions about the Aprisa SR please email us at <a href="mailto:sales@4rf.com" style="color: #cc0000; font-family: Arial, Helvetica, sans-serif; font-size: 11px; text-decoration: none;">sales@4rf.com</a><br />
</div><br />
</blockquote><br />
</td><td bgcolor="#FFFFFF" width="184"><img border="0" height="235" src="http://www.4rf.com/images/Aprisa_SR.GIF" width="384" /></td></tr>
</tbody></table>Unknownnoreply@blogger.com5Unknown location-41.239286545058349 174.81385231018066-41.303828045058346 174.69712281018067 -41.174745045058351 174.93058181018066