Tuesday, 8 April 2014

Local mail in Linux and Mutt

Linux has a local mail system, it probably won't be of much interest to you in terms of day to day email since you probably have email set up with your ISP, Yahoo, Google, etc.

One thing that you may be interested in is administrative alerts that are sent to the root mailbox, invalid password attempts, results of cron jobs, etc.

I found the easiest way to view this mail is to install mutt, I'm currently running Linux Mint 16 but the process detailed below will be the same for other versions, Ubuntu, Debian and their derivatives.

Firstly install mutt:

$ sudo apt-get install mutt

Any time that you want to view root's email just type:

$ sudo mutt

You will then see the root mailbox. You might find your own mailbox is inaccessible, probably because it doesn't exist yet :-) This is easily remedied with a few simple command

Assuming your username is "jones", we create an empty file of that name:

$ sudo touch /var/mail/jones

Then we want to make sure that jones can use it, so assign ownership to yourself:

$ sudo chown jones /var/mail/jones

Now you own, you can change the permission so that only you can use it.

$ chmod 600  /var/mail/jones

Now you can use mutt yourself.

Monday, 7 April 2014

Installing Phonegap on Linux



Installing Phonegap on Linux

Introduction

Phonegap will enable you to write mobile apps in HTML/CSS/JavaScript and then deploy to multiple mobile targets including Android and iOS. This document will outline the installation procedure for Linux Mint. I did this on Linux Mint 16 but the process should be similar or the same for other versions too. Also, since Linux Mint is based upon Ubuntu, which in turn is based upon Debian, this may work (or help) on those distros and derivatives as well. For other flavours of Linux you should consult the relevant documentation as the overall process will be similar but the commands for installing programs will be different (e.g. rpm, aptitude and yum as opposed to apt-get). 

You can get this installed on Windows as well, but I found the emulator to run very slowly, even with the HAXM hardware virtualisation.

Install Pre-requisites

There’s a lot, I found this wasn’t all documented in the same place and I had to Google error messages, etc. to find solutions.

Install Apache Ant

A Java library and build tool required by Phonegap.
$ sudo apt-get install ant

Install Java Development SDK (JDK)

The Java Development Kit.
$ sudo apt-get install openjdk-7-jdk
This may change to openjdk-8-jdk in later Linux editions, Linux Mint 18 uses this number.

Install Android SDK

Download package relevant to your system. Unzip the file into your home folder, e.g. /home/username/android-sdk-linux

Set up environment

Edit your .bashrc file:

$ gedit ~/.bashrc

Add the lines to point variables at the installed apps, e.g.

JAVA_HOME=/usr/lib/jvm/default-java
ANDROID_HOME=$HOME/android-sdk-linux

PATH=$PATH:$JAVA_HOME/bin:$ANDROID_HOME/tools


You may need to add your bin folder to the path as well, it may already be there, if not then add “:$HOME/bin” to the path, e.g.

if [ -d “$HOME/bin” ] ; then
    PATH=$HOME/bin :$PATH
fi

Update Android SDKs

Open terminal and run the android sdk manager:

$ android &

Select packages if required, what you need should already be selected apart from “Intel x86 Atom System Image” (this will work better than emulating an ARM chip later), you may want install earlier versions also. Click the [Install (n) Packages] button. This may take a while, you’ll probably have time to grow some coffee beans, let alone make a cup. Luckily, as this is a multitasking operating system, you can go onto the next step whilst this one is completing. Once complete you may find there are still some packages to install, click on the [Install (n) Packages] button again.


Back in the terminal, if you didn’t start android in the background (& parameter)  then there’ll be no prompt, in this case press Ctrl+Z to pause android then enter the command bg:

$ bg

This will allow android to run in the background.

 

Install npm:

Node Packaged Modules
$ sudo apt-get install npm

Install Phonegap

$ sudo npm install -g phonegap

Install NodeJS

$ sudo apt-get install nodejs

Install ia32 libs

$ sudo apt-get install ia32-libs

Install adb

$ sudo apt-get install android-tools-adb

Fool OS into thinking nodejs is node

There are two packages in the Ubuntu repository that go by the name node, node is an amateur packet radio program and nodejs is an event based server side JavaScript engine. Unfortunately most nodejs programs will expect to use a binary called “node” so we link that back to nodejs, thus:

$ sudo ln -s /usr/bin/nodejs /usr/local/bin/node

As an aside, it’s probably better to not try this development on a PC where the amateur packet radio program “node” is installed or required since you may run into some compatibility issues.

Install hardware virtualisation helpers.

Emulating an android device without hardware virtualisation will be a slow and painful experience

$ sudo apt-get install qemu kvm

Create an AVD

Create an AVD (Android Virtual Device) to test the apps on, to do this go back to the Android SDK Manager (hopefully it will finish downloading/installing before you use it) go to Tools -> Manage AVDs. Add a new one
  • Click the [New…] button. Give it a name, e.g. “nexus”
  • Select device (e.g. Nexus 7).
  • Select target (API Level, your choice).
  • Select CPU (Intel Atom will work best with hardware virtualisation, you can select ARM if you want but it will be slower, much slower)
  • Select a skin, your preference.
  • Optionally select camera(s). Mine crashed when I tried to use it but you may get lucky, you can select Emulated as the camera, it will work but the pictures won’t actually be real.
  • Optionally change memory options from defaults, you will need to enter a number in the SD Card if you want to use the camera.
  • Optionally tick [Use Host GPU], this may help the graphics redraw rate if you have a decently powered GPU, I’ve not really noticed a difference yet.
  • Press OK to save.

