Blog | 24/7 Software

SQLite Bulk Insert

One of our projects involved inserting in a SQLite database – however, INSERT is really slow – I could only do few dozen INSERTs per second.


Research led me to this:


“Actually, SQLite will easily do 50,000 or more INSERT statements per second on an average desktop computer. But it will only do a few dozen transactions per second. Transaction speed is limited by the rotational speed of your disk drive. A transaction normally requires two complete rotations of the disk platter, which on a 7200RPM disk drive limits you to about 60 transactions per second.


Transaction speed is limited by disk drive speed because (by default) SQLite actually waits until the data really is safely stored on the disk surface before the transaction is complete. That way, if you suddenly lose power or if your OS crashes, your data is still safe. For details, read about atomic commit in SQLite..


By default, each INSERT statement is its own transaction. But if you surround multiple INSERT statements with BEGIN…COMMIT then all the inserts are grouped into a single transaction. The time needed to commit the transaction is amortized over all the enclosed insert statements and so the time per insert statement is greatly reduced. ”


Now I had to trawl around to find the commands, see below:


//start code
int fld;
int nRows=0;
CppSQLite3DB db;


try
{
db.open(gszFile);


char buf[1500];


db.execDML("begin transaction;");


for (int r = lbound; r < ubound; r++) {


sprintf(buf, "insert into wavelength (testnumber, lamda, counts) values ('%d', '%f', '%f');", testnumber, wavelengths[r], wavelengtharray[r]);


nRows = db.execDML(buf);

}


db.execDML("commit transaction;");


//end code


I did this using the CPPSQLite library, found at: http://www.codeproject.com/KB/database/CppSQLite.aspx


http://www.codeproject.com/KB/database/CppSQLite.aspx


Live the dream!

Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

MYSQL Update if data exists else insert

I was writing some database code based on a weather forecast issued every day. Each new set of data has a total of 89 hours; 24 hours of completely new data to be appended to the end of the datbase table and the rest data needs to be inserted.

Here’s a link to how I did it.

Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

iMarc update…

Well things have started to pick up some steam – nice to see some results. The latest project press release is available here.

Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

More WordPress and jQuery

To refine a previous post on WordPress and jQuery and the use of the wp_enqueue_script function, its paths and dependencies (found at http://themocracy.com/2010/01/more-wordpress-and-jquery/ ).

As a barebones example, this is how we do it when we we’re enqueueing – if that’s a word – the jQuery Cycle plugin, so that we can make a slideshow on the page.

The important point is probably in the dependencies – firstly, the Cycle plugin depends on jQuery, so has to be loaded after – secondly, our custom script to run the whole process on depends on the jQuery Cycle plugin and therefore also on jQuery and is the last to load.

The custom script we’ve written is in them_directory/scripts/them.cycle.js – something very simple, like this:

jQuery(document).ready(function($) {

$('#images').cycle({
//some parameters
});
});

(Don’t forget, the dollar $ object isn’t defined in WordPress jQuery (historical reasons) – hence the form of the first line)

This is client-display side javascript, as opposed to admin-side, (which tends to follow slightly different rules in the WordPress setup) and in this case, the action hook ‘template_redirect’ is usually the time to do it.

To enqueue the jQuery library itself is simple – it’s already registered by default in WordPress, no need to specify other than the default path and version.

So in functions.php

add_action('template_redirect', 'them_js_head_load');

function them_js_head_load(){

//register the plugin
wp_enqueue_script('jquery-cycle', THEM_TEMPLATEURL.'/scripts/jquery.cycle.lite.min.js', array('jquery'), '1.0');
//register the custom script
wp_enqueue_script('them-cycle', THEM_TEMPLATEURL.'/scripts/them.cycle.js', array('jquery', 'jquery-cycle'), '1.0');

}

Note for convenience and efficiency, we’ve previously defined

define(THEM_TEMPLATEURL, get_bloginfo(’template_directory’));

And what you end up with in the page source should be something like this – javascripts loaded in the right place in the page head, up and running



Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

CSS Tips!

I was traversing my Google Reader tech blogs today and I came across a great set of tips from Tutorial Feed.

Here they are, Top 10:

1. CSS font shortcut rules

When styling fonts with CSS you may be doing this:

font-size: 1em;
line-height: 1.5em;
font-weight: bold;
font-style: italic;
font-variant: small-caps;
font-family: verdana,serif;

There’s no need though as you can use this CSS shorthand property:
font: 1em/1.5em bold italic small-caps verdana,serif Much better! Just a couple of words of warning: This CSS shorthand version will only work if you’re specifying both the font-size and the font-family. Also, if you don’t specify the font-weight, font-style, or font-varient then these values will automatically default to a value of normal, so do bear this in mind too.

2. Two classes together

Usually attributes are assigned just one class, but this doesn’t mean that that’s all you’re allowed. In reality, you can assign as many classes as you like! For example:

Using these two classes together (separated by a space, not with a comma) means that the paragraph calls up the rules assigned to both text and side. If any rules overlap between the two classes then the class which is below the other in the CSS document will take precedence.

3. CSS border default value

When writing a border rule you’ll usually specify the colour, width and style (in any order). For example, border: 3px solid #000 will give you a black solid border, 3px thick. However the only required value here is the border style.
If you were to write just border: solid then the defaults for that border will be used. But what defaults? Well, the default width for a border is medium (equivalent to about 3 to 4px) and the default colour is that of the text colour within that border. If either of these are what you want for the border then you can leave them out of the CSS rule!

4. !important ignored by IE

Normally in CSS whichever rule is specified last takes precedence. However if you use !important after a command then this CSS command will take precedence regardless of what appears after it. This is true for all browsers except IE. An example of this would be:

margin-top: 3.5em !important; margin-top: 2em

So, the top margin will be set to 3.5em for all browsers except IE, which will have a top margin of 2em. This can sometimes come in useful, especially when using relative margins (such as in this example) as these can display slightly differently between IE and other browsers.
(Many of you may also be aware of the CSS child selector, the contents of which IE ignores.)

5. Image replacement technique

It’s always advisable to use regular HTML markup to display text, as opposed to an image. Doing so allows for a faster download speed and has accessibility benefits. However, if you’ve absolutely got your heart set on using a certain font and your site visitors are unlikely to have that font on their computers, then really you’ve got no choice but to use an image.

Say for example, you wanted the top heading of each page to be ‘Buy widgets’, as you’re a widget seller and you’d like to be found for this phrase in the search engines. You’re pretty set on it being an obscure font so you need to use an image:

Buy widgets

This is OK but there’s strong evidence to suggest that search engines don’t assign as much importance to alt text as they do real text (because so many webmasters use the alt text to cram in keywords). So, an alternative would be:

Buy widgets

Now, this obviously won’t use your obscure font. To fix this problem place these commands in your CSS document:

h1
{
background: url(widget-image.gif) no-repeat;
}

h1 span
{
position: absolute;
left:-2000px;
}

The image, with your fancy font, will now display and the regular text will be safely out of the way, positioned 2000px to the left of the screen thanks to our CSS rule.

6. CSS box model hack alternative

The box model hack is used to fix a rendering problem in pre-IE 6 browsers, where by the border and padding are included in the width of an element, as opposed to added on. For example, when specifying the dimensions of a container you might use the following CSS rule:

#box
{
width: 100px;
border: 5px;
padding: 20px;
}

This CSS rule would be applied to:

This means that the total width of the box is 150px (100px width + two 5px borders + two 20px paddings) in all browsers except pre-IE 6 versions. In these browsers the total width would be just 100px, with the padding and border widths being incorporated into this width. The box model hack can be used to fix this, but this can get really messy.

A simple alternative is to use this CSS:

#box
{
width: 150px;
}

#box div
{
border: 5px;
padding: 20px;
}

And the new HTML would be:

Perfect! Now the box width will always be 150px, regardless of the browser

7. Centre aligning a block element

Say you wanted to have a fixed width layout website, and the content floated in the middle of the screen. You can use the following CSS command:

#content
{
width: 700px;
margin: 0 auto;
}

You would then enclose

around every item in the body of the HTML document and it’ll be given an automatic margin on both its left and right, ensuring that it’s always placed in the centre of the screen. Simple… well not quite – we’ve still got the pre-IE 6 versions to worry about, as these browsers won’t centre align the element with this CSS command. You’ll have to change the CSS rules:

body
{
text-align: center;
}

#content
{
text-align: left;
width: 700px;
margin: 0 auto;
}

This will then centre align the main content, but it’ll also centre align the text! To offset the second, probably undesired, effect we inserted text-align: left into the content div.

8. Vertically aligning with CSS

Vertically aligning with tables was a doddle. To make cell content line up in the middle of a cell you would use vertical-align: middle. This doesn’t really work with a CSS layout. Say you have a navigation menu item whose height is assigned 2em and you insert this vertical align command into the CSS rule. It basically won’t make a difference and the text will be pushed to the top of the box.

Hmmm… not the desired effect. The solution? Specify the line height to be the same as the height of the box itself in the CSS. In this instance, the box is 2em high, so we would insert line-height: 2em into the CSS rule and the text now floats in the middle of the box – perfect!

9. CSS positioning within a container

One of the best things about CSS is that you can position an object absolutely anywhere you want in the document. It’s also possible (and often desirable) to position objects within a container. It’s simple to do too. Simply assign the following CSS

#container
{
position: relative;
}

Now any element within this container will be positioned relative to it. Say you had this HTML structure:

To position the navigation exactly 30px from the left and 5px from the top of the container box, you could use these CSS commands:

#navigation
{
position: absolute;
left: 30px;
top: 5px;
}

Perfect! In this particular example, you could of course also use margin: 5px 0 0 30px, but there are some cases where it’s preferable to use positioning.

10. Background colour running to the screen bottom

One of the disadvantages of CSS is its inability to be controlled vertically, causing one particular problem which a table layout doesn’t suffer from. Say you have a column running down the left side of the page, which contains site navigation. The page has a white background, but you want this left column to have a blue background. Simple, you assign it the appropriate CSS rule:

#navigation
{
background: blue;
width: 150px;
}

Just one problem though: Because the navigation items don’t continue all the way to the bottom of the screen, neither does the background colour. The blue background colour is being cut off half way down the page, ruining your great design. What can you do!?

Unfortunately the only solution to this is to cheat, and assign the body a background image of exactly the same colour and width as the left column. You would use this CSS command:

body
{
background: url(blue-image.gif) 0 0 repeat-y;
}

This image that you place in the background should be exactly 150px wide and the same blue colour as the background of the left column. The disadvantage of using this method is that you can’t express the left column in terms of em, as if the user resizes text and the column expands, it’s background colour won’t.

At the time of writing though, this is the only solution to this particular problem so the left column will have to be expressed in px if you want it to have a different background colour to the rest of the page.

Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

Setting up the Windows WDK / DDK on Vista

I wanted to blow my head off with this one.

I was told that the Windows Driver Development Kit was compatible with Vista…this was verified by numerous sites.

Yet time and time again the installs failed….with the error msg:

The WDK 7_0_0 install failed with the following error msg (which I couldn’t find ANYWHERE…grrrrrrrrrrrrrrrrrrrrrrrrrrr)

————————————————————–

KitSetup is unable to open the specified logfile

Additional information:

CreateFile call failed returning Windows error code 123 (0×007b) = “The file, directory name, or volume label
syntax is incorrect.”

Logfile: C:\Users\murphy\AppData\Local\Temp;C:\Program Files\Java\jre1.6.0_07\lib;C:\Users\murphy\Programs\javacomm20-win32\commapi\samples\Blackbox\Blackbox.jar;\KitSetup.log

This error occurred before logging was initialized so no logfile was created.

[KitSetup version 201.104.808.2200 error code 0x000e caught during initialization of base routines. The KitSetup process will now exit.]

—————————————————————–

The WDK 6001 install failed with the following error msg:

Windows Platform SDK API call failure

Additional Information

In function CopyFile…

CreateDirectory call failed returning Windows error code 123 (0×007b) = “The filename, directory name, or volume label syntax is incorrect.”

directory=C:\Users\murphy\AppData\Local\Temp;C:\
filename_source=C:\Users\murphy\AppData\Local\Temp\KitSetup.log
filename_sink=C:\Users\murphy\AppData\Local\Temp;C:\Program Files\Java\jre1.6.0_07\lib;C:\Users\murphy\Programs\javacomm20-win32\commapi\samples\BlackBox\Blackbox.jar;\WDK-KitSetup.log throw_if_exists=false

[KitSetup version 200.114.807.700 error code 0×0007 caught during initialization of runtime routines. The KitSetup process will now exit.|

———————————————————-

I spent days trying to fix it. The solution?

Upgrading to Windows 7 allowed me to @ least install WDK 6000….I will update where I get to from there….

Live the dream!

Murphy

Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

Upgrading from iPhone 3.0 to iPhone 3.0.1 as a Developer

If you upgrade to the latest OS version for the iPhone you will run into the error “No provisioned iphone device is connected” while trying to test your app on the device. There is an easy fix for this. Just open the terminal and create the symbolic link by using the command below.


ln -s /Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.0\ \(7A341\) /Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.0.1

Happy coding!

Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

How to Create A Simple Web-based Chat Application

Web based chat such as the facebook chat is a great addition to any web page especially for real time chat support for businesses. NetTuts is a great website for tutorials and has a web-based chat tutorial located here http://net.tutsplus.com/tutorials/javascript-ajax/how-to-create-a-simple-web-based-chat-application/

Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

Posting to wordpress from the iphone

In order to post from your iPhone to wordpress you need to enable xml-rpc on your wordpress blog. Go to your admin panel Settings->writing->remote publishing and check the XML-rpc box. Download the wordpress app from the iTunes store for free and add your blog. You can now blog from anywhere there is a cell signal!

Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]

jQuery Tab Navigator and auto refresh

Looking through online documentation for a nice jQuery Tab navigator and auto refresh I stumbled upon these posts

    http://docs.jquery.com/UI/Tabs
    http://9lessons.blogspot.com/2009/07/auto-load-refresh-every-10-seconds-with.html
Share This
[del.icio.us] [Digg] [Facebook] [Google] [LinkedIn] [MySpace] [Reddit] [Slashdot] [StumbleUpon] [Technorati] [Twitter] [Windows Live] [Yahoo!] [Email]