19 April 2011

How to throw away US$7.4B

On 15 April 2011, Oracle announced that it would turn OpenOffice.org into a community only project, and that a commercial version would not be distributed.


Larry Ellison used to make pretty smart decisions.

Sun's hardware was high end. High Performance machines that are almost at the bleeding edge of computer research.  There are few customers in this area, and they are both price conscious, and task conscious.  For sheer number crunching, a Beowulf cluster of PS3s is more cost effective.  OTOH, when you need to store several petabits of data, Sun's hardware was more cost effective.  This is hardware that geeks  dream about, but usually don't have as their home server, much less personal desktop system.

By not including drivers that hooked directly into the products that Oracle distributes, Oracle failed to provide its customers with a reason for migrating from Microsoft Office to Oracle Office.


More pointedly, Oracle sales people could have thrown in a gratis copy of Oracle Office with each seat license that was negotiated.

When Oracle bought Sun, it acquired a company with:
* A hardware division;
* An operating system that had a very dedicated user base;
* An office suite that had a large and dedicated user base;
* A programming language that is extensively used;

These are things that Oracle could have used to cut off Microsoft's oxygen supply from the  high end market side.  FLOSS, especially Linux and OOo were cutting off Microsoft's oxygen supply from the low end market. (Look at Microsoft's SEC filings, to see how precarious Microsoft's financial picture really is.)


The community base of the operating system abandoned Oracle, once it became clear that Oracle and communication were exclusively mutual concepts.

The community base of the office suite abandoned Oracle, once it became clear that Oracle could neither communicate, nor manage anything.

Then Oracle sued Google over Android and Java.  A clear demonstration that it does not grok the fundamentals of computer programming.

You have to look at Oracle and wonder:  "What is it thinking?"  Intrinisically, purchasing Sun was a good decision. However, every step Oracle took, seemed designed to maximize the amount of money, and goodwill that could be thrown away.  Not just the US$7.4B it spent on Sun, but both post-acquisition costs and pre-acquisition costs.  It also threw away all of the goodwill it purchased from Sun. Based on its own merits, Oracle has had no customer goodwill for more than a decade.

The 15 April announcement is merely Oracle's admission that they threw away everything that they purchased from Sun.

08 January 2011

Resene Paint SOC

I threw up the Resene Paint Colour Palette from circa 2005 at http://toki-kantoor.pastebin.com/jYJ4230B .

Roughly half a dozen colours are missing.  For some reason, they were not archived, and since Resene Paints no longer seems to use them, I can't determine what those colours are.  :(

Standard second line

Sometimes I run into difficulties with pastebin not accepting URLS in the xml markup.

When that happens, I will write

<code>
<!-- replace with usual second line -->
</code>

The usual second line is the following.

<code>


<ooo:color-table xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:xlink="replacement # 1"
" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ooo="http://openoffice.org/2004/office"  >

</code>

10 November 2010

The United Colours of Libre: Take Two

I took a quick look at http://wiki.documentfoundation.org/Marketing/Branding#Colors earlier today, and discovered that the Colour palette has changed.

One change for the better, is that Libre Maroon has been changed to Libre Orange.

The color palette can be downloaded from http://toki-kantoor.pastebin.com/AXTzeUpe

09 November 2010

The ultimate colour palette for LibreOffice

Back in 2004, one of the complaints about OpenOffice.org was that it's colour palette was too small. I wrote the following python script, to address that issue.

The resulting colour palette requires roughly one gigabyte of disk space.

#### code starts here ###
#!usr/bin/python
import sys, string

def bump_case(bump_string, bump_direction):
bump_string, atribute_data = clean_string(bump_string, bump_direction)
if atribute_data == "string":
return_string = bump_string
elif atribute_data == "unknown":
bump_string = bump_string[0]
bump_string = convert_unknown_to_string(bump_string)
elif atribute_data == "integer":
return_string = convert_integer_to_string(bump_string)
else:
print " bump_case(bump_string, bump_direction) can not process the following "
print bump_string
print " as it is not a string "
print " It appears to be the following: ", atribute_data
return return_string

def convert_integer_to_string( integer_string ):
integer_string = str(integer_string)
checkpoint = len(integer_string)
return_string, attribute_type = clean_string(integer_string)
return return_string

def convert_unknown_to_string( unknown_string ):
some_string = unknown_string[0]
return_string, attribute_type = clean_string(some_string, "lower" )
return return_string

