Wednesday, 30 July 2008

ArtenSUITE Part 6: Pricing

A Development Journal
Part 6: Pricing

This is not an article about pricing a software product. This is an article about the design of a flexible and powerful customer/product pricing ‘system’ that I intend to implement within the sales order / invoicing module of ArtenSUITE.

(Table and Column names are examples only)

Having written and used and worked with many MIS / ERP / Finance systems over the years I have never created or seen one that handled pricing in a way that I was 100% happy with. This article covers my current thoughts regarding a pricing ‘system’ that I will tweak and modify mentally for a while before I commit anything to code. 

ArtenSUITE is a long term project and I am only just starting with the design and creation of the base module.  There is no pressing deadline so I have the time to think carefully about each portion of the product and try and make it the best it can be.

Stage 1
Each line of the ORDER_LINE table will be checked against the PRODUCT_PRICE table. The PRODUCT_PRICE table looks like this:

Primary Key
Insert Date
Product Table PK
Start Date
End Date

Using the SYSDATE (or similar) function the PRODUCT_PRICE table is queried to find the price that is currently applicable.  The latest record inserted in which SYSDATE is between Start Date and End Date is used to determine the price.

This means that price adjustments, such as a yearly increase, can be created and stored in the database well in advance and yet not affect any orders until the date arrives for the scheduled pricing update.  

It also means that you could do a ‘Special July Offer - All Prices Slashed’ type sale just by inserting a new set of pricing records with the Start and End dates being the beginning and end of July respectively.

A desirable side effect of this method is that a permanent pricing history is always available. Note: If a record is not found then a value of 0.00 will be inserted as the price.

Stage 2
The DISCOUNT column that is stored against the CUSTOMER record.  This column represents the standard discount that will be applied for this customer for every purchase.

The price of  each entry in the ORDERLINE table will be reduced by the percentage stored against the customer.  This covers the scenario where different customers pay a different price dependent on whether they are an end user, distributor, dealer etc.

Stage 3
This stage covers the scenario whereby you wish to give the customer a further discount either as a percentage or a currency value, based on their turnover.  This turnover can be either rolling X periods, where the period can be either day, week or month or alternatively the turnover can be between a Start and End date, maybe the Start and End of your financial year ? These turnover values could be derived by applying a SUM function on (Invoices - Credit Notes) for example.

This works as follows:  Once the customer discount has been applied the CUSTOMER_TURNOVER_DISCOUNT table is queried.  This table looks similar to this:

Primary Key
Customer PK
Type (1 = Rolling, 2 = Static)
Number of Rolling Periods
Period Type (Day / Week / Month)
Start Date (For Use if Static)
End Date (For Use if Static)
Discount (Positive Discount = %, Negative Discount = Currency Value)
Threshold (Turnover Value)

The system looks first for ROLLING records for the customer.  The latest record inserted is used to calculate the additional discount percentage or value to be applied to the product price. For example the customer may receive an extra 2% discount if their turnover in any given rolling quarter is more than £10000.  The record would look like this:

Primary Key = 123789
Customer PK = 'SJC001'
Type = 1
Number of Rolling Periods = 3
Period Type = Month
Start Date = Null
End Date = Null
Discount = 2.00
Threshold = 10000

The system then looks for STATIC records for the customer.  The latest record inserted is used to calculate the additional discount percentage or value to be applied to the product price. For example the customer may receive an extra 3% discount if their turnover this financial year is more than £150000.  The record would look like this:

Primary Key = 123790
Customer PK = 'SJC001'
Type = 2
Number of Rolling Periods = Null
Period Type = Null
Start Date = ‘01 APR 2008’
End Date = ‘31 MAR 2009’
Discount = 3.00
Threshold = 150000

So you can give your customer a discount incentive for both rolling turnover and static turnover, or just one or the other. The key is flexibility.  Note: If a CUSTOMER_TURNOVER_DISCOUNT record is not found, or the accumulated turnover did not reach the predetermined levels, then no additional discount is applied at this stage.

Stage 4
The final stage is where you may wish to give additional discount to a particular customer when they purchase a particular product, or when they purchase a particular quantity (or more) of a particular product.

