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.
19 April 2011
11 February 2011
LibreOffice Extensions
Just a couple of URLs for where to obtain LibreOffice Extensions:
German: http://wiki.documentfoundation.org/DE/LibreOffice-Box_Extensions
French: http://wiki.documentfoundation.org/FR/LibreOffice-Box_Extensions
English: http://libreplanet.org/wiki/Group:OpenOfficeExtensions/List is for OpenOffice.org. Most of those extensions also work for LibreOffice.
German: http://wiki.documentfoundation.org/DE/LibreOffice-Box_Extensions
French: http://wiki.documentfoundation.org/FR/LibreOffice-Box_Extensions
English: http://libreplanet.org/wiki/Group:OpenOfficeExtensions/List is for OpenOffice.org. Most of those extensions also work for LibreOffice.
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. :(
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. :(
Labels:
color,
colour,
palette,
Resene Paint,
soc
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>
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
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:
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
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:
- 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;
- 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;
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;
- 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 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 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;
- This includes screen readers;
- This includes self-voicing functionality;
- This includes all audio output devices;
- Icons must be changeable both individually, and as a group;
- Colours used anywhere in the program must be user changeable;
- A Moon Printer;
- An audio file;
- A Braille printer;
- A "normal" printer:
- Ink jet printer;
- Dot matrix printer;
- Laser printer;
- Thermal ink printer;
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;
- PDF;
- Postscript;
- Mobi;
- ePub;
- HTML 5.0;
- DAISY;
- DjVu;
- AZW (Kindle);
- PDB (eReader);
- Other common eBook file formats;
- PNG;
- SVG;
- JPEG;
- GIF;
- Other common graphical file formats;
# Audio file formats:
- OGG;
- WAV;
- MP3;
- MP4;
- WMA;
- MPC;
- FLAC;
- AIFF;
- VOX;
- AU;
- Other common audio file formats;
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.
Subscribe to:
Posts (Atom)