def clean_string(some_string, bump_direction):
try:
check = len(some_string)
new_string = string.strip ( some_string )
direction_check = string.lower(bump_direction)
if direction_check == "upper":
check_string = string.upper ( new_string)
else:
check_string = string.lower ( new_string )
attribute_type = "string"
except TypeError:
try:
check_string = int(some_string)
attribute_type = "integer"
except:
print "Unknown Error at clean string"
print some_string
print "This is neither a string, nor an integer"
attribute_type = "unknown"
check_string = some_string

def true_false(message_string):
is_valid = "false"
while is_valid == "false":
print_headline(message_string)
print ( 'If this is correct, type "yes". ' )
# , otherwise type "no". ')
temp_string = raw_input()
temp_string = string.strip(temp_string)
temp_string = string.lower(temp_string)
if temp_string in [ "yes", "true", "0", "+", "ja", "y", "good", "g" ]:
check_point = "true"
is_valid = "true"
elif temp_string in [ "no", "false", "1", "-", "nie", "n", "bad", "b" ]:
check_point = "false"
is_valid = "true"
else:
is_valid = "false"
return check_point

def read_input_data( message_string, validation_string ):
check_point = "false"
while check_point == "false":
clear_screen ( 5 )
print message_string
input_string = raw_input()
input_string = string.strip(input_string)
temp_string = ( validation_string + " " + input_string )
check_point = true_false( temp_string )
return input_string

def in_range( check_this_number, low_number, high_number ):
check_this_number = abs(check_this_number)
if check_this_number > high_number:
check_this_number = check_this_number / high_number
if check_this_number < low_number:
check_this_number = check_this_number + high_number
return check_this_number

# file read / write functions

def get_lines_of_file(var_which_file):
check_the_file = (var_which_file, "lower")
try:
input_file_handle = open(check_this_file , "r")
data = input_file_handle.readlines()
break_line_count = len(data)
except:
break_line_count = 0
return break_line_count

def print_a_file(var_which_file, file_suffix, temp_line):
check_point = string.strip(file_suffix)
if check_point == "":
file_suffix = "data"
check_point = string.strip(var_which_file)
if check_point == "":
var_which_file = "default"
file_name = validate_file_name ( var_which_file, file_suffix )
print_to_this_file = file_name
write_line = string.strip(str(temp_line))
data_check = convert_unknown_to_string(print_to_this_file)
print_to_this_file = data_check
check_point = len(write_line)
if check_point > 1:
line_count = get_lines_of_file(print_to_this_file)
if line_count > 0 :
kountry_datafile = open(print_to_this_file, "w")
kountry_datafile.write(write_line + "\n")
kountry_datafile.close()
kounter = 1
else:
kountry_datafile = open(print_to_this_file, "a")
kountry_datafile.write(write_line + "\n")
kountry_datafile.close()
kounter = 0
else:
kounter = 0
return kounter

def validate_file_name( file_prefix, file_suffix ):
file_prefix = clean_string(file_prefix, "lower")
file_suffix = clean_string(file_suffix, "lower")
if len(file_prefix) > 8:
file_prefix = file_prefix[0:7]
if len(file_suffix) > 4:
file_suffix = file_suffix[0:3]
dot = "."
file_suffix = (dot, file_suffix )
return_name = ( file_prefix + file_suffix )
return return_name

def grab_a_file(var_which_file, file_suffix):
file_name = validate_file_name ( var_which_file, file_suffix )
print_to_this_file = file_name
print
print
line_count = get_lines_of_file(print_to_this_file)
if line_count > 0 :
data = open(print_this_file, "r")
datum = data.readlines()
check = len(datum)
if check < line_count:
print " File length mismatch "
elif check > line_count:
print " File length mismatch "
else:
print "file has zero or less lines in it"
print line_count, " is the line_length"
print print_to_this_file
datum = ""
return datum

def initialize_data(size_of_data_field):
initialized_number = -11111
return_list = [ initialized_number ] * size_of_data_field
return return_list


def delete_blanks(check_string):
working_string = string.strip(check_string)
data_length = len(working_string)
date_length = int(data_length)
new_string = " "
for s_checking in range (0, data_length):
am_on = s_checking
s_data = working_string[am_on]
if s_data <> " ":
new_string = (new_string + s_data)
new_string = string.strip(new_string)
return new_string

#
# main sequence starts here
#

def create_hexadecimal_palette(checking_data):
output_file = "ultimate_color_palette.soc"
data_range_2_is = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]
palette_string_1 = ''
for first_data in data_range_2_is:
for second_data in data_range_2_is:
for third_data in data_range_2_is:
for fourth_data in data_range_2_is:
for fifth_data in data_range_2_is:
for sixth_data in data_range_2_is:
check_1 = first_data
check_2 = second_data
check_3 = third_data
check_4 = fourth_data
check_5 = fifth_data
check_6 = sixth_data
temp_string = (check_1 + check_2 + check_3 + check_4 + check_5 + check_6)
check_string = (palette_string_1 + temp_string + palette_string_2 + temp_string + palette_string_3)
check_point = print_a_file ( output_file, "data", check_string)
print check_string
return check_point