This works by querying a Customer / Product Matrix table.  The CUST_PROD_MATRIX table looks like this:

Primary Key
Customer PK
Product PK
Discount (Positive Discount = %, Negative Discount = Currency Value)

The system checks for the existence of matrix records that match the customer and the product.  If it finds one (or more) it checks the quantity and selects the appropriate additional discount from the record with the highest quantity that is less than or equal to the quantity entered on the order line.

If a CUST_PROD_MATRIX record is not found then no additional discount is applied at this stage.

And thats it - so far.   It covers most pricing eventualities that I can recall at the moment.   It is at this stage theoretical and has not yet been implemented in code, although it will be and thankfully that is the easy bit :-)

Any feedback, queries etc. please feel free to leave a comment.

"After silence, that which comes nearest to expressing the inexpressible is music." - Aldous Huxley
Honest Expert Independent Technology Advice for Business

Thursday, 24 July 2008

ArtenSUITE Part 5: More Database and Table Design

A Development Journal
Part 5: More Database and Table Design

No programming today. Working entirely on database design and creating tables, foreign key constraints, indexes etc. So far I have 17 tables designed and setup, these are some of the core tables that will be needed by most business applications that I create as part of ArtenSUITE. The screenshot below shows the 17 tables:


As you can see I have used the Oracle ‘Table Comment’ feature to put a store a plain english description of the table in the database. This is done so rarely, and many times when working with legacy Oracle systems I have *really* wished more developers/DBA’s took advantage of this feature. Properly commented tables and columns mean there is often no need to refer to a data dictionary or technical document to understand the database structure of a system you have never seen before.

To use the comment feature in Oracle you use the following syntax:

SQL> comment on table TABLE is ‘TABLE DESCRIPTION’;

Comments can also be applied to views and even the columns in tables. Comments are applied to views using exactly the same syntax as tables (shown above). To apply a comment to a particular table column, use the following:



Access to most facilities within ArtenSUITE will be able to be restricted to particular personnel. The design of this is one that I have used very successfully in the past. A table exists which contains the following information (select columns only shown)

        Security Action ID
        Security Action Description
        User Primary Key

Each section of the program that needs to be secure has a ‘Security Action ID’ assigned to it. When the menu is selected or the button is clicked to perform the restricted action a call is made to a function with the parameters being the User Primary Key and the Security Action ID:

        call check_if_access_allowed(User Primary Key, Security Action ID)
        if return 1
                enter the method, access allowed

the function that performs the check looks like this:

        sub check_if_access_allowed
                select security_pk from security_table where user_pk = [User Primary Key] and security_action_id = [Security Action ID]
                if row returned from select
                        return 1
                        Show Message “Action to [Security ID] - Not Granted. Please see the System Administrator for Access ...“
                        return 0
                end if
        end sub

To grant a particular user access to a particular action it is only necessary to create (or duplicate and edit) a security record. As a developer it is only necessary to prefix every ‘action’ with a security id and a call to the security procedure. If a customer needs a particular action to be secured in future they can enter the security record themselves.

Oracle XE and Oracle SQL Developer

I used the ‘Application Express’ interface for many of my tasks today and it is quite good. Easy and pleasant to use. I couldn’t however get the ‘Edit Triggers’ to work and so I switched to Oracle SQL Developer. After getting the latest version I was surprised just how much this product has improved recently. The last version I used was ... iffy to say the least. It has been tidied up, made faster and slicker. I like.

Archivelog Mode

One of the first things anybody should do with an Oracle database is switch on Archivelog mode. There is not really any good reason to run with Archivelog switched off (especially in a production environment). I’ve never had a problem with this before but with Oracle XE I couldn’t get the SQLPlus command line client to work as expected. After consulting the instructions I was doing what was expected but no luck. In the end I had to logon from the windows Command Shell as such:

        c:\>sqlplus /nolog

        SQL>connect sys/letmein@ as sysdba

I was then able to do the following to enable archivelog mode:

        SQL>shutdown immediate;
        SQL>startup mount;
        SQL>alter database archivelog;
        SQL>alter database open;

and that was that sorted.

Customer Tables

