• Tag Archives Technology
  • Fixing my first problem with MongoDB.

    working with MongoDB seemed easy at first.

    It isn’t available in the APT repository and compiling it on the Raspberry pi is a little different so I followed this very helpful guide.

    That got me up and running so next I had to learn a little more about MongoDB. Fortunately, the MongoDB manual is fantastic so This section told me everything I needed to know to create my first database and collection. Note, collection is similar to a table in SQL world.

    Next, I wanted to dive right in and connect my Python application that is taking data over serial from my Arduino. The idea was to add this data to a collection in MongoDB so that historical graphs could be generated. With a quick Google search, I found This quick tutorial that shows the basics of Python and MongoDB. Armed with a little knowledge I successfully learned how to add data to my new collection in MongoDB. Everything was working perfectly.

    That was on Friday night. Saturday was a very busy day so I didn’t get near this stuff at all until late on Sunday. With a lot of frustration, I found that no data was shown in MongoDB any more and MongoDB was frequently hanging without providing me with a prompt. This seemed to be any time I tried to use the db operation. I was absolutely certain that data had been written to the database and collection so I set about trying to find out what was going wrong.

    First, I checked the logs in /var/log/mongod/mongodb.log. All they were showing me were the connection attempts.

    Then I looked at the ocasional time out error message that I was getting from within the MongoDB shell. Still nothing useful.

    I even tried searching forums etc for some hint of what might be going wrong.

    I found two useful pages that I’ll keep for future reference but unfortunately, they were of no help with this problem. This is a forum post that someone created when MongoDB seemed to be hung. and This one shows how to troubleshoot hanging issues.

    I decided to try running MongoDB as a user run process instead of a system daemon. Of course, then, i was using the default settings so I thought that it might show me if anything was going wrong with the settings in /etc/mongo.conf. No. All I got was a message about the dBPath not set. This was of no use to me because I quickly found out that in /etc/mongod.conf, the DBPath was set to /var/lib/mongodb/. However, this pointed me toward looking at the permissions on that folder. I had set them while installing MongoDB but I thought I’d check again to be sure that the permissions were set recursively for child files and folders. Again, this wasn’t the problem, however I noticed a file called mongod.lock. I thought maybe this was a place holder to show that the database was locked so I tried moving that file out of the /var/lib/mongodb directory. Sure enough, I made a little more progress. The show dbs command was still causing the MongoDB shell to hang. I deleted the databases that I created while working with Python earlier from the /var/lib/mongodb/ directory and this let the show dbs file runn a little longer but it was still causing MongoDB to freeze. I deleted the MyDB database that was created when I was learning MongodB first as well and the command completed successfully. Of course, I was very aware that I had deleted files from the file system and the databases were still there but were probably now corrupt within MongodB so with another quick search on Google, I found the short command to delete databases from within MongoDB. I also found the command to drop mongoDB collections as well but I don’t particularly need that at the moment. Handy to have for future reference of course.

    So, after deleting the files and deleting the databases within MongoDB, the system is working perfectly. However, I hear you say, “There’s nothing in the system, of course it’s running perfectly!” Your absolutely right, but for the moment, there’s no locking so I@m going to hope either one of the tutorials / forum posts were wrong or it was just something in one of the databases that became corrupt.


  • Jaws scripts to virtualize list view items.

    In work at the moment, I spend a huge amount of time in massive list views. These list views could have thousands of items and up to 256 columns. At first, reading them with Jaws was one of the most stressful things I’ve ever done. The customize list view scripts don’t work because of a bug in the user interface of this application. Every time focus changes to or away from the main application, the control that previously had focus will no longer have it when you return to the main window. It is a torturous situation to be in because when I’m in this application, I need information quickly and accurately. Also, most of the columns contain numbers that are very important so for the first week or two of starting in my new job you’d find me with my head down in major concentration mode trying to listen to Jaws fly through all the columns so I could pick out the tiny nugget of information that I needed from column 10 or worse, 210. I’d finish the day completely exhausted from this effort so I badly needed a solution.

    Jaws has a script that will allow you to read the first ten columns of a list view but this is stupidly limited when you consider that this only allows a user to intentionally work with ten list view columns. What I needed was a script that would let me walk forward and back through each column from the beginning to the end of that item. If I found something that I needed, I could then listen to it and it would be clear. You would not believe how much easier this made my day. However, it became clear that I couldn’t always trust myself to remember all the information that I was being given by Jaws when working through these list view items so I decided to expand the script a little to add the current column into the virtual viewer. This is handy as I can then examine the text character by character if I need to and I can use the clipboard to store that text if I need to use it in notes or SQL statements that will pull more information from the database again, this minor change made things much easier for me.

    However, there was one more thing that I needed. When sighted people were using these lists they could compare two items visually much faster than I could with my scripts. Yes, the column I was on was retained even when I was on different list items so say / virtualize current column worked very well. However, it wasn’t quite what I needed for every situation. The next solution has proven to be even more helpful than the first. Now, when I choose to, I can virtualize the entire list item so using the virtual viewer, I can arrow up and down the list of column headers and the text within each one to get the data in the best format for me to understand quickly. Thanks to some excel queries, I can virtualize two columns then use a dif function to work out the differences much faster than anyone who can see.

    These scripts have actually changed the way I work with list views. I really hope they are helpful to you.

    Disclaimer: I won’t support these. I’m not a script writer; I sometimes manage to scrape scripts together with the help of others or by taking script chunks from existing scripts written for Jaws. In this instance, I butchered a few other scripts to make these. Moving back and forward through list items works very well but for some reason, the count is slightly off so you may find that you need to move to the next list item twice to make it actually go forward.

    I added these to my default scripts because I needed this functionality in a number of applications after a while. Add them where ever you like. At the top of your file in the globals section, you need to declare a variable for holding the current list column number. The line is below:


    int CurrentListColumn

    Remember to add a comma from the previous variable declaration or your script won’t compile.

    Here are the scripts. Add them to the bottom of the default file if you choose to use that. Remember to also assign keyboard commands to each script. I’m sorry, but if you aren’t particularly sure how to do this, you may need to ask the Jaws script mailing list or read the script help topics. I cant promis to help you out as I’m busy enough as it is.


    Script ReadNextListviewColumn ()
    var
    int nCol,
    int nMaxCols,
    string sHeader,
    string sText,
    handle hCurrent,
    int nCurrent
    If (CurrentListColumn<1) then CurrentListColumn = 1 EndIf If !(GetRunningFSProducts() & product_JAWS) then return EndIf let hCurrent=getCurrentWindow() if !IsTrueListView(hCurrent) then sayMessage(OT_ERROR,cmsgNotInAListview_L,cmsgNotInAListview_S) return endIf let nMaxCols=lvGetNumOfColumns(hCurrent) let nCurrent=lvGetFocusItem(hCurrent) let nCol=CurrentListColumn let sHeader=lvGetColumnHeader(hCurrent,nCol) let sText=lvGetItemText(hCurrent,nCurrent,nCol) say(sHeader,OT_NO_DISABLE) say(sText,OT_NO_DISABLE) say(IntToString(CurrentListColumn),OT_NO_DISABLE) if (nCol < nMaxCols) then CurrentListColumn = CurrentListColumn + 1 EndIf if (nCol > nMaxCols) then
    SayFormattedMessage(OT_ERROR,formatString(cmsgListviewContainsXColumns_L,intToString(nCol),intToString(nMaxCols)),formatString(cmsgListviewContainsXColumns_S,intToString(nCol)))
    return
    endIf
    EndScript

    Script ReadPreviousListviewColumn ()
    var
    int nCol,
    int nMaxCols,
    string sHeader,
    string sText,
    handle hCurrent,
    int nCurrent
    if (CurrentListColumn > 1) then
    CurrentListColumn = CurrentListColumn - 1
    EndIf
    If !(GetRunningFSProducts() & product_JAWS) then
    return
    EndIf
    let hCurrent=getCurrentWindow()
    if !IsTrueListView(hCurrent) then
    sayMessage(OT_ERROR,cmsgNotInAListview_L,cmsgNotInAListview_S)
    return
    endIf
    let nMaxCols=lvGetNumOfColumns(hCurrent)
    let nCol=CurrentListColumn
    let nCurrent=lvGetFocusItem(hCurrent)
    if (nCol < 1) then let nCol=1 endIf if (nCol > nMaxCols) then
    SayFormattedMessage(OT_ERROR,formatString(cmsgListviewContainsXColumns_L,intToString(nCol),intToString(nMaxCols)),formatString(cmsgListviewContainsXColumns_S,intToString(nCol)))
    return
    endIf
    let sHeader=lvGetColumnHeader(hCurrent,nCol)
    let sText=lvGetItemText(hCurrent,nCurrent,nCol)
    say(sHeader,OT_NO_DISABLE)
    say(sText,OT_NO_DISABLE)
    say(IntToString(CurrentListColumn),OT_NO_DISABLE)
    EndScript

    Script VirtualizeCurrentListColumn ()
    var
    int nCol,
    int nMaxCols,
    string sHeader,
    string sText,
    handle hCurrent,
    int nCurrent

    If !(GetRunningFSProducts() & product_JAWS) then
    return
    EndIf
    let hCurrent=getCurrentWindow()
    if !IsTrueListView(hCurrent) then
    sayMessage(OT_ERROR,cmsgNotInAListview_L,cmsgNotInAListview_S)
    return
    endIf
    let nMaxCols=lvGetNumOfColumns(hCurrent)
    let nCol=CurrentListColumn
    let nCurrent=lvGetFocusItem(hCurrent)
    if (nCol < 1) then let nCol=1 endIf if (nCol > nMaxCols) then
    SayFormattedMessage(OT_ERROR,formatString(cmsgListviewContainsXColumns_L,intToString(nCol),intToString(nMaxCols)),formatString(cmsgListviewContainsXColumns_S,intToString(nCol)))
    return
    endIf
    let sHeader=lvGetColumnHeader(hCurrent,nCol)
    let sText=lvGetItemText(hCurrent,nCurrent,nCol)
    say(sHeader,OT_NO_DISABLE)
    say(sText,OT_NO_DISABLE)
    say(IntToString(CurrentListColumn),OT_NO_DISABLE)
    UserBufferClear ()
    UserBufferAddText (sHeader)
    UserBufferAddText (sText)
    UserBufferActivate ()
    SayLine ()
    EndScript

    Script VirtualizeAllListColumns ()
    var
    int nCol,
    int nMaxCols,
    string sHeader,
    string sText,
    handle hCurrent,
    int nCurrent

    If !(GetRunningFSProducts() & product_JAWS) then
    return
    EndIf
    let hCurrent=getCurrentWindow()
    if !IsTrueListView(hCurrent) then
    sayMessage(OT_ERROR,cmsgNotInAListview_L,cmsgNotInAListview_S)
    return
    endIf
    let nMaxCols=lvGetNumOfColumns(hCurrent)
    let nCol=1
    let nCurrent=lvGetFocusItem(hCurrent)
    UserBufferClear ()
    while nCol<=nMaxCols let sHeader=lvGetColumnHeader(hCurrent,nCol) let sText=lvGetItemText(hCurrent,nCurrent,nCol) UserBufferAddText (sHeader) UserBufferAddText (sText) LET nCol = nCol + 1 EndWhile UserBufferActivate () EndScript


  • Progressing slowly with the arduino and the Raspberry Pi

    Work on the Arduino and the Raspberry Pi is ongoing. So far, I’ve made Led’s flash, used a light meter to determine when the LED’s are on and off, taken the temperature of the room and moved a camera using a Servo. On the Pi side, I’ve set up Email alerts when motion has been detected by the phone and I even found an application that supports push on the IOS platform so I may even be able to get the Pi to send alerts directly to my iPhone.

    I’ve encountered a few challenges of course. Almost all of the tutorials for the Arduino use a delay function to pause when the servo is running or when the motor is spinning but that’s no good when you need the loop to continue processing while all of this happens. So, I looked into a few alternatives. Using a counter to count the milliseconds since the device was turned on was fine but this would need to reset after 34 days which would cause a problem with the timing of the loop. I then tried a library called ElapsedMilis. This works fine but I had a lot of problems figuring out the logic. I got there in the end though but unfortunately my approach wasn’t completely sound.

    After asking a question on the Arduino forum I was pointed in the direction of another library called Delay Timer. I don’t think it’s released because when I included it first in one of my projects I had a bit of debugging to do to get it working. I must subscribe to Git Hub to suggest my changes. Unlike my previous approach, with this library, I can use as many timers as I want. The last time, I was using one hardware timer and a number of intervals to try to mark when functions should be executed. This should have worked fine in theory but the problem is that the loop is processed so quickly that it can run through the process too quickly and miss an important event. With this new approach, I can have different timers running concurrently and I can check each one. When it is time to execute that function, the timer resets again and its place in the loop is never lost.

    Of course, it’s not all programming. Some of this work is also about putting the components together and making it sit properly. One problem I was having is that the servo was generating too much vibration. This would cause the camera to constantly think it was detecting motion. I came up with the great idea of using a bit of Velcro to help mount the servo to the side of the Raspberry Pi and then Velcro the camera board to the moving part of the servo. Now, the vibration is absorbed by the servo. It’s funny the solutions that show themselves when you’re stuck.


  • A blind person can use the Arduino. Just about.

    Continuing on with my Raspberry Pi and Arduino experimentation, I’ve been trying to get a few minutes here and there over the past two days. Christmas is always a very relaxing but very busy time for me. I’m spending time with family and friends and I try to do very little with technology considering I spend so much time in front of a computer during the rest of the year. This year is very different. It’s still as busy as ever but when I get a free moment, I can’t wait to jump back into the RP. RP from here on in will mean Raspberry Pi in case you’re not sure.

    Firstly, I had a few questions sent by Email after the last post. All of these questions are asked on the Raspberry Vi website but I’ll briefly give you a few answers here.

    1. Is Speakup supported?
      Technically, Speakup is supported by Raspbian but issues with the sound card integrated with the GPU on the device have caused a lot of problems in relation to software synthesis from ESpeak and other synthesizers. It may be possible to connect something like an Apollo2 to the RP via serial to get that talking. If someone wants to send me over a cable that will connect to the pins on the RP I’d be happy to try this.
    2. Is there any accessibility in the graphical environment?
      Raspbian uses the LXDE Window Display Manager. Orca works with Gnome and the KDE screen reader has a long way to go. Theoretically if Orca is running in LXDE and you start an application written using GDK Orca will work quite happily. However, it is worth remembering that the RP is a low power device. Even with a really good memory card at 96MB read and 92MB write speed the performance will not be nice to work with. My card is 45 write 48 read. Or something close to that.
    3. Is there sound output?
      Yes. Through the line out port and through HDMI if your television supports this.

    I think it’s important to understand that the Raspberry Pi is not meant to be a high power device. It is primarily a tool that should promote learning by children. For someone like me, it’s a low cost device that is really useful for experimentation. If I break it, it’s not the end of the world. If I cause the system not to boot it won’t take long to fix.

    The great thing for me is I have kind of fallen away from using Linux all that actively at home. I use it on servers a lot but I rarely use it for playing with Python or trying out new packages or configs.

    I bought an Arduino a year ago with the best intentions of trying out a few things that I had heard about with the added aim of getting involved with the local maker space. Unfortunately to my annoyance, the Arduino IDE wasn’t accessible to me as a screen reader user. This meant that the kit that I bought has gone on unused for far too long. Thanks to a really brilliant little tool that I found while casually looking around last week, I now have access to compile and upload to my Arduino.

    This tool is called Ino. It is exceptionally easy to use. The basic commands are

    Ino init Creates a new project.
    Ino build Compiles and creates the make file for your project.
    Ino upload Uploads the compiled project.
    Ino serial Displays the serial output from the Arduino.

    You need the Arduino package installed first as well as Python easy_install. There are also a few dependencies listed in the requirements.txt file that will need to be installed before the tool will work.

    The great thing is that it allows complete control of the Arduino without ever using the IDE. So, it can all be done using the console via SSH.

    All I’ve done so far is use a few sensors and lights to read from the serial port just to get started. I’ve used a few loops, called functions, used include files and set up a few checks using if statements. Nothing too complicated but it’s giving me a starting point. Thanks of course to Emma who is helping me with the very visual side of the Arduino. It’s not possible for me to wire up the board so I need sighted assistance to add new components.

    Of course, you would probably get some nice debugging tools using the IDE and the output from ino build isn’t great when it encounters a problem but so far, I’ve been able to debug it manually.

    The only terrible thing about the RP and the Arduino is it’s quite addictive when you get stuck into a project. I need to remember that I’ve an 11 week old baby fighting for my attention as well.


  • First time with the Raspberry Pi

    Thanks to Emma and her mother, Santy was very good to me this year. When they asked what to get the man who now has everything he wants, my answer was simple. A Raspberry Pi and a few things that will let me mess around with it.

    So, this morning I unwrapped a Raspberry Pi B model, a power supply, an extra-long USB cable for when I want to power it off my laptop, a case for the Raspberry Pi, a camera board and a case for that board. Yes. You read that. A camera board. I want to play around with motion detection, colour detection and generally interfacing with the real world through Python.

    First thing that struck me was the amount of tiny boxes. There were boxes for:

    • The Raspberry Pi board
    • The USB cable
    • The power supply
    • The camera board
    • The camera board case
    • The Raspberry pi case
    • The SD card

    The second thing that struck me was the tiny size of the Raspberry Pi and the camera board. The Raspberry Pi is no bigger than a credit card. Going from the shortest side with the USB ports facing you, you find from left to right, the LAN port and two USB ports. Turning the device around to the right so that the long edge is facing you, there is one composite port and one audio out port. Continuing this time on the next short edge, you find the SD card reader on the bottom of the board and a micro USB port used for powering the device to the right of this on the top of the board. Continuing on around to the next long edge you find the HDMI port. If your television supports this, audio will also be piped through this port. All the ports are on the top of the card and the card reader is on the bottom.

    The camera board is connected by a ribbon cable that is attached at one end to the board. The other end attaches onto the Raspberry Pi just behind the LAN and USB ports. Getting this lined up took sighted assistance from my wife I must admit. I probably could have done it with time but I think I might be getting a bit lazy where this kind of thing is concerned. You will agree with me if you see the camera board. It’s really tiny! The case that you can buy for it is very small as well. The camera goes in to the back. There are two very small place holders at the top that hold it in place. Their hard to find though.

    Putting on the case is very straight forward and didn’t require any sighted assistance at all. The only thing I would say here is that getting the four screws in was actually quite difficult. I’d be a reasonably strong person I think but it took a lot of strength to get those screws in. The other thing is, I’m glad that I have a screw driver set for fixing ultra-portable laptops as the screw heads wouldn’t have been compatible with a standard head. The only reason that I mention this is, the Raspberry Pi is meant to be a device that is usable by kids. Getting these screws in would definitely require adult assistance. Either that or last night’s Guinness had more of an impact than I thought.

    Preparing to boot it for the first time, I first had to download the Raspbian image to install it to the SD card. I had done this ahead of time by going to the downloads page on the Raspberry Pi website. That’s one of the best download pages I’ve seen actually. So clean and uncluttered and the Win32 disk imager software that I needed to install the Raspbian image onto the SD card was available as a link to make the process really straight forward. I wish I could say the same for the Disk imager site. It’s hosted by source forge, a website that I don’t particularly like. It’s full of pointless regions and the download link is very badly labelled. If you’re looking for the download, you’ll find it by searching for “download the unnamed link”. That’s no reflection on the Raspberry Pi of
    course. It’s just worth noting if your preparing to follow the same process I did.

    The Win32 disk imager archive is 5.41MB and the Raspbian image I downloaded is 783MB.

    I had read previously that the interface for Win32 disk imager was not accessible as it is written in QT and this was certainly the case for me. However, I was able to muddle through. Basic instructions might be useful for other screen readers so if you’re interested, give me a shout and I’ll write them up for you.

    When the disk imager process finished, I had a quick look at the SD card. In there, I found a config.txt file. Curiosity of course got the better of me so I went in and had a look. I found an overclocking option so I uncommented it. I had read in a few of the forums that it was safe to do this so I thought it was worth a shot. There was a link to the Raspberry Pi site at the end of the file but after skimming through the page for a moment I decided that I had enough to get started with. I’ll probably tweak this config file a little more when I’ve played around with the Raspberry Pi for a few days.

    Right. Now, Raspbian is installed onto the SD card, the case is together with the ribbon cable sticking out and attached to the camera, I have all the cables etc. that I’m going to need sitting to one side so all that’s left is to connect the tiny device to my television. I know the first set up screen isn’t accessible so I’ll need Emma’s help with it but after that, I’ll ensure SSH is enabled and get going.

    I’ve also bought a 7 port powered USB hub. The Raspberry Pi doesn’t have enough power to support many unpowered USB devices so when I’m connecting the Arduino to it I’ll need to give it a bit of a boost.

    Connecting the Raspberry Pi to the television and giving it power was absolutely no problem at all. Within a minute or two, the set up screen launched and with the assistance of Emma, my wife the system was configured in no time. A few things were a little unusual. For example, instead of selecting your keyboard layout, it wanted you to select the keyboard make and model. The localization screen was also a bit confusing. Over all, the configuration interface wasn’t as snappy or responsive as others that we have used but this is most likely as a result of the low processing power of this device.

    Of course, the first thing I changed was the user password. I also changed the hostname and checked for updates. Aside from that, oh, and increasing the partition size, there was nothing else I had to do.

    One thing I should have done right away was change the IP to a static address. I have DHCP on this network of course but when I plugged it in to one of the LAN ports in my office, the pi got a completely different IP for some reason. That’s really strange as usually my DHCP server recognises the Mac and continues to respect the lease. You wouldn’t believe how much time I wasted trying to figure out what note on my network the Raspberry Pi was. I have far too many things connected in this house so when it comes to trying to sift through DHCP logs it’s very cumbersome. I gave up and just set the address manually at the end of it.

    The first thing I did when I got connected via SSH was update the packages and the firmware. I’m surprised the start-up / configuration wizard didn’t do this automatically. It seemed logical that it would check for all available updates when the option to apply updates was available in the menu.

    After a few reboots and some testing, I’m now in a position where I can begin playing around with the pi. I’m really looking forward to this. I’ve read so much online and I’ve bought and read so many books on the subject in the past few weeks that I’m now really looking forward to getting my hands dirty.

    The first thing I’m going to do is get something working using the camera as a motion detection light bulb with This handy tutorial as a starting point.

    I didn’t use any of the information in this next site during my process of getting up and running with the Pi but I would like to commend their work. It’s people like them that continue to push accessibility forward and I would hope they are recognised for the work that they have done. Please look at the Raspberry Vi website for more details and to get involved. I learned of this project while searching on Google for any accessibility problems I may encounter.

    Finally, of course, I have to thank Emma and her mother. I’m into quite a few glasses of wine later but I’ve had a lot of fun playing around with this new toy today.


  • My new job in Document Centric Solutions

    I was in the process of writing a great blog post early this morning on the way to work when I heard a click and my battery died. I booted the laptop up again this evening and very strangely, Microsoft Word didn’t have an auto saved copy. Strange but probably for the best because I think I was rambling.

    I’m writing today to tell you about what’s been happening in my professional life over the past few months. I had a number of discussions with Fujitsu surrounding where I wanted to go and where they saw me going. Our objectives didn’t exactly match so we agreed that I would look for a new job. I certainly didn’t take this decision lightly. Ordinarily, this wouldn’t be such a great time to look for a new job. With Emma expecting our first child in a matter of months I need stability and reliability at work. Turning my life upside down isn’t really what the doctor ordered if you know what I mean. Anyway, I began looking for a new challenge and opportunity in April and in May I was offered a role in a very small company in Dublin. This company have been about for about thirteen years and the number of customers using their products has grown every year.

    The name of the company I now work with is DCS Docs. DCS stands for Document Centric Solutions but when you look at the array of products that they have developed, documentation is kind of the most unlikely description you could possibly find. DCS write software that manages contracts, payments, HR, resource provisioning and reporting. That’s just scratching the surface. I’m there two weeks now and I’m still trying to get up to speed with everything they provide.

    My job title is support manager but this is only one part of what I do. As you might expect in such a small company, people need to be able to take on multiple roles simultaneously. This means I’m also managing project resources, implementing their new VOIP phone system, coordinating with their out sourced IT provider, stream lining their licenses and updating their internal network.

    Although I’m a technical person and I am quite happy to get out of providing support to end users, the opportunity to build up a support team is something that I think I’m going to enjoy. It’s not the first time I’ve done this kind of thing. When working in Stream, I was promoted to the role of technical lead for the Sybase 365 team but for various reasons, this role became very managerial and most of my tasks revolved around making 19 individuals into a 24 hour a day 7 days a week support team that were rock solid. I found this very difficult. Allowing for 19 separate personalities and trying to manage them was a very high pressure environment was way outside the direction I wanted my career to go. It was a huge relief to me when Novell asked me to go back on their support team as their technical lead because it got me away from the managerial side of the business. Prior to working on the Sybase team I was a support engineer on the Novell team so it was great to be asked to go back at a higher level.

    I was honestly worried about going back into a manager’s position when I started with DCS but I’m not in the slightest bit worried any more. The three people that work in support are outstanding. They all have incredible motivation to get work done and they take advice really easily.

    The role is also very technical. I am working with software that has been developed by DCS so I am constantly using applications such as Visual studio, SQL management studio, the SQL profiler and the SQL optimizer.

    Going from a system administrator role to a developer support role is actually really difficult. It takes a lot of effort to let the system administration jobs go to someone else. This is hopefully going to benefit DCS though as I have experience with implementing systems in a large enterprise environment and a small company with only five employees. DCS haven’t had a system administrator in house for quite a while so I’m hoping that my influence will give their internal IT some direction.

    One thing that I should say here. I obviously can’t give too much away about the software that DCSDocs have written just in case I step over any lines but their core product is absolutely amazing. If you know about the entity framework, consider this made 13 years ago but with a really usable graphical and web user interface to take over from programmatically creating classes and functions. It’s just stunning the direction that this company took so many years ago when Microsoft were still thinking along the lines of classic ASP. That kind of innovation is continuing today.

    I’m finding the work very different and challenging and I’m getting on really well with the people that I’m working with so I really think this was a good move for me. I’m missing Fujitsu and I’m missing the exposure to the systems I had there but for a lot of different reasons, I know that couldn’t continue indefinitely.


  • Creating a table of countries.

    This is actually really easy but now that i’ve done it, I thought you might want a copy. So. Here goes. Just create your countries table, create a row for id and name, modify the below script to match your details and away you go.
    This script to generate a countries table is written for SQL 2008.

    USE [YourDatabaseName]
    GO

    INSERT INTO [dbo].[countriesTable]
    ([CountryName])

    VALUES
    (‘Afghanistan’),
    (‘Albania’),
    (‘Algeria’),
    (‘American Samoa’),
    (‘Andorra’),
    (‘Angola’),
    (‘Anguilla’),
    (‘Antarctica’),
    (‘Antigua and Barbuda’),
    (‘Argentina’),
    (‘Armenia’),
    (‘Armenia’),
    (‘Aruba’),
    (‘Australia’),
    (‘Austria’),
    (‘Azerbaijan’),
    (‘Azerbaijan’),
    (‘Bahamas’),
    (‘Bahrain’),
    (‘Bangladesh’),
    (‘Barbados’),
    (‘Belarus’),
    (‘Belgium’),
    (‘Belize’),
    (‘Benin’),
    (‘Bermuda’),
    (‘Bhutan’),
    (‘Bolivia’),
    (‘Bosnia and Herzegovina’),
    (‘Botswana’),
    (‘Bouvet Island’),
    (‘Brazil’),
    (‘British Indian Ocean Territory’),
    (‘Brunei Darussalam’),
    (‘Bulgaria’),
    (‘Burkina Faso’),
    (‘Burundi’),
    (‘Cambodia’),
    (‘Cameroon’),
    (‘Canada’),
    (‘Cape Verde’),
    (‘Cayman Islands’),
    (‘Central African Republic’),
    (‘Chad’),
    (‘Chile’),
    (‘China’),
    (‘Christmas Island’),
    (‘Cocos KeelingIslands’),
    (‘Colombia’),
    (‘Comoros’),
    (‘Congo’),
    (‘Cook Islands’),
    (‘Costa Rica’),
    (‘Croatia’),
    (‘Cuba’),
    (‘Cyprus’),
    (‘Czech Republic’),
    (‘Denmark’),
    (‘Djibouti’),
    (‘Dominica’),
    (‘Dominican Republic’),
    (‘Easter Island’),
    (‘Ecuador’),
    (‘Egypt’),
    (‘El Salvador’),
    (‘Equatorial Guinea’),
    (‘Eritrea’),
    (‘Estonia’),
    (‘Ethiopia’),
    (‘Falkland Islands Malvinas,’),
    (‘Faroe Islands’),
    (‘Fiji’),
    (‘Finland’),
    (‘France’),
    (‘French Guiana’),
    (‘French Polynesia’),
    (‘French Southern Territories’),
    (‘Gabon’),
    (‘Gambia’),
    (‘Georgia’),
    (‘Germany’),
    (‘Ghana’),
    (‘Gibraltar’),
    (‘Greece’),
    (‘Greenland’),
    (‘Grenada’),
    (‘Guadeloupe’),
    (‘Guam’),
    (‘Guatemala’),
    (‘Guinea’),
    (‘Guinea-bissau’),
    (‘Guyana’),
    (‘Haiti’),
    (‘Heard Island and Mcdonald Islands’),
    (‘Honduras’),
    (‘Hong Kong’),
    (‘Hungary’),
    (‘Iceland’),
    (‘India’),
    (‘Indonesia’),
    (‘Indonesia’),
    (‘Iran’),
    (‘Iraq’),
    (‘Ireland’),
    (‘Israel’),
    (‘Italy’),
    (‘Jamaica’),
    (‘Japan’),
    (‘Jordan’),
    (‘Kazakhstan’),
    (‘Kazakhstan’),
    (‘Kenya’),
    (‘Kiribati’),
    (‘Korea’),
    (‘Kosovo’),
    (‘Kuwait’),
    (‘Kyrgyzstan’),
    (‘Laos’),
    (‘Latvia’),
    (‘Lebanon’),
    (‘Lesotho’),
    (‘Liberia’),
    (‘Libyan Arab Jamahiriya’),
    (‘Liechtenstein’),
    (‘Lithuania’),
    (‘Luxembourg’),
    (‘Macau’),
    (‘Macedonia’),
    (‘Madagascar’),
    (‘Malawi’),
    (‘Malaysia’),
    (‘Maldives’),
    (‘Mali’),
    (‘Malta’),
    (‘Marshall Islands’),
    (‘Martinique’),
    (‘Mauritania’),
    (‘Mauritius’),
    (‘Mayotte’),
    (‘Mexico’),
    (‘Micronesia’),
    (‘Moldova’),
    (‘Monaco’),
    (‘Mongolia’),
    (‘Montenegro’),
    (‘Montserrat’),
    (‘Morocco’),
    (‘Mozambique’),
    (‘Myanmar’),
    (‘Namibia’),
    (‘Nauru’),
    (‘Nepal’),
    (‘Netherlands’),
    (‘Netherlands Antilles’),
    (‘New Caledonia’),
    (‘New Zealand’),
    (‘Nicaragua’),
    (‘Niger’),
    (‘Nigeria’),
    (‘Niue’),
    (‘Norfolk Island’),
    (‘Northern Mariana Islands’),
    (‘Norway’),
    (‘Oman’),
    (‘Pakistan’),
    (‘Palau’),
    (‘Palestinian Territory’),
    (‘Panama’),
    (‘Papua New Guinea’),
    (‘Paraguay’),
    (‘Peru’),
    (‘Philippines’),
    (‘Pitcairn’),
    (‘Poland’),
    (‘Portugal’),
    (‘Puerto Rico’),
    (‘Qatar’),
    (‘Reunion’),
    (‘Romania’),
    (‘Russia’),
    (‘Rwanda’),
    (‘Saint Helena’),
    (‘Saint Kitts and Nevis’),
    (‘Saint Lucia’),
    (‘Saint Pierre and Miquelon’),
    (‘Saint Vincent and The Grenadines’),
    (‘Samoa’),
    (‘San Marino’),
    (‘Sao Tome and Principe’),
    (‘Saudi Arabia’),
    (‘Senegal’),
    (‘Serbia and Montenegro’),
    (‘Seychelles’),
    (‘Sierra Leone’),
    (‘Singapore’),
    (‘Slovakia’),
    (‘Slovenia’),
    (‘Solomon Islands’),
    (‘Somalia’),
    (‘South Africa’),
    (‘South Georgia and The South Sandwich Islands’),
    (‘Spain’),
    (‘Sri Lanka’),
    (‘Sudan’),
    (‘Suriname’),
    (‘Svalbard and Jan Mayen’),
    (‘Swaziland’),
    (‘Sweden’),
    (‘Switzerland’),
    (‘Syria’),
    (‘Taiwan’),
    (‘Tajikistan’),
    (‘Tanzania’),
    (‘Thailand’),
    (‘Timor-leste’),
    (‘Togo’),
    (‘Tokelau’),
    (‘Tonga’),
    (‘Trinidad and Tobago’),
    (‘Tunisia’),
    (‘Turkey’),
    (‘Turkey’),
    (‘Turkmenistan’),
    (‘Turks and Caicos Islands’),
    (‘Tuvalu’),
    (‘Uganda’),
    (‘Ukraine’),
    (‘United Arab Emirates’),
    (‘United Kingdom’),
    (‘United States’),
    (‘United States Minor Outlying Islands’),
    (‘Uruguay’),
    (‘Uzbekistan’),
    (‘Vanuatu’),
    (‘Vatican City’),
    (‘Venezuela’),
    (‘Vietnam’),
    (‘Virgin Islands’),
    (‘Wallis and Futuna’),
    (‘Western Sahara’),
    (‘Yemen’),
    (‘Zambia’),
    (‘Zimbabwe’)
    GO

    One quick note: when creating your table, I suggest that you make the ID column an integer and under identity you set it to increment. That way, you won’t need to worry about generating ID’s while adding the countries. Why bother!


  • An introduction to Android and accessibility with talk back.

    In this podcast I wanted to give you a sense of what I like and what I don’t like about the Android operating system. I’m using the talk back screen reader so my perspective will be mostly focused on accessibility of the platform and apps for this particular introduction.

    Listen to my introduction to Android and accessibility.


  • Jaws 14 now requires Internet Access to run.

    I have encountered a problem with using Jaws on servers since the release of Jaws 14.

    fsbrldspapi.dll is loded by Jaws during Installation if your installing it while standing in front of the server but if your installing Jaws remotely using the /type remote switch the installation doesn’t speak or provide Braille output. Therefore the fsbrldspapi.dll file will be loded when you run Jaws for the first time.

    When you are installing or running Jaws on a system be it a server or workstation running on Windows 2008, 2008R2, 7 or 8 without Internet access you will encounter the following error message:

    JFW.EXE. Referral returned from the server.

    It would appear that this issue began popping up around April with an update of Jaws 13 that was released around that time.

    The problem is that the Jaws driver signing program requires trusted certs that are downloaded from Microsoft on an as needed basis.

    More details about how trusted certs are downloaded in Windows 2008 and 2008R2 can be found at the following Microsoft KB link:
    http://support.microsoft.com/kb/931125

    In previous versions of Windows up to XP and 2003 Windows updates included these certs.

    However, it would appear that it is all but impossible or at best very difficult to apply these certs to servers that are off line. The only way I can see of doing it at the moment is to find the required cert and install it on each system. Probably through a SCCM advertisement.

    I have asked FreedomScientific to get back to me on this but although I know that a lot of their staff are on vacation this week due to the thanks giving holiday I have no confidence that they will resolve this new dependency.

    In my opinion this is a bug that should be resolved. At the very least, a specific error message should be provided when Jaws cannot start due to this issue. What really should happen is that when certs can not be used Jaws starts as much functionality as possible without loding this DLL. In other words Braille wouldn’t be available.

    I know that some users really need braille and I’m being a bit selfish here so I’m really sorry.

    I have reported a large number of bugs to FreedomScientific since the release of Jaws 14. I am hoping that they will be resolved however I get the usual answer of “No one else has reported this” and “We cant reproduce that problem here”. I feel like i’m fighting an up hill battle.

    If anyone has any suggestions then I’m all ears. Otherwise, if you could Email FreedomScientific support with any problem your having with Jaws 14 we might get some pressure put on the developers to prioritise a bug fixing excersize.


  • Continuation of Mixing the old with the new. Nokia C5 and iPhone 4S.

    There were a few interesting questions and points made as a result of my post yesterday. Firstly, let me just remind readers that I love getting your Emails and phone calls but it would be nice if you would comment on the site instead of contacting me privately so as other readers can have the benefit of reading your questions and observations.

    Firstly, Jenny asked if the C5 has wifi. NO. It doesn’t although as I’m not using this phone for any data usage this actually makes no difference to me. I’m interested in what you might use wifi for though. Are there apps on the S60 platform that you would use?

    Nicky touched on the idea of using an iPod for listening to Music and using Apps. This is a very good idea. The iPod is smaller, lighter and cheaper and if you’re not using it for phone calls or texting then there’s no need for 3G. However, the iPhone battery lasts for a very long time when not used as a normal phone and there is nothing that the iPhone can’t do that the iPod does so there’s no need to change over if you already have an iPhone. Also, because I could potentially change back to the thinking that one device is just more convenient selling the iPhone would be a mistake because a 64GB iPhone 4S is not a cheap toy at all. I’ve already done this in the past. I moved back to a Nokia phone for a while about three or four years ago but after a while I missed the power of the iPhone so I went back again. However, at that time, I wasn’t running both phones simultaneously so things may be different this time. For me, the iPhone has almost become essential. I use Facetime with sighted people when I need something looked at, I use the many social networking aps to stay in contact with people, I read the local and national news, I keep up to date with Email and I even use it for GPS occasionally. However, I have a tip for you. I have a wireless Vodafone dongle. I usually have my laptop with me when traveling to and from work and this wireless dongle has a nice place in that laptop case. When I really want Internet access on the iPhone while traveling I just turn on that wireless dongle, connect to it from the iPhone and I have the same data access as I had when using it as a phone. Really, the only down side to this is that I have a few more devices to carry around. However, this is more than made up for by the efficiency of being able to make and receive calls and write text messages quickly and comfortably. I’ve been using this method now for just over a week and so far it’s working quite nicely. However, ask me again in a month. Maybe by that time I’ll be tired of carrying an extra phone around with me.

    Just one more note. I have given serious consideration to an iPad or an iPad mini however as a blind person I simply can’t understand why one of these devices would be appealing to me. The larger screen makes absolutely no difference. Why not just use an iPhone or an iPod. The iPad mini feels lovely and sexy. It’s slim, curved and light but once you get over that what’s the benefit if you can’t see the screen?