checking_data = "junk string"
checkpoint = print_a_file ("start_time", "data", checking_data)
b_color = create_hexadecimal_palette(checking_data)
print b_check_data
checkpoint = print_a_file ("end_time", "data", checking_data)
print "The End"
### code ends here ###

Two minor details:
  1. The contents of the file soc_head https://docs.google.com/leaf?id=1sqTcJuFxh8kmZcvBbSrmMWyiTSwVtaF_uFtewVbXfU0&sort=name&layout=list&num=50 needs to be added to the beginning of the file that the script creates;
  2. The contents of the file soc_base https://docs.google.com/leaf?id=1LIkr1-YGFMCIzaM0gNMpL7rajeBMU6Jhe6_5quKKtrQ&sort=name&layout=list&num=50 needs to be added to the end of the file that the script creates;
Finally, Blogger mangled the code written here almost beyond usability. https://docs.google.com/leaf?id=1VjbFsfES_Lgy4HGysyEHuLilocn8W5DYZBds-7Z_1wI&sort=name&layout=list&num=50 has the code, albeit mangled somewhat differently than was done here.

03 November 2010

A Short List of A11Y Requirements

A Short List of A11Y requirements.
  • All input can be done by voice;
  • All input can be done by a joystick;
  • All input can be done by a Perkins Keyboard;
  • All input can be done by a mouse;
  • All input can be done using an 78 key keyboard;
  • All input can be done on a touchpad;
  • All input can be done using a virtual keyboard;
The program has to be able to accept simultaneous input from all of those devices, to be A11Y compliant;
  • All output can be read on a Braille display monitor;
  • All output is in an audio format;
  • All output can be read on either a CRT or LCD monitor;
  • All output can be felt on a touchpad;
The program has to be able to simultaneously output to all of those devices, to be A11Y compliant;
  • The display size of the data that is presented to them:
  • This includes screen magnification on CRT or LCD monitors;
  • This includes screen magnification on touchpads;
  • This includes all tactile devices;
The user must be able to change:
# The display size of the data that is presented to them:
  • This includes screen magnification on CRT or LCD monitors;
  • This includes screen magnification on touchpads;
  • This includes all tactile devices;
# The audio volume of the data that is presented to them:
  • This includes screen readers;
  • This includes self-voicing functionality;
  • This includes all audio output devices;
# The colours that are used:
  • Icons must be changeable both individually, and as a group;
  • Colours used anywhere in the program must be user changeable;
The program must be able to print to:
  • A Moon Printer;
  • An audio file;
  • A Braille printer;
  • A "normal" printer:
The latter includes, but is not limited to:
  • Ink jet printer;
  • Dot matrix printer;
  • Laser printer;
  • Thermal ink printer;
In an ideal world, the user could select any of those, and the program would automatically print out the data on the requested printer, without any more user intervention.

There is an extension that tries to do output to Braille. The major issue with it, is that it only works for one or two languages.

I have read about an extension that outputs a text document to mp3 format. I do not know how far it progressed.

Arguably, A11Y also requires the program to be able to print out the following file formats:
# Plain text:
  • ANSI/ASCII;
  • UTF-8;
  • UTF-16;
  • UTF-32;
  • Other common plain text character encodings;
# eBook file formats:
  • PDF;
  • Postscript;
  • Mobi;
  • ePub;
  • HTML 5.0;
  • DAISY;
  • DjVu;
  • AZW (Kindle);
  • PDB (eReader);
  • Other common eBook file formats;
# Graphical file formats:
  • PNG;
  • SVG;
  • JPEG;
  • GIF;
  • Other common graphical file formats;
This does not mean the ability to create a picture, but rather to export a text file as a graphical image.

# Audio file formats:
  • OGG;
  • WAV;
  • MP3;
  • MP4;
  • WMA;
  • MPC;
  • FLAC;
  • AIFF;
  • VOX;
  • AU;
  • Other common audio file formats;
This does not mean the ability to create or edit audio files, but rather the ability to export a text file in an audio format. IOW, a self-voicing application that can output the data in an audio file format.

I think that most of these could be done as extensions that the user installs, if they want/need/require the specific output capability. Some of these, involve file formats that are patented, trademarked, under copyright, or otherwise blemished.