For my customer table designs I have a main customer table and a few additional tables that hold extra information such as bank details, notes, addresses etc. It is normalised but not to an excessive extent, 3NF give or take :-) A screenshot is shown below: (The diagram comes from Application Express and is pretty bad as it doesn’t even show the direction of the links. Anybody know any good diagramming software for Oracle ?)


That’s it for a week or so, vacation beckons :-) As always feel free to leave your comments and opinions.

"The radical of one century is the conservative of the next. The radical invents the views. When he has worn them out the conservative adopts them." - Mark Twain
Honest Expert Independent Technology Advice for Business

Lucky to be a Programmer

Gustavo Duarte just wrote a great post entitled: ‘Lucky to be a programmer’ It’s a good read and very true. Those of us who love what we do for a living are very lucky and just like Gustavo, I love what I do.

"Love is, above all else, the gift of oneself." - Jean Anouilh
Honest Expert Independent Technology Advice for Business

ArtenSUITE: Part 4: Primary Keys

A Development Journal
Part 4: Primary Keys

I had an email this morning from someone who asks me why I appear to be using surrogate keys rather than natural keys in my database design. A surrogate key is a key that is totally unrelated to the data in the table whereas a natural key would relate directly to the data in a table.

An example of a surrogate key:

Table: Customer
Surrogate Primary Key Value: 7878900
Customer Name Value: Bilbo Enterprises

An example of a natural key:

Table: Customer
Surrogate Primary Key Value: BILBO01
Customer Name Value: Bilbo Enterprises

One of reasons I use a surrogate key is that if Bilbo retires to Rivendell and leaves his business to Frodo, Frodo may well change the name of the company. So with a natural key the data now looks like this:

Table: Customer
Surrogate Primary Key Value: BILBO01
Customer Name Value: Frodo Enterprises

As BILBO01 is a primary key and may be related to other tables using this primary key it may not be straightforward to change. You therefore now have information that looks inconsistent, it offends my sense of order :-)

There are many advantages to natural keys (especially to do with reducing the complexity of some queries), but for me I prefer using surrogates. It’s a hotly debated subject. Research both and use what you feel comfortable with. Do everything else right and it makes no difference in the long run.

"Far and away the best prize that life offers is the chance to work hard at work worth doing." - Theodore Roosevelt
Honest Expert Independent Technology Advice for Business

Wednesday, 23 July 2008

ArtenSUITE: Part 3: Database Design

A Development Journal
Part 3: Database Design

I spent most of today working on the database structures and design issues, deciding on what conventions I will be following regarding naming, table designs etc etc.

For example, as all the modules are designed to support multi companies, I have build a foreign key into each table which links to the company record. Access to the data from within the application modules will purely be based on the context of the company you wish to work with, rather than logging into a seperate database as is commonly done. Global constants will be stored with a record linked to the company record.

I also want to support simple features that users consider necessary but are not seen often in commercial applications. An example would be allowing the same contacts record to be used against both customers and suppliers, and then allowing that contact record to be moved to another customer or supplier if the individual changes jobs. This is a common requirement but is not widely supported.

Jeff Atwood recently blogged about database structures and whilst I agree with him to a certain extent, I will say that I much prefer to start with a solid normalised database design and only denormalise wherever *absolutely* necessary. This can lead to tables that look complicated. However I believe that creating appropriate views can help the database structure become much more meaningful when it’s time to report or query the data. I also disagree that normalised databases have performance issues ... of course there are times where a normalised database will perform slower due to the joins, but on the whole the quality and reliability of the database should make up for any performance shortcomings. Besides, there is normalisation and there is normalisation. I like to think that my database designs are optimum for the type of application that I am developing.

Other decisions I made today were to do with the data storage types for the database columns. For example each table will have a primary key, this primary key will be tied to an Oracle Sequence so that it is guaranteed to be unique and not null. I will use a Number type with a scale of 14 and precision of 0 to store this value. Customer and Supplier codes will be Varchar2 12, company names and address lines will be Varchar2 50, currency values will be Number with a scale of 12 and a precision of 2.