Don’t start the AVD yet otherwise it will start in emulation mode and be quite slow. If you don’t have a bin directory in your home directory then create one, the next time bash starts, it will add it to your path if it exists. Create a script file to start the AVD :

$ gedit ~/bin/nexus

Enter the following text:

#!/bin/sh
echo Starting Nexus…
emulator –avd nexus –qemu –enable-kvm
&


Save and exit gedit, make the file executable:

$ chmod +x ~/bin/nexus

You can also get a bit more elaborate and have that script start any AVD you want, e.g.

#!/bin/bash
if [ "$1" == "" ]; then
    avd=nexus
    echo No parameter specified, defaulting to $avd
else
    avd=$1
fi
echo Starting android avd $avd
emulator -avd $avd -qemu -enable-kvm &


This script will fail if you have set the chosen AVD to have an ARM chip but you can also start the AVD from the Android Virtual Device Manager, although bear in mind that when you do this, the manager will not want to exit until the emulator is closed.
By now, you should have an Android emulator up and running

With that, you should be good to go, swipe to unlock the android device and create a phonegap app:

$ phonegap create myApp

$ cd myApp

$ phonegap run android

Addendum (28th Feb 2016):
With recent updates to phonegap, you may receive an error message saying it cannot find the module "bplist-parser", you can remedy this by installing it with the following command:

$ npm install -g bplist-parser


Monday, 16 December 2013

SQL Server Database Engine Tuning Advisor

I noticed a problem whilst doing some routine tuning. I had a query that I wanted to improve as the profiler told me it was doing a lot of work. I ran this through the Database Engine Tuning Advisor (DETA) but I guess I must have started it up wrong.

I was in another copy of the database when I was looking at this query (the two databases were identical in both structure and data). I then fired up DETA, which had selected "DatabaseB", I de-selected this and selected "DatabaseA" and ran the analysis.

The result came back, no improvement, no recommendations. I was surprised by this as I was expecting some index suggestions, I opened the view in design mode and examined the indices on the tables myself and saw what IMHO was quite a lack of at least 2 indices that I would have though would speed things up.

Curiously, I logged the Management Studio onto DatabaseA and ran it again, 2 indices suggested and 99% improvement estimated.

So it would seem that you should choose your database before firing up DETA or it would (I suspect) still run the query in the original database it was launched from but only examine tables from the selected database.

Monday, 17 December 2012

Warning about SQL Server Scheduled Tasks

I've had cause to create scheduled tasks on SQL Server in the past and in general it's a simple process, write a bit of T-SQL, test it, put it on a job and schedule it, not much can go wrong, right?

Well on occasion it does go wrong if you're logged into a SQL Server as 'domain_name\trevor.best' then that will be the name of the owner of the job, seems logical. What isn't logical is when you get an error stating that it cannot verify my user name when it's OK with me being logged in normally to create the job.

The workaround for this is to set the owner to a SQL Server user (e.g., sa).

The moral of the story is once you've set up a scheduled task, hang around to make sure it runs on schedule.

Monday, 10 December 2012

Assigning Variables in SQL Server (T-SQL)

I came across a problem today whereby a stored procedure didn't behave as expected. I suppose when I think about it, it behaved as it should have but my expectation was lacking the thought mentioned before.

There's two different ways of assigning a variable to a value stored in a table, one is to use a subquery in a "set" statement and the other is a simple select, e.g.

Set Statement
set @MyVar = (select field from table where otherfield=@othervar)

Select Statement
select @MyVar = field from table where otherfield=@othervar

Both ways will yield the same result as long as there is a result in the table, the difference is when there are no records in the table that you are selecting from. The first example will yield a null whereas the second won't assign a value to the variable at all. If the variable was null to start with then the result will look the same but if @MyVar held a value other than null before then it will still have that previous value.

Something to think about if assigning variables this way within a loop.

Friday, 8 June 2012

SQL Server Management Studio Reconnecting

As I run several virtual machines, I usually save their state overnight when I shut my laptop down. If I'm running SQL Server Management Studio it will get disconnected as suspending a virtual machine will temporarily disconnect it from the network.

Upon restoring the VM, if I go to run a query in a window that's already open, I will get the following error.

Msg 10054, Level 20, State 0, Line 0
A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

This was quite frustrating as the "reconnect" button was greyed out so I thought it wise to reconnect to the server before running the query again. This presented two problems:
1) I don't always remember to reconnect
2) Reconnecting logged me onto the "master" database and the query might not work very well there or accidentally create an array of unnecessary objects in the wrong database.

I have since found though, that if you run the query and get the above error, simply running the query again will automatically reconnect you to the server and the correct database.

Tuesday, 15 May 2012

Access newer Microsoft Access databases from VB6

I had to update a legacy program today that was written in VB6 and imports data from Access (jet) databases, the company that make the Access applications have upgraded to Access 2010 from the 2003 format that they were using so the import program immediately failed.

Luckily, Microsoft still support this scenario with the aid a new download http://www.microsoft.com/en-us/download/details.aspx?id=23734 that replaces the DAO library. Once installed, you can remove the reference to DAO 3.6 (or earlier) and add a reference to "Microsoft Office 12 access database engine object library". This new library appears to be backwards compatible with the old .MDB formats as well.