Tables will be named PRIMARYMODULE_TYPE_SUBTYPE for example the customer address table would be named BAS_CUS_ADDR. Where BAS means that the table is primarily used and maintained within the module BASE. Primary columns will named XXX_PK, customer primary key will therefore be CUS_PK. There are lots more rules and conventions but you get the general idea :-)

An idea I have implemented here is one that I have carried over into every database design for the last 15 or so years. It is probably not necessary nowadays but - belt and braces ! I have created an additional column in every table called (for example) CUS_999. This contains a copy of the primary key. The idea here is that this can be used to rebuild the relationships between the tables if the primary key every got corrupted. This has saved my bacon several times over the years ! It can’t do any harm and disk storage is cheap.

So lots of thinking and designing today. In addition I got to play more with Oracle XE. Really, if you have never tried it you should, it’s great. It’s simple to use, has a cracking browser based interface for setting up and managing the database and it installs quickly and simply. This does not feel like ‘traditional’ Oracle. I’m very impressed.

Aside from an hour or so trying to solve my Java on Windows issue (this is a real pain, I know the solution is simple and I’m just being stupid) the only other coding I have done has been to create a properties window for ArtenBASE. This is a useful view for the main properties of the application, especially when developing. Below is a screenshot of the properties window.

That’s enough for today. Tomorrow is my last day working before my holiday (yep, another one) this time I am staying in the country so will have iPhone, MacBook Pro and Vodafone Broadband Card so although I won’t be able to get much work done I can at least answer my emails.

Feel free to comment if you have any suggestions, observations, criticisms etc :-)

"Millions long for immortality who don't know what to do with themselves on a rainy Sunday afternoon." - Susan Ertz

New Dedicated Help Desk Forum !

Ian Landsman, author of Helpspot has setup a new forum dedicated to help desk and customer support. There’s only a few members at the moment but give it your support and it could turn out to be a valuable asset. The forum is here.

"You may be disappointed if you fail, but you are doomed if you don't try." - Beverly Sills

ArtenSUITE: Part 2: Day One

A Development Journal
Part 2: Day One

So yesterday I made a start on the ArtenBASE application which will be the central ‘hub’ for the ArtenSUITE applications. Within my REALbasic project I’ve organised it into folders as such:

        Codebase (core modules and classes, db access, autoupdate etc.)
        Pictures (images)
        Forms (windows)
        Modules (application specific modules and classes)
        Menus (application menu objects)

I have a standard module called mProgramInfo that contains properties that relate to the application: build, version, author etc. I modify these and import my standard ‘About’ window which uses these values. My about window for ArtenBASE looks like this:

I’ve created the methods needed to logon to Oracle and these are called automatically when the program is opened. I am using the Java Plugin from MBS to access the Oracle database. The logon method for Oracle is shown below:

'Requires the Oracle Java Driver Resident in the Program Directory
'Requires the MBS REALbasic Java Plugin.rbx to be in the Plugins Directory of the IDE
'Requires the MBS REALbasic Main Plugin.rbx to be in the Plugins Directory of the IDE

'This Function Should be Called as Follows:

dim db as JavaDatabaseMBS
dim f as FolderItem

proDBConnector = "ojdbc14.jar"

if not f.Exists then
mCodebaseStd.DisplayStopMessage("Connector File Not Found in Application Directory ..."+EndOfLine+"Connector Name: "+proDBConnector)
end if

db=new JavaDatabaseMBS(f,"oracle.jdbc.driver.OracleDriver")
db.UserName = strUserName
db.Password = strPassWord

if db.Connect then
mProgramInfo.pDBConnectStatus = True
db.AutoCommit = FALSE
if intShowMessage=1 then
mCodebaseStd.DisplayInformationMessage("Successfully Connected to Oracle ...")
end if
mProgramInfo.pDBConnectStatus = False
mCodebaseStd.DisplayStopMessage("Could Not Connect to Oracle ..."+EndOfLine+"Error Message: "+db.ErrorString+EndOfLine+"Error Code: "+str(db.Errorcode))
end if

The first time the program is opened these methods will fail as the server logon details are undefined. With Oracle all database objects are owned by a user, in this case the user will always be ARTEN and the password will be encrypted and hard coded into the application. The Host IP and the Database Name are all that is specific to a particular environment. To define these details the preferences window is used:

Assuming the database connection was successfull the user will see the logon window. This is where they logon to the application database using a name and password stored in a (not yet created) table on the Oracle server. The logon window is shown below:

All screenshots are shown from the Mac OSX version as I am having a problem with the Java classes on Windows .... It’s one of those stupid problems I am sure and I will be glad to finally get to the bottom of it !

Anyway - that’s all folks for Day one of my new development. Today I’m going to spend some time trying to solve this Windows/Java problem and also take care of creating some of those database tables :-)

"You can't ever be really free if you admire somebody too much." - Tove Jansson

Tuesday, 22 July 2008

ArtenSUITE: Part 1: Introduction

A Development Journal
Part 1: Introduction

Most of the work I do involves custom/bespoke software development with some database and consultancy work thrown in. I’m recently decided to also develop and sell commercial software via my website at I have a couple of applications available now, a third nearly complete and a dozen or so further ideas to look at when time allows.


One of the ideas I have is to build a suite of business products that run independently or together. The main application will contain the customers, prospects, suppliers and users schema and screens as well as the other bits that can be used by the other applications. This module will be needed, and supplied with the purchase of any of the other modules. The development name for this central application is ArtenBASE.

The other modules will be specific applications such as MRP, Stock Control, CRM, Orders, Charting, Helpdesk, Mailshot, Team Management, Time Tracking, Credit Management etc. Each module will be multi-company and where financial information is used, multi-currency with consolidation available at several levels.

I can also use ArtenBASE as a starting point for many of my custom developments with the advantage to me of development speed and proven reliability and the advantage to the customer of development speed and access to the other modules.

These will not be huge complicated applications. I will be focusing on providing easy to use and reliable software without too much complexity. I’m not trying to write SAP. An IT Department will not be needed to support my software. Each module will have a set of clearly defined interfaces so that additional functionality can be build separately, should it be needed. Should anybody else want to build software that interfaces to mine then the API will be made available.


I would like this application to run on both the Windows platforms and Mac OSX. I have therefore chosen REALbasic as my development environment. For my back end database I have chosen Oracle. Oracle XE is FOC and when/if the customer outgrows it’s (disk and Memory) limitations there is a seamless transition (for a fair exchange of money) to the higher end Oracle editions. I have many years experience of Oracle, having written a full Financial Accounting System / MRP System etc. in the past which was based on Oracle 8i. The newer versions of Oracle are so much better and I look forward to getting to know them better.


Standard reports will be built into each individual module. The SQL used to generate the reports will be made available so that enhanced reports can be created using a standard SQL Query tool, or ArtenQUERY (available soon) can be used.

Data Access

I am tempted to use stored procedures for the majority of database access. The downside to this is that it will make the software more difficult to port to another database system in the future. I don’t expect to port it, but you never know ! I have yet to make my final decision on this.


This development will be happening alongside my other work and personal commitments. I would therefore, tentatively, hope to have version 1.0 of ArtenBASE available within a few weeks and by Christmas I would like to have 2 or 3 more modules available.

Why Tell the World?

Why Not ? This blog will help me by providing a mechanism for me to monitor my progress and thoughts. I don’t imagine anybody is going to read this and suddenly decide to drop their own plans and try and emulate my ideas ! There are many good ideas but they are not profitable until executed. I intend to pursue this and develop a suite of products that can compete on their own merits. Besides, I don’t intend to tell *everything* :-)

I’m going to continue to blog about my experiences as I undertake this development. Hopefully someone will find it interesting and / or useful :-)

"You don't need to outdo the competition. It's expensive and defensive. Underdo your competition. We need more simplicity and clarity." - Jason Fried

New Free Download @ Arten Science: ArtenKRYPT

I’ve uploaded a small application to the Free Software section of my website.

ArtenKRYPT is an application that allows you to Decrypt messages that have been encoded using a secret key that you have shared with one or more individuals. You can also Encrypt a message from within ArtenKRYPT.

It is extremely simple to use and very secure. When you have encrypted your message just paste the encrypted message into an email program and send. To decrypt a message just paste in the encrypted message, enter the secret key and press ‘Decrypt’.

To install, just expand the zip file and drag the file onto your hard drive.

Note: A 16 Character secret key is recommended for maximum security.
Note 2: The .NET Framework Version 2 must be installed for ArtenKrypt to execute.

"You have got to discover you, what you do, and trust it." - Barbra Streisand

Monday, 21 July 2008

New Free Download at Arten Science: BigTime

I’ve uploaded a small application to the Free Software section of my website. BigTime displays a large digital clock on your screen. That’s it. BigTime will remember it’s screen location the next time it is opened. It is available for Windows, Mac OSX and Linux. Enjoy :-)

"There are two kinds of men who never amount to much: those who cannot do what they are told and those who can do nothing else." - Cyrus H Curtis

Saturday, 19 July 2008

More Oracle and REALBasic using MBS and Java

I have managed to get REALbasic talking to Oracle via the Java classes enabled by the MBS Java Plug In.

It was quite straightforward in the end, the code is shown below:

'Requires the Oracle Java Driver Resident in the Program Directory
'Requires the MBS REALbasic Java Plugin.rbx to be in the Plugins Directory
'Requires the MBS REALbasic Main Plugin.rbx to be in the Plugins Directory

'This Function Should be Called as Follows:

dim j as JavaDatabaseMBS
dim r as JavaRecordSetMBS
dim f as FolderItem


j=new JavaDatabaseMBS(f,"oracle.jdbc.driver.OracleDriver")
j.UserName = strUserName
j.Password = strPassWord

if j.Connect then
mCodebaseStd.DisplayInformationMessage("Successfully Connected to Oracle ...")
mCodebaseStd.DisplayStopMessage("Could Not Connect to Oracle ..."+EndOfLine+"Error Message: "+j.ErrorString+EndOfLine+"Error Code: "+str(j.Errorcode))
end i

The Oracle Java driver can be found in the /jdbc/lib directory of your ORACLE installation. This can be copied, and I have put it in the client application directory. The MBS Plugins need to be inside the Plugins directory of your REALbasic installation. The comments at the top of the method show how this method should be called to get a successful connection to Oracle, three parameters are needed, ORACLESID, UserName and Password.

The methods referred to when j.Connect is called are my own custom methods for displaying dialogs to the screen. They can be replaced by standard MsgBox calls.

My next challenge is seeing how powerful and reliable it is to access Oracle from REALbasic using these classes and Plug Ins :-)

"If you limit your choices only to what seems possible or reasonable, you disconnect yourself from what you truly want, and all that is left is a compromise." - Robert Fritz
Honest Expert Independent Technology Advice for Business

Oracle / REALBasic / Java Classes Etc.

I’ve been looking into the best database to use for a commercial product that I’m planning. As it stands I’ve settled on Oracle. My reasons are as follow:

I know how to use Oracle (a *good* starting point !).
The XE Edition is limited, but free and makes a good starter database for smaller systems.
Development against XE works identically against the bigger versions if an upgrade becomes necessary later.
Oracle is stable and extremely reliable.
Oracle can be installed on multiple Operating Systems.

The next choice is what to use to develop the front end software. I am very keen on writing software that works on multiple platforms, Windows and Mac OSX primarily, although I do support Linux wherever possible.

For the kind of software I want to write I don’t want it to be browser based. I know it’s the ‘in thing’ but still the *vast majority* of software is written for the desktop and I much prefer desktop based software myself. I don’t see it going away any time soon.

For cross platform based development there are a few choices, however by far the easiest and most straightforward is REALbasic from REAL Software. It has it’s limitations, but in it’s favour I can develop on the Mac and deploy to both Windows and Linux. In addition there is none of the extra hassle of needing the .NET Framework installed on Windows. One company, MonkeyBread Software from Germany seem to have built their business on providing ‘Plug Ins’ for REALbasic to enhance the capabilities of the development environment. It was to them I had to turn for a solution to connecting to Oracle from REALbasic.

REALBasic comes with an Oracle Plug In, however due to Oracle taking around 2 years to provide an Intel based driver for the Mac, the standard REALbasic Plug In does not now work (at least on Mac OSX). I’m sure they will remedy this at some point. In the meantime I have downloaded and been playing with the MonkeyBread Software ‘Java Plug In’. This allows the Java driver and Java classes to used from within REALbasic to access databases that cannot be connected to from REALbasic.

If all works as expected I will be sending MonkeyBread my credit card number for the 40 Euros or so they charge for the Plug In :-)

"We are all here for a spell; get all the good laughs you can." - Will Rogers

Friday, 18 July 2008

30 Day Challenge is Stupid - NOT !

Ian Landsman wrote a post on how he thinks the ‘30 Day Challenge’ is a stupid idea. I follow Ian’s blog and I respect his opinion but I think he missed the point on this one. It provoked a few responses, my own response is shown below:

I think 30 days is plenty of time to do plenty of things :-) Nobody expects that the 30 days is the end of the work, it's really the beginning of making a *product* but it can be plenty of time to create a *program*. It depends on what the program needs to do - customers want a solution and as long as your product provides enough of a solution for the money you are asking then it doesn't matter if it took 3 days, 30 days or 3 years.

When creating bespoke software solutions 30 days is a *big* job (for me anyway) and would be extremely expensive for the customer. Programs taking 1-2 weeks are more the norm for me. I admit this is vastly different to creating a *product* but the coding element is similar. I think thats what the 30 Day thing was about - the coding.

Besides, it was a fun exercise and well worth doing :-(

Wednesday, 16 July 2008

GENeSYS Documents

Since I merged GENeSYS Solutions with Arten Science I have had several emails asking me how to get hold of a couple of documents that used to be hosted on GENeSYS Solutions. I assume somebody had linked to the old address somewhere. The documents can now be found at the following links:

Oracle 10g Database Admin 1 Exam Cram / Study Guide


Securing the Network, for the Non Technical

"I live now on borrowed time, waiting in the anteroom for the summons that will inevitably come. And then - I go on to the next thing, whatever it is. One doesn't luckily have to bother about that." - Agatha Christie

Friday, 4 July 2008

Online Store :-)

It’s took a little more than 30 days but my product is now available to buy from my online store. It can be accessed from my purchasing page. I’ve gone with Kagi for the store after doing a fair bit of research on the web. The fees are quite high though hence I offer a discount to customers who pay by UK Cheque or Bank Transfer. There is also a US$15 fee for wiring over the money each month.

It’s time to wind down a bit now. I’ve just written a cross platform image viewer for one of my other products, ArtenScan, and once I’ve documented it, uploaded it, put screenshots on my site etc. etc. etc. that’s all I’m doing before I take a break for a week, doing a Mediterranean Cruise. When I get back it’s onto Marketing and SEO ...

In my absence I have somebody preparing and sending a mailshot so that when I get back I can chase up the letters via a phone call. How much fun is that :-(

Anyway - I hope everybody else is doing OK with their products - I’ll be following the feed on my iPhone while I’m away on so keep on blogging :-)

Tuesday, 1 July 2008

30 Day Sprint -1

I have added screenshots of my products on my website today, added a Customer Loyalty Program and made other assorted enhancements. Beyond that not a lot to report really, although I have just received an email from an ex-colleague who has been talking to someone who is apparently interested in ‘selling on’ my SMSRelay product.

He is suggesting that it may be better to offer the product with bundled texts and make money off the texts as well - it’s an idea I have played around with but am not particularly comfortable with at the moment - nevertheless we are going to setup a meeting and see if there is mutually beneficial business to be done :-)

I have a holiday coming up and two custom developments to code during July as well as marketing ... July could be busier than June !

End of Experiment

mmm. So that went down like a lead ballon ! A couple of comments on my blog entry and a dozen or so emails and unanimously - you all hated it.

So the ‘speech bubbles’ are gone and I’ve generally tidied up the home page and also adopted the ‘logo in the top left’ idea mentioned by Richie amongst others.

Thanks for all your feedback, it is *much* appreciated. The redesigned home page is up and I think it now looks much better :-)

I think the following quotation is appropriate, considering my recent experiment :-)

"One remembers horrors, I think, for the rest of one's life, but memories do not always remain so sharp, and with time, and new circumstance, do not affect us so powerfully." - Elizabeth Aston