text:
Phenylephrine is used for the temporary relief of stuffy nose, sinus, and ear symptoms caused by the common cold, flu, allergies, or other breathing illnesses (e.g., sinusitis, bronchitis). This medication works by decreasing swelling in the nose and ears, thereby lessening discomfort and making it easier to breathe.
Cough-and-cold products have not been shown to be safe or effective in children younger than 6 years. Therefore, do not use this product to treat cold symptoms in children younger than 6 years unless specifically directed by the doctor. Some products (such as long-acting tablets/capsules) are not recommended for use in children younger than 12 years. Ask your doctor or pharmacist for more details about using your product safely.
These products do not cure or shorten the length of the common cold and may cause serious side effects. To decrease the risk for serious side effects, carefully follow all dosage directions. Do not use this product to make a child sleepy. Do not give other cough-and-cold medication that might contain the same or similar ingredients (see also Drug Interactions section). Ask the doctor or pharmacist about other ways to relieve cough and cold symptoms (such as drinking enough fluids, using a humidifier or saline nose drops/spray).
Lowest Prices
Get the lowest prices on generic medications.
Private and secure
Your privacy is always protected and your information is secure.
Prescriptions made easy
We work with your doctor or local pharmacist to take care of transfers, refill requests, and more.
Support Hours:
Monday - Friday 8am - 9pm ET
Saturdays 9am - 5pm ET


text:
I normally don't like to reblog things, but this essay is great. Found via DRINKINANDDRONIN. Much respect.
By G. Bruce Boyer
When I was growing up back in the late 1950s, the matter of dress for young men was relatively simple. When a boy reached adolescence he would put away much of his childhood wardrobe – whatever that might have been – and begin to wear a basic outfit that would see him through the college years and beyond. It was a time before the designer revolution in menswear, before the Ralph Laurens and Versaces, the Armanis and Paul Smiths, the Dolces and the Gabannas. A simpler time.
It was a time when there were basically three types of clothing stores. There was of course the traditional store for the traditional American business look: conservatively cut suits, safe shirts (the majority of which were white, with one or two collar styles), and discreet foulard or striped neckwear. Then there was the somewhat "sharper" store, a more courant version of the trad store, more upscale, hipper, more for the man who was known for caring about style. In the late '50s this store took on a bit of European flair. The clothing was called "Continental", meaning Italian, to distinguish it from British. There had been a tradition of British clothing here, but the Italian thing was new.
Finally there was the Ivy League shop.
Called "Ivy League" or "campus" shop because the style had originated, evolved, and took it's strength from the prestigious Eastern Establishment universities. After World War II young men of growing middle class means attended these institutions of higher learning in droves on the G.I. Bill of economic assistance. What they found was that they could construct a basic campus wardrobe without a great deal of money and effort. There was high serviceability and low maintenance to the college wardrobe of the day.
The basic items were the oxford cloth buttondown shirt and cotton twill khaki trousers. Six shirts, three white and three blue, and two or three pair of khakis would do the job. In cooler weather, a Shetland crewneck sweater in any color was added. A pair of brown penny loafers and white tennis sneakers (possibly a pair of white or tan buckskin oxfords) constituted the acceptable range of footwear.
For outerwear, a cotton gabardine balmacaan raincoat (always tan), and a stout duffel coat (in tan or navy) were all that were needed, although many men also had a cotton gab golf jacket, also in tan. Mountain climbing parkas, safari jackets, trout fishing coats, barn coats, and equestrian slickers were all thought of as exotic sportswear.
Everyone had a tweed sports jacket (Harris or Shetland) and/or a navy single-breasted blazer for semi-dress, and a gray flannel suit for dress. Summer semi-formality was assured with a seersucker or tan poplin suit; some had madras sports jackets; for the more formal occasions a dark Grey or navy tropical worsted suit. A half-dozen ties (regimentals, foulards, or dots), and the necessary complement of underwear, socks, pajamas, and handkerchiefs filled out the basics.
Cut, fit, and quality were what was important. If it was all properly fitted, of the acceptable cut, and made well, these items would do a young man proud, no matter where he was going, or what the occasion, from a faculty tea to a classy dance.
And it wasn't a matter of being simply less sophisticated either. There were intricacies of cut and quality to these basic garments that belied their straight-forwardness. Good jackets, for example, were always three-button and natural-shouldered, softly constructed in the chest and cut on the easy side. Lapels extended about a third of the way to the shoulder line, and aficionados were quick to note the hook vent in the rear. Trousers were also cut easy, just this side of baggy. Everything, needless to say, shouldn't look too new. Quality used to imply longevity in those days. Raincoats, khakis, shoes, and tweeds were all expected to be slightly scuffed and rumpled. A soft patina of age was desirable, and total effect should be rather a studied nonchalance. An old money sprezzatura was the style.
Those dozen garments or so weren't the be-all and end-all, of course. There were myriad other attractions for the dandies amongst us. Silk knit ties (plain black or navy was best, with square-cut ends) and paisley pocket squares, odd flannel trousers, broadcloth tab-collar shirts, cordovan brogues and scotchgrain wingtips, navy worsted pinstripes with vests, white duck trousers for summer, and lambswool turtlenecks for winter. The sophisticated young man may have splurged for a camelhair polo coat. Everyone seemed to have colorfully striped surcingle belts with brass horseshoe-shaped buckles. And the brightest Argyle socks.
For most, the subtleties of double-breasted jackets and grenadine neckwear, of suede town shoes, enameled cuff links, covert cloth chesterfields, and cashmere cabled hosiery were not imaginable. But then neither were exterior logos, Italian designers, or microfibers.
There also didn't seem to be the questions of what to wear when. We certainly knew when the occasion called for a tie, and gym clothes were confined to the gym.
It was, as I say, a simpler time.

subset: commoncrawl


text:
Ein Produkt wurde in den Warenkorb gelegt.
Product successfully added to your shopping cart
There are 0 items in your cart. There is 1 item in your cart.
CategoriesClothing with inscriptions
Clothing with inscriptions Basecap Beanies Hook & loop badges Long Sleeve Others Reflective vests Short Sleeve With hook and loopCut Protection Men / Unisex
Men / Unisex Boxershorts & Underwear Headdress Hoodies Jackets Jumpsuits & Other Long sleeve Pants Polo shirts reflective vests & armlets Shirts & ties Short sleeve Shorts Sleeveless shirts Socks Training / Sports VestsMerino Clothes Oversize Shop
Oversize Shop belt gloves Head jacket / vest long sleeve Pants protective vest shoes short sleeve underwearWomen
Women Damenschuhe und Damenstiefel Gloves Jackets Long sleeve Pants Short sleeve Sleeveless Underwear
Under Armour® Mens UA Enduro Cargo Pants
Special price 69,90 €
To product
Art.: UA1316927001-3032
CategoriesArmlets Balaclavas & berets Baseballcaps Beanie COP® Merchandise Eyewear
Eyewear Accessories Ballistic glasses SunglassesHook & loop badges Inscriptions Multi function scarfs Wallets Watch Straps Watches
COP® Document Organizer
Special price 34,90 €
To product
Art.: 21906
MAGNUM® "Lynx Liberty" SideZip Womens
Special price 109,90 €
To product
Art.: 810063-36
CategoriesAccessories Allround gloves Boxing Gloves gloves with all-around cut - protection gloves with all-around cut and needle protection gloves with partial cut protection Latex Gloves Tactical Gloves Winter Gloves
COP® SGX22 TS Glove 2nd choice
Special price 29,90 €
To product
Art.: 320SGX22TS2W-L
CategoriesBackpacks Equipment-/Sportbags First Aid Bag & Packs Gun and rifle cases and bags Hard Case Hip bags Notebook & Organizer Other Shoulder Bags Small Bags
COP® M101 Molle Organizer, big, Cordura®
Special price 19,90 €
To product
Art.: 29M101-G
CategoriesEquipment Mounting
Equipment Mounting Carabiner Key Holders Lanyard Multi purpose bag Otheraccessories & service part
accessories & service part adapter Additional Fuses Beltloop leg shroud & harness Quick Locking System (QLS) SpacerAccessory holsters
Accessory holsters Baton Holsters Cop Modular System Flashlight Holsters Glove Holsters Hand/-Footcuff Holsters Knife Holsters & Tool Holsters Light Pouch magazin pouch Metal Dectector Holsters Radio Set Holsters Shoulder bag & Hip Bag Holsters Smartphone Holder Speedloader Holster Sprayholster Stun Gun/Taser Holsters UniversalholstersGun holsters
Gun holsters accessories & service part Concealment Holsters Duty Holsters Holster Red Dot Sight (RDS) IWB and Ankle Holsters Laser & Lighting system holsters Paddleholster Shoulder bag/Hip bag holsters Shoulder Holsters Tact. holster others Tact. holsters for light/laser Tactical Holsters Taser - HolsterHook-and-loop Holsters MOLLE
MOLLE MOLLE Adapter Plate Molle Handcuff Holster Molle Handy & Radio Holder Molle Holster for Tonfa Molle kleine universal Holster Molle Magazin Pouch Molle Mounting Molle Universal BagsTac Holster for Equipment
COP® M101 Molle Organizer, big, Cordura®
Special price 19,90 €
To product
Art.: 29M101-G
COP® 9931 padded middle belt with hook fastener 2.0, Cordura® 2nd choice
Special price 19,90 €
To product
Art.: 219931S2W-L
CategoriesBallistic Vest Carrier ballistic vest Protection plates Protective helmets & visors Stab protection vests Tactical Vest Tactical Vests Tasmanian Tiger ZP Series
SAFARILAND® Concealable ballistic/stab vest AP0277 US NIJ IIIA, STANAG 2920-3
Special price 799,90 €
To product
Art.: 9-AP0277-MR
Categorieshearing protection Protecting gear
Protecting gear Ballistics Protective eyewear Protectors ShieldRespirators Self Defence
Self Defence Expandable batons Kubotan Other Pepper spray Protective Vest Stun gunsTraining equipment
Training equipment Contact suits/-bags & spares Other Training batons Training knives Training weapons Trainingshandfesseln
SAFARILAND® Concealable ballistic/stab vest AP0277 US NIJ IIIA, STANAG 2920-3
Special price 799,90 €
To product
Art.: 9-AP0277-MR
CategoriesFlashlight Accessories Flashlight Holsters Head Lamp LED flashlights miltifuctional lights penlight power supply Signal Lights
COP Speras Flashlight - EST 2.0 - and Holder 1407
Special price 65,90 €
To product
Art.: SPE-EST221407
CategoriesCutter Handcuff Holsters Handcuffs with chain Key Leg cuffs prisoner transport / other Rigid & joint handcuffs Textile & plastic handcuffs Training cuffs
COP® 11P Handcuff Key
Special price 5,90 €
To product
Art.: 310 ZT12P
CategoriesBatons Binoculars Camping Car Equipment Combo´s and Saver Packs Competition Drinking bottles and dishes Equipment for K9 (dog) units First Aid Forensics
Information about prices/notes
All prices incl. vat shipping extra, see »Shipping rates !
1 SP: The sales price (SP) is valid for all customers who are not eligible to receive the special sales price.
2 SSP: special sales price (SSP) - for domestic and foreign country customers (proof obligatory) who are members of the following institutions: security and rescue services, public authorities as well as the following departments: police, justice, customs, federal police, fire brigade, search teams and military.
3 Second choice products may have optical damage, but are not restricted in functionality
4 Valid for shipments within Germany and Austria. Delivery times to other countries and information on the calculation of the delivery see here.
5 Only for authorities members (police, federal police, customs, judicial, regulatory agency)
7 With this store purchase contract is concluded
8 The crossed-out values correspond to the former seller price for the respective product. Values shown are the lowest prices for each product over the last 30 days.


text:
As advanced genomic service provider our broad technology portfolio includes: Next Generation Sequencing (Illumina MiSeq, NextSeq and HiSeq), microarrays (Illumina, Agilent and Affymetrix), digital PCR and qPCR.
IMGM is your outsourcing partner for demanding projects with a focus on Metagenomics, Biomarker Discovery, Biodistribution and Pharmacogenetics. We offer complete solutions to our customers from pharma, diagnostics, biotech and academia according to your project requirements.
Experience, motivation and a strong background in molecular genetics and medical diagnostics lie at the heart of our high quality services. At IMGM, we combine state-of-the-art technologies with complex data analysis to deliver meaningful results in an easy-to-understand format. Our clients regularly attest the IMGM project managers maximum flexibility, a strong focus on performance, as well as outstanding reporting.
For more information, please see our company brochure.
Customer satisfaction is our definition of success.


text:
Services on Demand
Related links
- Cited by Google
- Similars in Google
SA Orthopaedic Journal
On-line version ISSN 2309-8309
Print version ISSN 1681-150X
SA orthop. j. vol.10 n.2 Centurion Jan. 2011
Subspecialisation: what it does for patient care and unity in orthopaedics
While recognising the need for subspecialisation, orthopaedic associations across the globe are starting to realise its possible shortcomings with regard to patient care and unity in orthopaedics.
I am of the opinion that these two topics, namely patient care and unity in orthopaedics, are currently of some relevance in our association.
Let us look at patient care first. There is no doubt that subspecialisation is a necessary development in orthopaedics. Subspecialisation is at the forefront of research and the development of new treatment modalities for better patient care. It is therefore accepted that treatment by a subspecialist/super specialist is the best. This can only be jeopardised where teaching is skewed towards subspecialisation from the beginning of training. In some countries there are talks of decreasing the time spent as a registrar/resident in orthopaedics and increasing the time spent in fellowships. The aim is to intensify subspeciality training in order to produce excellent sub-specialists. There is no doubt that such programmes will be to the detriment of general orthopaedic training. There is a great risk for the subspecialist produced in this manner to regard his or her area of specialty as being more important than anything else. In fact, they may for example, regard the foot as being more important than the patient to whom the foot is attached. I do not see this happening in our country; we have very well balanced training in patient care as a whole. We just need to have more structured fellowship training.
What about unity in our association?
In the beginning we had one annual congress, attended by all orthopaedic surgeons, where papers from different subspecialities in orthopaedics were discussed zealously but in a truly educational manner.
Then came subspecialisation. Nature dictates that people with a common goal want to discuss their common goal. Subspeciality discussions take time, first within a congress and then later after the congress to disseminate knowledge and share research ideas within the group. This has been very good for the country in that we now have experts in all sections of orthopaedics. Unfortunately this happens at the expense of unity within the orthopaedic community. A matter of concern is that good papers in some subspecialities do not feature at our congresses. They are presented only at the subspeciality congresses. This decreases the educational value of our congresses for the registrar and the general orthopaedic surgeon.
We need an association that can champion the training of the general orthopaedic surgeon in the country. This cannot be done without the subgroups. It can only be achieved by a united orthopaedic fraternity. In the eyes of the public we are all orthopaedic surgeons (unless you live in the bigger cities where the public recognises, for example, hip surgeons, etc.). In the eyes of the government we are all orthopaedic surgeons, and this is the speciality that the HPCSA registers. It does not register us as a spine surgeon or shoulder surgeon, etc. For medical aid funders we are all orthopaedic surgeons and negotiations for funding are carried out under this umbrella term. It is therefore clear that this association has to work harder at assuring that there is greater unity between the subgroups and the association for better training of orthopaedic surgeons and a bigger human resource pool for tackling issues confronting orthopaedic surgeons at a national level.
Prof Mthunzi Victor Ngcelwane
President: South African Orthopaedic Association


text:
I use the combination of Flashgot and wget for downloads. I reset my Firefox preferences due to some other problems. Then I reconfigured everything (including add-ons, cache, etc).
After that, when I tried to download something, it automatically saved into the "Videos" folder. But before resetting the settings, I could download items to "Downloads".
What should I do to make the default directory of wget to "Downloads"?


text:
Job Description
Aurora Animal Hospital in Centennial, CO is seeking an experienced Associate Veterinarian to join our team!
Aurora Animal Hospital is an established AAHA accredited small animal general practice with a loyal clientele from the surrounding affluent neighborhoods still experiencing steady growth. We are partnered with National Veterinary Associates but all management is handled on a local level by the DVM that are partial owners. The practice is a clean, recently expanded modern facility with 9 exam rooms, a dedicated surgery suite, large treatment area, digital radiography, ultrasonography, dental table with digital dental radiography. We are primarily a general practice for dogs and cats including wellness care, urgent care, hospitalization, surgery, dentistry, acupuncture, therapeutic class IV laser, palliative care, humane euthanasia. We also offer urgent care services in addition to general practice. Several of our doctors serve a large exotics client base including small mammals, birds, reptiles, potbelly pigs. There is a mobile boarded surgeon, mobile boarded radiologist, and mobile boarded cardiologist available regularly and several referral/ER hospitals in close proximity. The practice is certified Feline Friendly and utilizes Fear Free approach when possible. We pride ourselves on our positive and supportive clinic culture with excellent job satisfaction among our fun, friendly staff. As a busy practice we have a high ratio of support staff to doctors with a tiered training protocol to ensure competent, qualified technicians and assistants. Our reviews speak for themselves on exceptional customer satisfaction. We emphasize a healthy work/life balance with no after-hours responsibilities.
You will be a great fit for our team with excellent client communication, compassion, quality medicine, and great time management skills. 30 minute appointments and almost paperless system using Avimark. Variety of schedules available with hours of 7:30a-8p Monday through Friday and 9a-3p on Saturday/Sunday – usually 3-4 weekday shifts and rotating weekends, no on call. Will consider part time. Base salary plus production, no negative accrual. Great benefits: CE, license fees, 2 weeks PTO, AVMA dues, PLIT, health insurance, DEA, 401k, etc. Exotics experience desirable but not required. Strong dentistry skills desirable. A DVM interested in medicine appointments only (no surgery/dentistry) also desirable.
For more information, please visit our website at: https://www.auroraanimalhospital.com/
We sit high above Denver in a suburb with a full view of the Front Range Mountains. Our neighborhood is in a high economic area – with many Denver Bronco players as clients! We have at least 6 community events at the hospital a year. Everything from a great open house with food and events to classes in how to prevent dog bites in children. We often speak at schools or have girl and Boy Scout visitors.
Job Summary
In addition to the responsibilities outlined below, the Associate Veterinarian is an invaluable member of the hospital team who works directly with a Managing Doctor and supporting medical staff. This individual advances the quality of medicine in the practice and provides exceptional client service to our clients and patients.
Job Responsibilities
Skills and Basic Qualifications
Equal Employment Opportunity
It is the policy of the company to afford equal opportunities to all applicants and employees regardless of race, color, religion, sex, national origin, age, non-disqualifying disability or status as a disabled or Vietnam era veteran.
Centennial, Colorado, United States


text:
Q: What is the most crazy request you have been asked by a passenger?
- A bag to spit in. I had to confirm several times the word spit
- A lady with a neck brace "I need soft food I will have rice" (The menu items did not include rice even after explaining she kept ordering things that just didn't exist)
- Hot fried chips
- Nappies
- Ice cream
- My number
- On a Lagos flight a passenger told me he wanted to masturbate. I directed him to the on board toilet.
Q: What is the best thing about being a flight attendant?
Q: What is the pay like? Besides being able to travel all over the world, are there any other benefits, either monetary or otherwise?
Q: Are there as many people joining the mile high club in the bathroom as television portrays it?
A crew was fired for getting drunk while she was a passenger flying somewhere and joining a gentleman in the lavatory.
A women had TWO men going at it on a flight from Manchester. Crew opened the door on them and the female tried to assault the crew. When the men went to their connecting flight they were arrested. Not sure what happened to them!
Q: Do people really get bumped to first class if there is a conflict with another passenger?
If you are ill (severely) you will usually be moved to business or first if there aren't many people in those cabins to recuperate and lie down at the discretion of the seniors.
Q: What's something a passenger has done that you've really appreciated, or was just really nice?
Q: When do you plan on settling down? This job doesn't seem like the type where you can keep a stable relationship.
Q: Since you fly so much, do you happen to have any sexual urges while in a different country? Do you get off to hooking up with passengers or do you go somewhere to get some?
Q: How long do you stay in each city?
Q: What's your favourite city in the world?
Q: What are your thoughts on flight etiquette (e.g. when it's okay to put your seat all the way back). Is there a classic faux pas we should know about?
Q: I'd like to be a flight attendant to see what it's like to travel and interact. Would I have to go through an exorbitant amount of training before I can work?
Q: How do you adjust being in the air so often, and with different time zones and all that? When I fly from the US to Singapore, by the time of the end of the trip I want to actually throw up. Air gets so thin, and the airline food is pretty bad even on Singapore Airlines. I literally need to have a can of sprite when flying on long flights next to me once every hour, slowly sipping until the soda is done to keep sane.
Q: What airline/flight benefits or perks do you get as a result of your job?
For more adventures in the sky, be sure to follow our resident flight attendant, Heather Poole, in her "Galley Gossip" column.
Please note: These questions and answers have been edited slightly to fit an interview format.
[Photo credit: Flickr user laszlo-photo]


text:
IO package: Difference between revisions
|Line 99:
|Line 99:
Generally, if you use a Java-based interface for spreadsheet I/O, it doesn't matter much whether you use Octave 32-bit or Octave 64-bit.
Generally, if you use a Java-based interface for spreadsheet I/O, it doesn't matter much whether you use Octave 32-bit or Octave 64-bit.
However, the UNO interface (for LibreOffice & OpenOffice.org) is more pertinent: 64-bit Octave can only use a 64-bit LibreOffice with UNO, same for 32 bit.
However, the UNO interface (for LibreOffice & OpenOffice.org) is more pertinent: 64-bit Octave can only use a 64-bit LibreOffice with UNO, same for 32 bit.
==== Java example ====
==== Java example ====
Revision as of 16:06, 19 September 2014
The IO package is part of the octave-forge project and provides input/output from/in external formats.
About read/write support
Most people need this package to read and write Excel files. But the io package can read/write Open/Libre Office, Gnumeric and some less important files too.
File extension COM POI POI/OOXML JXL OXS UNO OTK JOD OCT -------------------------------------------------------------- .xls (Excel95) R R R .xls (Excel97-2003) + + + + + + .xlsx (Excel2007+) ~ + (+) + + .xlsb, .xlsm ~ ? R R? .wk1 + R .wks + R .dbf + + .ods ~ + + + + .sxc + + .fods + .uos + .dif + + .csv + R .gnumeric + -------------------------------------------------------------- R : only read; + : full read/write; ~ : dependent on Excel version
xlswrite / odswrite versus xlsopen / odsopen ..... xlsclose / odsclose
Matlab users are used to xlsread and xlswrite, functions that can only read data from, or write data to, one sheet in a spreadsheet file at a time. For each operation, xlsread and xlswrite first have to read the entire spreadsheet file, for write operations xlswrite also has to finally write it out completely to disk. There are faster ways, but then you'll have to dive into ActiveX/COM/VisualBasic programming.
If you want to move multiple pieces of data to/from a spreadsheet file, the io package offers a much more versatile scheme:
- First open the spreadsheet file using xlsopen (for Excel or gnumeric files) or odsopen (.ods or .gnumeric).
NOTE: the output of these functions is a file pointer handle that you should treat carefully!
- (for reading data) Read the data using raw_data = xls2oct (<fileptr> [,sheet#] [,cellrange] [,options])
- Next, optionally split the data in numerical, text and raw data and optionally get the limits of where these came from:
[num, txt, raw, lims] = parsecell (data, <fileptr.lims>)
- (for writing data) Write the data using <fileptr> = oct2xls (data, <fileptr> [,sheet#] [,cellrange] [,options])
- When you're finished, DO NOT FORGET to close the file pointer handle:
<fileptr> = xlsclose (<fileptr>)
Mixing read and write operations in any order is permitted (the only exception: not with the JXL -JExcelAPI- interface). The same goes for odsopen-ods2oct-oct2ods-odsclose sequences.
Obviously this is much more flexible (and FASTER) than xlsread and xlswrite. In fact, Octave's io package xlsread is a mere wrapper for an xlsopen-xls2oct-parsecell-xlsclose sequence. Similarly for xlswrite, odsread, and odswrite.
.xls ~= .xlsx
This is the most important information you have to keep in mind when you have to work with "Excel" files.
- .xls - is an outdated default binary file format from <= Office 2003 - try to avoid this format!
- .xlsx - is the new default file format since Office 2007. It consists of xml files stored in a .zip container. - always save in or convert to this format!
- The (new) OCT interface can read (since version 1.2.5) and write (since version 2.2.0) .xlsx files dependency-free! No need of MS Windows+Office nor Java.
- Windows is notorious for hiding "known" file extensions. However in Windows Explorer it is easy to change this and have Windows show all file extensions.
different interfaces
The io package comes with different interfaces to read/write different file formats.
- This (interface) is only available on MS Windows and with an MS Office installation.
- These are java-based interfaces. They are generally slower than Octave's native OCT interface; OTOH they offer more flexibility. Generally the OCT interface offers sufficient flexibility and speed.
- This is the new impressive and fast (mostly written in Octave itself! + two C files to bypass bottlenecks) interface which presently supports .xlsx, .ods and .gnumeric files.
(Note that .ods is a complicated file format with many gotchas that doesn't lend itself for fast file I/O. So unfortunately the fastest .ods interface is the Java-based jOpenDocument (JOD) (luckily it is GPL). However if speed is not an issue or if you hate Java, the OCT interface still performs fast enough.)
So, if you want to read/write .xlsx files, you'll only need the io-package >=2.2.0.
But if you have to read/write .xls files, you'll need either
- MS Windows with MS Office backings - or
- Octave built with --enable-java, + a Java JRE or -JDK, and one or more of the Java interfaces (i.e., the class libs)!
If you want to read/write .gnumeric files, the OCT interface is even the only option.
For some rarely used file formats you'll need LibreOffice + Octave built with Java enabled + a Java JRE or -JDK. But OK, once there you can enjoy formats then like Unified Office Format, Data Interchange Format, SYLK, OpenDocument Flat XML, the old OpenOffice.org .sxc format and some others you may have heard of ;-)
force an interface
If you don't want that the io-autodetect take control, you can easily force the usage of an interface. Examples:
Force native OCT interface - only for .xlsx, .ods, .gnumeric
OCT = xlsread ('file.xlsx', 1, [], 'OCT');
Force COM interface - may only work with .xls, .xlsx on Windows OS and available office installation.
COM = xlsread ('file.xlsx', 1, [], 'COM');
Force POI interface - may only work if you've did javaaddpath for the Apache POI .jar files - only .xls
POI = xlsread ('file.xls', 1, [], 'POI');
And so on ...
32 vs. 64-bit issues
Generally, if you use a Java-based interface for spreadsheet I/O, it doesn't matter much whether you use Octave 32-bit or Octave 64-bit. However, the UNO interface (for LibreOffice & OpenOffice.org) is more pertinent: 64-bit Octave can only use a 64-bit LibreOffice with UNO, same for 32 bit.
Java example
- Again: You only need Java if you have to read/write .xls files! You don't need this for .xlsx files!
- Make sure you've setup everything with java correctly
- get e.g. apache poi jar library files and add them with javaaddpath
octave:1> javaaddpath('~/poi_library/poi-3.8-20120326.jar'); octave:2> javaaddpath('~/poi_library/poi-ooxml-3.8-20120326.jar'); octave:3> javaaddpath('~/poi_library/poi-ooxml-schemas-3.8-20120326.jar'); octave:4> javaaddpath('~/poi_library/xmlbeans-2.3.0.jar'); octave:5> javaaddpath('~/poi_library/dom4j-1.6.1.jar'); octave:6> octave:6> pkg load io octave:7> chk_spreadsheet_support ans = 6 octave:8> javaclasspath STATIC JAVA PATH - empty - DYNAMIC JAVA PATH /home/markus/poi_library/poi-3.8-20120326.jar /home/markus/poi_library/poi-ooxml-3.8-20120326.jar /home/markus/poi_library/poi-ooxml-schemas-3.8-20120326.jar /home/markus/poi_library/xmlbeans-2.3.0.jar /home/markus/poi_library/dom4j-1.6.1.jar
An easier way is to collect all required Java class libs fo spreadsheet I/O (the .jar files) in one subdir and have chk_spreadsheet_support .m sort it all out:
octave:8> chk_spreadsheet_support ('/full/path/to/subdir/with/.jar/files')
For UNO (LibreOffice-behind-the-scenes) the call is a bit different:
octave:8> chk_spreadsheet_support ('', 0, '/full/path/to/LibreOffice/installation')
(On Windows, the io package tries to automatically find all required Java class libs and LibreOffice. To help it, put the Java class libs in you user profile (home directory) in a subdir "java", e.g., C:\Users\Eddy\java. chk_spreadsheet_support searches that location automagically. On Linux this automatic searching has been disabled as the io package took ages (well, minutes) to load...)
Anyway, the chk_spreadsheet_support output should be now > 0.
0 No spreadsheet I/O support found ---------- XLS (Excel) interfaces: ---------- 1 = COM (ActiveX / Excel) 2 = POI (Java / Apache POI) 4 = POI+OOXML (Java / Apache POI) 8 = JXL (Java / JExcelAPI) 16 = OXS (Java / OpenXLS) --- ODS (OpenOffice.org Calc) interfaces ---- 32 = OTK (Java/ ODF Toolkit) 64 = JOD (Java / jOpenDocument) ----------------- XLS & ODS: ---------------- 128 = UNO (Java / UNO bridge - OpenOffice.org)
And reading/writing .xls files should work.
Detailed Information (TL)
The following might be more interesting if you're interested in how things work inside the io package.
ODS support
(ODS = Open Document Format spreadsheet data format, used by e.g., LibreOffice and OpenOffice.org)
Files content
- odsread.m — no-hassle read script for reading from an ODS file and parsing the numeric and text data into separate arrays.
- odswrite.m — no-hassle write script for writing to an ODS file.
- odsopen.m — get a file pointer to an ODS spreadsheet file.
- ods2oct.m — read raw data from an ODS spreadsheet file using the file pointer handed by odsopen.
- oct2ods.m — write data to an ODS spreadsheet file using the file pointer handed by odsopen.
- odsclose.m — close file handle made by odsopen and -if data have been transfered to a spreadsheet- save data.
- odsfinfo.m — explore sheet names and optionally estimated data size of ods files with unknown content.
- calccelladdress.m — utility function needed for jOpenDocument class.
- parsecell.m — (contained in Excel xlsread scripts, but works also for ods support) parse raw data (cell array) into separate numeric array and text (cell) array.)
- chk_spreadsheet_support.m — internal function for (1) checking, (2) setting up, (3) debugging spreadsheet support. While not specifically meant for direct invocation from the Octave prompt (it is more useful during initialization of Octave itself) it can be very helpful when hunting down issues with spreadsheet support in Octave.
The following are support files called by the scripts and not meant for direct invocation by users:
- spsh_chkrange.m
- spsh_prstype.m
- getusedrange.m
- calccelladdress.m
- parse_sp_range.m
Required support software
For the OCT interface (since 1.2.4/1.2.5, read-only support!):
- Nothing except unzip
For Windows (MingW):
- Octave with Java package (preferrably >= 1.2.8, although 1.2.6 will do for most functionality)
For Linux:
- Octave with Java package (preferrably >= 1.2.8, although 1.2.5 will do for most functionality)
For ODS access, you'll need to choose at least one of the following java class files collections:
- (currently the preferred option) odfdom.jar (only versions 0.7.5, 0.8.6, 0.8.7 and 0.8.8 work OK!) & xercesImpl.jar (NOTE: only version 2.9.1 dated 14 Sep 2007 has been confirmed to work with odfdom 0.8.7 and earlier. odfdom-0.8.8 hasn't been tested with other xercesImpl.jar releases yet). Get them here:
- jopendocument<version>.jar. Get it from http://www.jopendocument.org (jOpenDocument 1.3 (final) is the most recent one and recommended for Octave).
- OpenOffice.org (or clones like LibreOffice, Go-Office, ...). Get it from http://www.openoffice.org or www.libreoffice.org. The relevant Java class libs are unoil.jar, unoloader.jar, jurt.jar, juh.jar and ridl.jar (which are scattered around the OOo installation directory), while also the <OOo>/program/ directory needs to be in the classpath.
These must be referenced with full pathnames in your javaclasspath. Hint: add it in ./share/octave/<version>/m/startup/octaverc using appropriate javaaddpath statements. Alternatively, the io package contains a function script file "chk_spreadsheet_support.m" which can set up the Java classpath.
(see "help ods<function_filename>" in octave terminal.)
odsread is a sort of analog to xlsread and works more or less the same. odsread is a mere wrapper for the functions odsopen, ods2oct, and odsclose that do file access and the actual reading, plus parsecell for post-processing.
odswrite works similar to xlswrite. It too is a wrapper for scripts which do the actual work and invoke other scripts, a.o. oct2ods.
odsfinfo can be used to explore odsfiles with unknown content for sheet names and to get an impression of the data content sizes. When you need data from just one sheet, odsread is for you. But when you need data from multiple sheets in the same spreadsheet file, or if you want to process spreadsheet data by limited-size chunks at a time, odsopen / ods2oct [/parsecell] / … / odsclose sequences provides for much more speed and flexibility as the spreadsheet needs to be read just once rather than repeatedly for each call to odsread.
Same reasoning goes for odswrite.
Also, if you use odsopen / …../, you can process multiple spreadsheets simultaneously – just use odsopen repeatedly to get multiple spreadsheet file pointers.
Moreover, after adding data to an existing spreadsheet file, you can fiddle with the filename in the ods file pointer struct to save the data into another, possibly new spreadsheet file.
If you use odsopen / ods2oct / … / oct2ods / …. / odsclose, DO NOT FORGET to invoke odsclose in the end. The file pointers can contain an enormous amount of data and may needlessly keep precious memory allocated. In case of the UNO interface, the hidden OpenOffice.org invocation (soffice.bin) can even block proper closing of Octave.
Spreadsheet formula support
When using the OTK or UNO interface you can:
- (When reading, ods2oct) either read spreadsheet formula results, or the literal formula text strings;
- (When writing, oct2ods) either enter formulas in the worksheet as formulas, or enter them as literal text strings.
In short, you can enter spreadsheet formulas and in a later stage read them back, change them and re-enter them in the worksheet. The behaviour is controlled by an option structure options (as last argument to oct2ods.m and ods2oct.m) which for now has only one (logical) field:
- options.formulas_as_text = 0 (the default) implies enter formulas as formulas and read back formula results
- options.formulas_as_text =1 (or any positive integer) means enter formulas as text strings and read them back as text strings.
Be aware that there's no formula evaluator in ODS java, not even a formula validator. So if you create formulas in your spreadsheet using oct2ods or odswrite, do not expect meaningful results when reading those files later on unless you open them in OpenOffice.org Calc and write them back to disk. You can write all kind of junk as a formula into a spreadsheet cell. There's not much validity checking built into odfdom.jar. I didn't bother to try OpenOffice.org Calc to read such faulty spreadsheets, so I don't know what will happen with spreadsheets containing invalid formulas. But using the above options, you can at least repair them using octave....
The only exception is if you select the UNO interface, as that invokes OpenOffice.org behind the scenes, and OOo obviously has a validator and evaluator built-in.
I know of one big gotcha: i.e. reading dates (& time). A less obvious one is Java memory pool allocation size.
Date and time in ODS
Octave (as does Matlab) stores dates as a number representing the number of days since January 1, 0 (and as an aside ignores a.o. Pope Gregorius' intervention in 1582 when 10 days were simply skipped).
OpenOffice.org stores dates as text strings like "yyyy-mm-dd".
MS-Excel stores dates as a number representing the number of days since January 1, 1900 (and as an aside, erroneously assumes 1900 to be a leap year). (Why mention MS-Excel here? See below:)
Now, converting OpenOffice.org date cell values (actually, character strings flagged by "date" attributes) into Octave looks pretty straightforward. But when the ODS spreadsheet was originally an Excel spreadsheet converted by OpenOffice.org, the date cells can either be OOo date values (i.e.,strings) OR old numerical values from the Excel spreadsheet.
So: you should carefully check what happens to date cells.
As octave has no "date" or "time" data type, octave date values (usually numerical data) are simply transferred as "floats" to ODS spreadsheets. You'll have to convert the values into dates yourself from within OpenOffice.org.
While adding data and time values has been implemented in the write scripts, the wait is for clever solutions to distinguish dates from floats in octave cell arrays.
Java memory pool allocation size
The Java virtual machine (JVM) initializes one big chunk of your computer's RAM in which all Java classes and methods etc. are to be loaded: the Java memory pool. It does this because Java has a very sophisticated "garbage collection" system. At least on Windows, the initial size is 2MB and the maximum size is 64MB. On Linux this allocated size is much bigger. This part of memory is where the Java-based ODS octave routines (and the Java-based ods routines) live and keep their variables etc.
For transferring large pieces of information to and from spreadsheets you might hit the limits of this pool. E.g. to be able to handle I/O of an array of around 50,000 cells I needed a memory pool size of 512 MB.
The memory size can be increased by inserting a file called "java.opts" (without quotes) in the directory ./share/octave/packages/java-<version> (where the script file javaclasspath.m is located), containing just the following lines:
-Xms16m -Xmx512m
(where 16 = initial size, 512 = maximum size (in this example), m stands for Megabyte. This number is system-dependent).
After processing a large chunk of spreadsheet information you might notice that octave's memory footprint does not shrink so it looks like Java's memory pool does not shrink back; but rest assured, the memory footprint is the allocated (reserved) memory size, not the actual used size. After the JVM has done its garbage collection, only the so-called "working set" of the memory allocation is really in use and that is a trimmed-down part of the memory allocation pool. On Windows systems it often suffices to minimize the octave terminal for a few seconds to get a more reasonable memory footprint.
Reading cells containing errors
Spreadsheet cells containing erroneous stuff are transferred to Octave as NaNs. But not all errors can be catched. Cells showing #Value# in OpenOffice.org Calc due to e.g., invalid formulas, may have a 0 (zero) value stored in the value fields. It is impossible to catch this as there is no run-time formula evaluator (yet) in ODF Toolkit nor jOpenDocument (like there is in Apache POI for Excel).
Smaller gotcha's :
- while reading, empty cells are sometimes not skipped but interpreted with numerical value 0 (zero).
NOT fixed in jOpenDocument version 1.2 & 1.3 final:
- jOpenDocument doesn't set the so-called <office:value-type='string'> attribute in cells containing text; as a consequence ODF Toolkit will treat them as empty cells. OOo will read them OK.
Matlab compatibility
AFAIK there's no similar functionality in Matlab (yet?), only for reading and then very limited. odsread is fairly function-compatible to xlsread, however.
Same goes for odswrite, odsfinfo and xlsfinfo – however odsfinfo has better functionality IMO.
Comparison of interfaces
The OCT interface (present as of io-1.2.4) offers read support for ODS 1.2, complete with all the options of ODFtoolkit and UNO, but fairly slow.
The OTK interface (ODFtoolkit) is the one that gives the best (but slow) results at present. However, parsing xml trees into rectangular arrays is not quite straightforward and the other way round is a real nightmare; odftoolkit up til 0.7.5. did little to hide the gory details for the developers.
While reading ODS is still OK, writing implies checking whether cells already exist explicitly (in table:table-cells) or implicitly (in number-columns-repeated or number-rows-repeated nodes) or not at all yet in which case you'll need to add various types of parent nodes. Inserting new cells ("nodes") or deleting nodes implies rebuilding possibly large parts of the tree in memory - nothing for the faint-of-heart. Only with ODFToolkit (odfdom) 0.8.6 and 0.8.7 things have been simplified for developers.
The JOD (jOpenDocument) interface is more promising, as it does shield the xml tree details and presents developers something which looks like a spreadsheet model.
However, unfortunately the developers decided to shield essential methods by making them 'protected' (e.g. the vital getCellType). JopenDocument does support writing. But OTOH many obvious methods are still lacking and formula support is absent. And last (but not least) the jOpenDocument developers state that their development is primarily driven by requests from customers who pay for support. I do sympathize with this business model but for octave needs this may hamper progress for a while.
The (still experimental) UNO interface, based on a Java/UNO bridge linking a hidden OpenOffice.org invocation to Octave, is the most promising:
- admittedly OOo needs some tens of seconds to start for the first time, but once OOo is in the operating system's disk cache, it operates much faster than ODF or JOD;
- it has built-in formula validator and evaluator;
- it has a much more reliable data parser;
- it can read much more spreadsheet formats than just ODS; .sxc (older OOo and StarOffice), but also .xls, .xlsx (Excel), .wk1 (Lotus 123), dbf, etc.
- it consumes only a fraction of the JVM heap memory that the other Java ODS spreadsheet solutions need because OOo reads the spreadsheet in its own memory chunk in RAM. The other solutions read, expand, parse and manipulate all data in the JVM. In addition, OOo's code is outside the JVM (and Octave) while the ODF Toolkit and jOpenDocument classes also reside in the JVM.
However, UNO is not stable yet (see below).
Some hints for troubleshooting ODS support are given here. Since April 2011 the function chk_spreadsheet_support() has been included in the io package. Calling it with arguments (, 3) (empty string and debug level 3) will echo a lot of diagnostics to the screen. Large parts of the steps outlined below have been automated in this script. Problems with UNO are too complicated to treat them here; most of the troubleshooting has been implemented in chk_spreadsheet_support.m, only some general guidelines are given below.
- Check if Java works. Do a pkg list and see
- If there's a Java package mentioned (then it's installed). If not, install it.
- If there's an asterisk on the java package line (then the package is loaded). If not, do a pkg rebuild-auto java
- Check Java memory settings. Try javamem
- If it works, check if it reports sufficiently large max memory (had better be 200 MiB, the bigger the better)
- If it doesn't work, do:
- rt = java_invoke ('java.lang.Runtime', 'getRuntime')
- rt.gc
- rt.maxMemory ().doubleValue () / 1024 / 1024 # show MaxMemory in MiB.
- In case you have insufficient memory, see in #Gotchas, #Java memory pool allocation size, how to increase java's memory pre-reservation.
- Check if all classes (.jarfiles) are in class path. Do a 'jcp = javaclasspath (-all)' (under unix/linux, do 'jcp = javaclasspath; strsplit (jcp,":")' (w/o quotes). See above under #Required support software what classes should be mentioned.
- If classes (.jar files) are missing, download and put them somewhere and add them to the javaclass path with their fully qualified pathname (in quotes) using javaaddpath().
- Once all classes are present and in the javaclasspath, the ods interfaces should just work. The only remaining showstoppers are insufficient write privileges for the working directory, a wrecked up octave or some other problems outside octave.
- Try opening an ods file:
- ods1 = odsopen ('test.ods', 1, 'otk'). If this works and ods1 is a struct with various fields containing objects, ODF toolkit interface (OTK) works. Do an ods1 = odsclose (ods1) to close the file.
- ods2 = odsopen ('test.ods', 1, 'jod'). If this works and ods2 is a struct with various fields containing objects, jOpenDocument interface (JOD) works as well. Do ods2 = odsclose (ods2) to close the file.
- For the UNO interface, at least version 1.2.8 of the Java package is needed plus the following Java class libs (jars) and directory:
- unoil.jar (usually found in subdirectory Basis<version>/program/classes/ or the like of the OpenOffice.org (<OOo>) installation directory;
- juh.jar, jurt.jar, unoloader.jar and ridl.jar, usually found in the subdirectory URE/share/java/ (or the like) of OOo's installation directory;
- The subdirectory program/ (where soffice[.exe] (or ooffice) resides).
- The exact case (URE or ure, Basis or basis), name ("Basis3.2" or just "basis") and subdirectory tree (URE/java or URE/share/java) varies across OOo versions and -clones, so chk_spreadsheet_support.m can have a hard time finding all needed classes. In particularly bad cases, when chk_spreadsheet_support cannot find them, you might need to add one or more of these these classes manually to the javaclasspath.
As with the Excel r/w stuff, adding new interfaces should be easy and straightforward. Add relevant stanzas in odsopen, odsclose, odsfinfo & getusedrange and add new subfunctions (for the real work) to getusedrange_<INTF>, oct2ods and ods2oct.
Suggestions for future development:
- Reliable and easy ODS write support (maybe when jOpenDocument is more mature)
- Speeding up (ODS is 10 X slower than e.g. OOXML !!!). jOpenDocument is much faster but still immature. UNO is MUCH faster than jOpenDocument but starting up OpenOffice.org for the first time can take tens of seconds... Note that UNO is still experimental. The issue is that odsclose() will simply kill ALL other OpenOffice.org invocations, also those that were not opened through Octave! This is related to UNO-Java limitations. The underlying issue is that when Octave starts an OpenOffice.org invocation, OpenOffice.org must be closed for Octave to be able to exit; otherwise Octave will wait for OOo to shut down before it can terminate itself. So Octave must kill OOo to be able to terminate. A way out hasn't been found yet.
- Passing function handle a la Matlab's xlsread
- Adding styles (borders, cell lay-out, font, etc.)
Some notes on the choice for Java:
- It saves a LOT of development time to use ready-baked Java classes rather than developing your own routines and thus effectively reinvent the wheel.
- A BIG advantage is that a Java-based solution is platform-independent (portable).
- But Java is known to be not very conservative with resources, especially not when processing XML-based formats.
So Java is a compromise between portability and rapid development time versus capacity (and speed). But IMO data sets larger than 5.105 cells should not be kept in spreadsheets anyway. Use real databases for such data sets.
ODFDOM versions
I have tried various odfdom version. As to 0.8 & 0.8.5, while the API has been simplified enormously (finally one can address cells by spreadsheet address rather than find out yourself by parsing the table-column/-row/-cell structure), many irrecoverable bugs have been introduced :-(( In addition processing ODS files became significantly slower (up to 7 times!).
End of August 2010 I have implemented support for odfdom-0.8.6.jar – that version is at last sufficiently reliable to use. The few remaining bugs and limitations could easily be worked around by diving in the older TableTable API. Later on versions 0.8.7 and 0.8.8 have been tested too - these needed a few adjustments; clearly the odfdom API (currently at main version 0) is not stable yet. Version 0.8.9 introduced an undocumented dependency on some obscure Java class lib - I think due to a bit sloppy development procedures. Anyway I couldn't get it to work. So at the moment (Summer 2013 = last I looked) only odfdom versions 0.7.5, 0.8.6, 0.8.7 and 0.8.8 are supported.
If you want to experiment with odfdom 0.8 & 0.8.5, you can try:
- odsopen.m (revision 7157)
- ods2oct.m (revision 7158)
- oct2ods.m (revision 7159)
XLS support
Files content
- xlsread.m — All-in-one function for reading data from one specific worksheet in an Excel spreadsheet file. This script has Matlab-compatible functionality.
- xlswrite.m — All-in-one function for writing data to one specific worksheet in an Excel spreadsheet file. This script has Matlab-compatible functionality.
- xlsfinfo.m — All-in-one function for exploring basic properties of an Excel spreadsheet file. This script has Matlab-compatible functionality.
- xlsopen.m — Function for "opening" (= providing a handle to) an Excel spreadsheet file ("workbook"). This function sorts out which interface to use for .xls access (i.e.,COM; Java & Apache POI; JexcelAPI; OpenXLS; etc.), but it's choice can be overridden.
- xls2oct.m — Function for reading data from a specific worksheet pointed to in a struct created by xlsopen.m. xls2oct can be called multiple times consecutively using the same pointer struct, each time allowing to read data from different ranges and/or worksheets. Data are returned in the form of a 2D heterogeneous cell array that can be parsed by parsecell.m. xls2oct is a mere wrapper for interface-dependent scripts that do the actual low-level reading.
- oct2xls.m — Function for writing data to a specific worksheet pointed to in a struct created by xlsopen.m. octxls can be called multiple times consecutively using the same pointer struct, each time allowing to write data to different ranges and/or worksheets. oct2xls is a mere wrapper for interface-dependent scripts that do the actual low-level writing.
- xlsclose.m — Function for closing (the handle to) an Excel workbook. When data have been written to the workbook oct2xls will write the workbook to disk. Otherwise, the file pointer is simply closed and possibly used interfaces for Excel access (COM/ActiveX/Excel.exe) will be shut down properly.
- parsecell.m — Function for separating the data in raw arrays returned by xls2oct, into numerical/logical and text (cell) arrays.
- chk_spreadsheet_support.m — Internal function for (1) checking, (2) setting up, (3) debugging spreadsheet support. While not specifically meant for direct invocation from the Octave prompt (it is more useful during initialization of Octave itself) it can be very helpful when hunting down issues with spreadsheet support in Octave.
- spsh_chkrange.m, spsh_prstype.m, getusedrange.m, calccelladdress.m, parse_sp_range.m — Support files called by the scripts and not meant for direct invocation by users.
Required support software
For the OCT interface (since 1.2.4/1.2.5, read-only support for OOXML (.xlsx)!):
- Nothing except unzip
For the Excel/COM interface:
- A windows computer with Excel installed. Note that 64-bit MS-Office has no support for COMx /ActiveX so you might have to resort to the Java interfaces below
- Octave-forge Windows-1.0.8 or later package WITH LATEST SVN PATCHES APPLIED. Currently (2013) windows-1.2.1 is the best option.
For the Java / Apache POI / JExcelAPI interfaces (general):
- octave-forge java-1.2.8 package or later version on Linux
- octave-forge java-1.2.8 with latest svn fixes on Windows/MingW
- Java JRE or JDK > 1.6.0 (hasn't been tested with earlier versions). Although not an Octave issue, as to security you'd better get the latest Java version anyway.
Apache POI specific:
- class .jars: poi-3.5-FINAL-<date>.jar & poi-ooxml-3.5-FINAL-<date>.jar (or later versions) in classpath
- Get it here: http://poi.apache.org/download.html
- for OOXML support (only available with Apache POI): poi-ooxml-schemas-<version>.jar, xbean.jar or xmlbeans.jar, dom4j-1.6.1.jar in javaclasspath.
- Get them here: http://poi.apache.org/download.html ("xmlbeans" and poi-ooxml-schemas) or http://sourceforge.net/projects/dom4j/files (dom4j-<version>)
JExcelAPI specific:
- class .jar: jxl.jar in classpath
- Get it here: http://sourceforge.net/projects/jexcelapi/files/
OpenXLS specific:
- class .jar: jxl.jar in classpath
- Get it here: http://sourceforge.net/projects/openxls/
These class libs must be referenced with full pathnames in your javaclasspath.
They had best be put in /<libdir>/java where <libdir> on Linux is usually /usr/lib; on MinGW it is usually /lib. The PKG_ADD command expects the class libs there; if they are elsewhere, add them in ./share/octave/<version>/m/startup/octaverc using appropriate javaaddpath statements or a chk_spreadsheet_support() call.
UNO specific (invoking OpenOffice.org (or clones) behind the scenes):
NOTE: EXPERIMENTAL!! A working OpenOffice.org installation. The utility function chk_spreadsheet_support can be used to add the needed entries to the javaclasspath.
xlsread and xlswrite are mere wrappers for xlsopen - xls2oct - xlsclose - parsecell and xlsopen - oct2xls - xlsclose sequences, resp. They exist for the sake of Matlab compatibility.
xlsfinfo can be used for finding out what worksheet names exist in the file. For OOXML files you can do with the OCT interface (specify "oct" for the REQINTF parameter). For other Excel file types you need MS-Excel for Windows (or later version) and the windows package (specify "com" for REQINTF), and/or Apache POI and Java support (then the input parameter REQINTF should be specified with a value of 'poi' (case-insensitive) and -obviously- the complete POI interface must have been installed).
Invoking xlsopen/..../xlsclose directly provides for much more flexibility, speed, and robustness than xlsread / xlswrite. Indeed, using the same file handle (pointer struct) you can mix reading & writing before writing the workbook out to disk using xlsclose.
And: xlsopen / xlsclose hide the gory interface details from the user.
Currently only .xls files (BIFF8) can be read/written; using JExcelAPI BIFF5 can be read as well. For OOXML files either Excel 2007 for Windows (or higher) and/or the complete Apache POI interface must be installed (and probably the REQINTF parameter specified with a value of 'poi').
When using xlsopen/.../xlsclose be sure to keep track of the file handle struct.
A possible scenario:
xlh = xlsopen (<excel_filename> , [rw], [<requested interface>]) # Set rw to 1 if you want to write to a workbook immediately. # In that case the check for file existence is skipped and # -if needed- a new workbook created. # If you really want an other interface than auto-selected # by xlsopen you can request that. But xlsopen still checks # proper support for your choice. # Read some data [ rawarr1, xlh ] = xls2oct (xlh, <SomeWorksheet>, <Range>) # Be sure to specify xlh as output argument as xls2oct keeps # track of changes and the need to write the workbook to disk # in the xlhstruct. And the origin range is conveyed through # the xlh pointer struct. # Separate data into numeric and text data [ numarr1, txtarr1, lim1 ] = parsecell (rawarr1) # Get more data from another worksheet in the same workbook [ rawarr2, xlh ] = xls2oct (xlh, <SomeOtherWorksheet>, <Range>) [ numarr2, txtarr2, lim2 ] = parsecell (rawarr2) # <... Analysis and preparation of new data in cell array Newdata....> # Add new data to spreadsheet xlh = oct2xls (Newdata, xlh, <AnotherWorksheet>, <Range>) # Close the workbook and write it to disk; then clear the handle xlh = xlsclose (xlh) clear xlh
When not using the COM interface, specify a value of 'POI' for parameter REQINTF when accessing OOXML files in xlsread, xlswrite, xlsopen, xlsfinfo (and be sure the complete Apache POI interface is installed). If you haven't got ActiveX installed (i.e., not having MS-Excel under Windows) specifying 'POI' may not be needed as in such cases Apache POI is the next default interface.
When using JExcelAPI (JXL), after writing into a worksheet you MUST save the file – adding data to the same or another worksheet is no more possible after the first call to oct2xls(). This is a limitation of JExcelAPI.
Spreadsheet formula support
When using the COM, POI, JXL, and UNO interfaces you can:
- (When reading, xls2oct) either read spreadsheet formula results, or the literal formula text strings (also works with OCT interface);
- (When writing, oct2xls) either enter formulas in the worksheet as formulas, or enter them as literal text strings.
In short, you can enter spreadsheet formulas and in a later stage read them back, change them and re-enter them in the worksheet.
The behaviour is controlled by an option structure options which for now has only one (logical) field:
- options.formulas_as_text = 0 (the default) implies enter formulas as formulas and read back formula results
- options.formulas_as_text =1 (or any positive integer) means enter formulas as text strings and read them back as text strings.
Be aware that there's no formula evaluator in JExcelAPI (JXL) nor OpenXLS (OXS). So if you create formulas in your spreadsheet using oct2xls or xlswrite with 'JXL' or 'OXS', do not expect meaningful results when reading those files later on ,unless you open them in Excel and write them back to disk.
While both Apache POI and JExcelAPI feature a formula validator, not all spreadsheet functions present in Excel have been implemented (yet). Worse, older Excel versions feature less functions than newer versions. So be wary as this may make for interesting confusion.
Matlab compatibility
xlsread, xlswrite and xlsfinfo are for the most part Matlab-compatible. Some small differences are mentioned below.
- xlsread
- Matlab's xlsread supports invoking extra functions while reading ("passing function handle"); octave not. But this can be simulated outside xlsread.
- Matlab's xlsread flags some spreadsheet errors, octave-forge just returns blank cells.
- Octave-forge returns info about the actual (rather than the requested) cell range where the data came from. Personally I find it very useful to know from what part of a worksheet the data originate so I've put quite some effort in it :-) Matlab can't, due to Excel automatically trimming returned arrays from empty outer columns and rows. Octave is more clever but the Visual Basic call used for determining the actually used range has some limitations:
- it relies on cached range values and thus may be out-of-date;
- it counts empty formatted cells too. When using ActiveX/COM, if octave's xlsfinfo.m returns wrong data ranges it is most often an overestimation.
- Matlab's xlsread ignores all non-numeric data values outside the smallest rectangle encompassing all numerical values. Octave's xlsread doesn't. This means that Matlab ignores all row/column headers, not very user-friendly IMO.
- When using the Java interface, reading and writing xls-files by octave-forge is platform-independent. On systems w/o installed Excel, Matlab can only read Excel 95 formatted .xls files (written using ML xlswrite's 'Basic" option) – and then differently than under Windows.....
- Matlab's xlsread returns strings for cells containing date values. This makes for endless if-then-elseif-else-end constructs to catch all expected date formats. Octave returns numerical data (where 0 = 1/1/1900 – you can easily transfer them into proper octave date values yourself using e.g. datestr(), see bottom of this document for more info). For dates before 1/1/1900, Octave returns dates as text strings.
- Matlab's xlsread invokes csvread if no Excel interface is present. Octave-forge's xlsread doesn't.
- Octave can read either formula results (evaluated formulas) or the formula text strings; Matlab can't.
- xlswrite
- Octave-forge's xlswrite works on systems w/o Excel support, Matlab's doesn't (properly).
- When specifying a sheet number larger than the number of existing sheets in an .xls file, Matlab's xlswrite adds empty sheets until the new sheet number is created; Octave's xlswrite only adds one sheet called "Sheet<number>" where <number> is the specified sheet number.
- Even better (IMO) while M's xlswrite always creates Sheet1/Sheet2/Sheet3 when creating a new spreadsheet, octave's xlswrite only creates the requested worksheet. (Did you know that you can instruct Excel to create spreadsheets with just one, or any number of, worksheets? Look in Tools | Options, General tab.)
- Oh and octave doesn't touch the "active sheet" - but that's not automatically an advantage.
- If the specified write range is larger than the actual data array, Matlab's xlswrite adds #N/A cells to fill up the lowermost rows and rightmost columns; octave-forge's xlswrite doesn't.
- xlsfinfo
- When invoking Excel/COM interface, octave-forge's xlsfinfo also echoes the type of sheet (worksheet, chart), not just the sheet names. Using Java I haven't found similar functionality (yet).
Comparison of interfaces & usage
Using Excel itself (through COM / ActiveX on Windows systems) is probably the most robust and versatile and especially FAST option. There's one gotcha: in case of some type of COM errors Excel will keep running invisibly; you can only end it through Task Manager. A tiny problem is that one cannot find out easily through COM what file types are supported; xls, wks, wk1, xlsx, etc. Another -obvious- limitation is that COM Excel access only works on Windows systems where Excel is installed.
JExcelAPI (Java-based and therefore platform-independent) is proven technology but switching between reading and writing is quite involved and memory-hungry when processing large spreadsheets. As the docs state, JExcelAPI is optimized for reading and it does do that well - but still slower than Excel/COM. The fact that upon a switch from reading to writing the existing spreadsheet is overwritten in place by a blank one and that you can only get the contents back wen writing out all of the changes is worrying - and any change after the first write() is lost as a next write() doesn't seem to work, worse yet, you may completely loose the spreadsheet in question. The first is by JExcelAPI design, the second is probably a bug (in octave-forge/Java or JExcelAPI ? I don't know). Adding data to existing spreadsheets does work, but IMO undue user confidence is needed. JExcelAPI supports BIFF5 (only reading) and BIFF8 (Excel 95 and Excel 97-2003, respectively). Upon overwriting, BIFF5 spreadsheets are converted silently to BIFF8. JexcelAPI, unlike ApachePOI, doesn't evaluate functions while reading but instead relies on cached results (i.e. results computed by Excel itself). Depending on Excel settings ("Automatic calculation" ON or OFF) this may or may not yield incorrect (or expected) results.
Apache POI (Java-based and platform-independent too) is based on the OpenOffice.org I/O Excel r/w routines. It is a more versatile than JExcelAPI, while it doesn't support BIFF5 it does support BIFF8 (Excel 97 – 2003) and OOXML (Excel 2007). It is slower than native JXL let alone Excel & COM but it features active formula evaluation, although at the moment (v. 3.8) not all Excel functions have been implemented. Obviously, as new functions are added in every new Excel release it's hard to catch up for Apache POI. I've made the relevant subfunction (xls2jpoi2oct) fall back to cached formula results (and yield a suitable warning) for non-implemented Excel functions while reading Excel files.
OpenXLS (an open source version of Extentech's commercial Java-xls product) is still experimental. It seems to work faster than JExcelAPI, but it has other issues - i.e., it locks the .xls file and the unlocking mechanism is a bit wonky. Sometimes xls files keep being locked until Octave is shut down. Currently OXS write support is disabled (but the code is there).
UNO (invoking OpenOffice.org or clones behind the scenes, a la ActiveX) is experimental. It works FAST (i.e., once OOo itself is loaded which can take some time) and can process much larger spreadsheets than the other Java-based interfaces because the data are not entered in the JVM but in OOo's memory. A big stumbling block is that odsclose() on a UNO xls struct will kill ALL OpenOffice.org invocations, also those that were not related to Octave! This is due to UNO-Java limitations. The underlying issue is that when Octave starts an OpenOffice.org invocation, OpenOffice.org must be closed for Octave to be able to exit; otherwise Octave will wait for OOo to shut down before it can terminate itself. So Octave must kill OOo to be able to terminate. A way out hasn't been found yet.
All in all, of the three Java options I'd prefer Apache POI rather than OpenXLS or JexcelAPI. But the latter is indispensable for BIFF5 formats. Once UNO is stable it is to be preferred as it can read ALL file formats supported by OOo (viz. wk1, ods, xlsx, sxc, ...)
OCT offers read support for OOXML files (.xlsx) only, but it is by far the fastest read option; faster than Excel itself.
Some notes on the choice for Java:
- It saves a LOT of development time to use ready-baked Java classes rather than developing your own routines and thus effectively reinvent the wheel.
- A BIG advantage is that a Java-based solution is platform-independent ("portable").
- But Java is known to be not very conservative with resources, especially not when processing XML-based formats.
So Java is a compromise between portability and rapid development time versus capacity (and speed). But IMO data sets larger than 5.10^5 cells should not be kept in spreadsheets anyway. Better use real databases for such data sets.
Some hints for troubleshooting Excel support are contained in this thread: http://sourceforge.net/mailarchive/forum.php?thread_name=4C61B649.9090802%40hccnet.nl&forum_name=octave-dev dated August 10, 2010. A more structured approach is below.
Since April 2011 a special purpose setup file has been included in the io package (chk_spreadsheet_support.m). Large parts of the approach below (starting at Step 2) have been automated in this script. When running it with the second input argument (debug level) set to 3 a lot of useful diagnostic output will be printed to screen.
- Check if COM / ActiveXworks (only under Windows OS). Do a pkg list and see:
- If there's a windows package mentioned (then it's installed). If not, install it.
- If there's an asterisk on the windows package line (then the package is loaded). If not, do a pkg load windows
- Check if the ActiveX server works. Do:
- exl = actxserver ('Excel.Application') ## Note the period between 'Excel' and 'Application'
- If a COM object is returned, ActiveX / COM / Excel works. Do:
exl.Quit(); delete (exl) ## to shut down the (hidden) Excel invocation.
- If you get an error message, your last resort is re-installing the windows package, or trying the Java-based interfaces.
- Check if java works. Do a pkg list and see:
- If there's a java package mentioned (then it's installed). If not, install it.
- If there's an asterisk on the java package line (then the package is loaded). If not, do a pkg rebuild -auto java
- Check Java memory settings. Try
- If it works, check if it reports sufficiently large max memory (had better be 200 MiB, the bigger the better)
- If it doesn't work, do:
- rt = java_invoke ('java.lang.Runtime', 'getRuntime')
- rt.gc
- rt.maxMemory ().doubleValue () / 1024 / 1024 ## show MaxMemory in MiB.
- In case you have insufficient memory, see in "GOTCHAS", "Java memory pool allocation size", how to increase java's memory pre-reservation.
- Check if all classes (.jarfiles) are in class path. Do a 'javaclasspath' (under unix/linux, do 'tmp = javaclasspath; strsplit (tmp,":")' (w/o quotes). See above under "REQUIRED SUPPORT SOFTWARE" what classes should be mentioned.
- If classes (.jar files) are missing, download and put them somewhere and add them to the javaclass path with their fully qualified pathname (in quotes) using javaaddpath().
- Once all classes are present and in the javaclasspath, the xls interfaces should just work. The only remaining showstoppers are insufficient write privileges for the working directory, a wrecked up octave or some other problem outside octave.
- Try opening an xls file:
- xls1 = xlsopen ('test.xls', 1, 'poi'). If this works and xls1 is a struct with various fields containing objects, the Apache POI interface (POI) works. Do an xls1 = xlsclose (xls1) to close the file.
- xls2 = xlsopen ('test.xls', 1, 'jxl'). If this works and xls2 is a struct with various fields containing objects, the JExcelAPI interface (JXL) works as well. Don't forget to do xls2 = xlsclose (xls2) to close the file.
xlsopen/xlsclose and friends have been written so that adding other interfaces (Perl? native octave? ...?) should be very easily accomplished. Xlsopen.m merely needs two stanzas, xlsfinfo.m and getusedrange.m each need an additional elseif stanza, and xlsclose.m needs a small stanza for closing the pointer struct and writing to disk. The real work lies in creating the relevant xls2<...>2oct & oct2<...>2xls & <getusedrange_...> subfunction scripts in xls2oct.m, oct2xls.m and getusedrange.m, resp., but that shouldn't be really hard, depending on the interface support libraries' quality and documentation. Separating the file access functions and the actual reading/writing from/to the workbook in memory has made developer's life (I mean: my time developing this stuff) much easier.
Some other options for development (who?):
- Speeding up, especially Java worksheet/cell access. For cracks, not me.
- Automatic conversion of Excel date/time values into octave ones and vice versa (adding or subtracting 636960). But then again Excel's dates are 01-01-1900 based (octave's 0-0-0000) and buggy (Excel thinks 1900 is a leap year), and I sometimes have to use dates from before 1900. Maybe as an option?
- Creating Excel graphs (a significant enterprise to write from scratch).
- Support for "passing function handle" in xlsread.
OCT interface
Since io package version 1.2.4, an interface called "OCT" was added. Except for unzip, it has no dependencies. It's still experimental but fast! Feel free to test it and give us a feedback. Currently it supports reading and writing .xlsx, .ods and .gnumeric files (the latter in yet-to-be-released io-2.2.2). If
chk_spreadsheet_support == 0
it's used automatically (default interface). Otherwise you can force the usage like
m = xlsread ('file.xlsx', 1, [], 'OCT');
Since io package version 2.2.0, the "OCT" interface has experimental write support for .xlsx and .ods formats, since io-2.2.2 (expected mid-May 2014) also for gnumeric. If you can't wait for gnumeric I/O you can checkout a snapshot from svn (see octave.sf.net, http://sourceforge.net/p/octave/code/HEAD/tree/trunk/octave-forge/main/io/)


text:
- This event has passed.
Letters to Santa
December 1, 2021 at 8:00 am - 4:00 pm
An event every day that begins at 8:00 am, repeating until December 17, 2021
Do you have a special request from the Big Man at the North Pole?
Greene County Parks & Trails will be helping the elves at the North Pole by responding to Christmas letters from November 16th through December 11th. Send in your Christmas list or a holiday wish and wait for a return letter on the official letterhead of the North Pole. This is a FREE program.
Mail a letter to:
Santa & Mrs. Claus
c/o Greene County Parks & Trails
635 Dayton-Xenia Road
Xenia, Ohio 45385 For more information call (937) 562-6440.
No Registration Required
No Fees
Greene County Parks & Trails – Reservations (gcparkstrails.com)


text:
Are There Levels Of Domestic Violence
Sometimes both those who are knowledgeable of domestic violence and those who still have a lot to learn about the subject contemplate if there are various levels of domestic violence. For a long time I actually vacillated between confusion and guilt. I was verbally abused. I was emotionally abused. Later, I was grabbed by my30


text:
WASHINGTON (Reuters) - The U.S. Supreme Court on Monday upheld the right of government entities across the United States to allow sectarian prayers prior to public meetings.
The court said on a 5-4 vote that the town of Greece in New York state did not violate the U.S. Constitution's ban on government endorsement of religion by allowing prayers before its monthly meetings.
In a decision that is likely to guide how local governments throughout the United States handle the question, the court said that officials in Greece did not violate the law when picking prayer-givers, who were overwhelmingly Christian.
Even the plaintiffs challenging the practice in the Rochester, New York, suburb of 100,000 people, conceded that some types of nonsectarian prayers were permitted under the Constitution.
The difficulty facing the justices was how to decide how courts should consider when a prayer could violate the First Amendment, which requires the separation of church and state.
The court was divided along ideological lines, with the conservative wing of the court saying the prayers were acceptable, while the liberal justices said the practice violated the First Amendment.
Justice Anthony Kennedy, the court's swing vote, wrote the majority opinion, saying the town's prayers were consistent with the high court's 1983 precedent in a case called Marsh v. Chambers. That case allowed prayers before legislative sessions based in large part on the historical nature of the practice.
Although the policy in the town of Greece does not embrace a particular religion, in practice all members of the public who gave a prayer were Christians until some residents filed suit in 2008.
Kennedy wrote that public prayers need not be nonsectarian.
"To hold that invocations must be nonsectarian would force the legislatures that sponsor prayers and the courts that are asked to decide these cases to act as supervisors and censors of religious speech," Kennedy wrote.
Residents Susan Galloway, who is Jewish, and Linda Stephens, an atheist, filed the suit, saying the practice made them uncomfortable.
The court ruled that the content of the prayers did not constitute coercion, although the majority was divided on the legal rationale on that point.
Kennedy wrote that "offense ... does not equate to coercion."
Writing on behalf of the four liberals, Justice Elena Kagan said that for years the Greece prayers were sectarian and the town did nothing to encourage members of other faiths to give the prayers.
"In my view, that practice does not square with the First Amendment's promise that every citizen, irrespective of her religion, owns an equal share in her government," she wrote.
The Alliance Defending Freedom, a conservative legal group that represented the town, welcomed the ruling.
"The Supreme Court has again affirmed that Americans are free to pray," said David Cortman, one of the organization's lawyers.
The case reached the high court after the 2nd U.S. Circuit Court of Appeals in New York ruled against the town in May 2012. A district court had previously supported the town's position by dismissing the lawsuit filed by Galloway and Stephens.
The case is Town of Greece v. Galloway, U.S. Supreme Court, No. 12-696.
(Editing by Howard Goller and Bernadette Baum)


text:
Drop What You're Doing & Go Wash Your Pillows Immediately
Washing pillows may not be the most glamorous of household chores, but it's something we should all probably be doing more often.
"If you think about the life of a pillow (and I would rather not), it does absorb sweat, dust, dust mites, hair oil...I could go on, but I won't," says Christina Strutt, a former Vogue Living editor who has written about nontoxic cleaning in her book A Guide to Natural Housekeeping and lifestyle website Cabbages & Roses. Sloughed skin cells and bacteria from saliva are two more nasties that could be added to the list, and Marilee Nelson, the co-founder of nontoxic cleaning line Branch Basics says that exposure to them could disrupt sleep and exacerbate allergies.
Here's a primer on how to wash your pillows so they're a portal to sweet dreams, not allergy-induced nightmares.
First things first: How often should you be washing your pillows?
As is the case with bedsheets, you should be washing your pillowcases once a week. You can get away with washing your actual pillows every three to six months, Nelson says, as long as you have a dust mite barrier protector under your pillowcases to keep out mites, bedbugs, and all the other critters you don't want anywhere near your head. Make sure your barrier has a zipper and stays fully closed, always.
How to clean them with a washing machine.
First things first, you should check the pillow's tag to see if it has any special care instructions. (Organic cotton and latex pillows, for example, are finicky when it comes to washing.) If your pillow is machine washable, here's Nelson's formula for a deep clean:
- Wash on a gentle cycle with nontoxic liquid laundry cleaner like Branch Basics and a cup or two of vinegar. (This guide will give you an overview of what to avoid in detergents. Namely: chlorine bleach and sodium borate.)
- Use a low-heat setting for synthetic pillows and no-heat setting for feather or down pillows.
- Be sure to wash at least two pillows at a time, so they don't get knocked around too much.
- Run pillows through a second wash cycle with only water to make sure all soap is removed.
- If you have them, you can throw in a few wool dryer balls in with the pillows to speed up drying time and keep the materials from clumping.
- When they're ready, you can leave your pillows outside to air dry in the sun for a deeper refresh (but not if they're latex...more on that later).
How to clean pillows by hand.
If you don't have a laundry machine at your disposal, you can go through a similar process in the bathtub. Fill your tub with water and add your detergent and vinegar (Strutt also likes to throw in a scoop of baking soda for its deodorizing properties), massage your pillows underwater for a few minutes, and then wring them out to dry. You can run fresh water over them to make sure all the soap is out, and then place them flat outside to dry. It's super important that they are totally dry before you bring them back into bed, or else they could get moldy.
More best practices for keeping your pillows spick-and-span.
In between washings, you can give your pillows a quick refresh by putting them in the dryer on low heat with your dryer balls. (Pro tip: Adding a few drops of essential oils to your dryer balls will make your pillows smell like heaven.) You can also just put your pillow out in the sun—but not if it's latex. "Never put raw latex in the direct sun," cautions Nelson. "It will yellow and disintegrate quickly and will exacerbate the latex smell." If your latex pillow is covered in a cotton or wool pillowcase, though, it should be OK.
How often should I be replacing my pillows?
"Typically pillows should be replaced every one to two years depending on the material," Nelson says, adding that you should write the date of purchase on your pillow's tag so you remember when the time has come to replace it. Lumps and lingering odors are signs that it's time for a new one—as are stiff necks, headaches, and sneezes upon waking. This is the longest Nelson recommends keeping every type of pillow:
- Latex pillows: 2 to 3 years
- Down pillows: 2 years
- Feather pillows: 12 to 36 months
- Synthetic down pillows: 18 to 24 months
- Polyester pillows: 6 to 24 months
If you're in the market for a new pillow, here are a few high-rated, organic options to check out:
Organic pillows
Emma Loewe is the Sustainability and Health Director at mindbodygreen and the author of Return to Nature: The New Science of How Natural Landscapes Restore Us. She is also the co-author of The Spirit Almanac: A Modern Guide To Ancient Self Care, which she wrote alongside Lindsay Kellner.
Emma received her B.A. in Environmental Science & Policy with a specialty in environmental communications from Duke University. In addition to penning over 1,000 mbg articles on topics from the water crisis in California to the rise of urban beekeeping, her work has appeared on Grist, Bloomberg News, Bustle, and Forbes. She's spoken about the intersection of self-care and sustainability on podcasts and live events alongside environmental thought leaders like Marci Zaroff, Gay Browne, and Summer Rayne Oakes.


text:
ANN ARBOR, Mich. – Michigan added Arkansas, Brigham Young and Hawaii to its future football schedules on Tuesday.
Notre Dame opted out of scheduled 2015-17 games last month against Michigan ahead of a previously scheduled break in the rivalry during the 2018-19 seasons. The Wolverines essentially replaced two matchups with the Fighting Irish with a game against BYU in 2015 and against Hawaii the next season, leaving a spot to fill in 2017.
Michigan will play the Razorbacks at home in 2018 and on the road the next year. The two teams have met only once, in the 1998 Citrus Bowl.
The Wolverines finished their 2015 schedule by adding BYU and the 2016 slate with games against Hawaii, Miami (Ohio) and Ball State, where Brady Hoke played football and was a first-time head coach.


text:
Hamlin Lake--A Lake for All Seasons
Hamlin Lake is located 4 miles north of Ludington, Michigan.
If you're looking for a fun, inexpensive family vacation, then Hamlin Lake is where you want to be. It offers terrific summer recreation, including swimming, boating, tubing, and fishing. At more than 12 miles long and 5,000 acres large, there's more than enough space for everyone without feeling crowded. This man-made lake originated during the logging hey-day when lumbermen dammed the Big Sable River to make an enormous holding pond for trees felled upstream.
About Hamlin LakeLocated along the western shore of Hamlin Lake is the Ludington State Park. Within the park is the Hamlin Dam, a great spot for catching salmon in the fall. The sandy shoreline of Hamlin Lake Beach is popular with swimmers and sunbathers. It features picnic lawns, concession stands, and restrooms. From here you can begin your walk on a hiking path, or rent a canoe or kayak and take a leisurely glide on marked paths that meander along the state park's shoreline. Hamlin Lake touches the Manistee National Forest on the north, towering dunes in the west and miles of undeveloped wilderness all around. The eastern shoreline of Hamlin Lake is filled with family-friendly resorts and cottages...many with marinas where you can launch your boat or rent one for the day.
Read our story to learn about the history of Hamlin Lake.
Hamlin Lake Sand Dunes & Natural BeautyThe northern shore of Lower Hamlin Lake is comprised of beautiful sand dunes. It's a great place to anchor your boat just off shore and enjoy sunning or sandy-bottom swimming. Climb the dunes for a magnificent view of Hamlin Lake and Lake Michigan. Just to the west of the dunes, you can land your boat at the shoreline and follow a trail into the Ludington State Park and the Hamlin Lake dam.
FishingThe fishing is great on Hamlin Lake! Whether you traverse the bayous or head for deeper waters, Hamlin Lake offers a smorgasbord of fish. Tiger muskie, northern pike, large and small mouth bass, perch, crappie, bluegill and over 600,000 walleye, planted several years ago, promise a superb catch. The fishing doesn't cool down in winter either. Tip-ups and shanties dot the ice as fishermen pull in delicious panfish and walleye.
Four Seasons of Fun!
Hamlin Lake is a wonderful destination during the warmer months, but winter is beautiful as well. During the winter, ice-shanties are scattered on the frozen lake and you can participate in a local ice-fishing tournament. Winter also means ice-skating and cross-country skiing on miles of groomed trails along Hamlin Lake and through Ludington State Park's frozen wilderness, truly making Hamlin a lake for all seasons.
Hamlin Lake Area Festivals & EventsAny season--any time--Hamlin Lake is where you want to be. We have listed our area events in our festivals & events story so you can see at a glance what's happening when. You can get event details by checking our calendar of events pages and selecting a specific month. There's always something fun going on, no matter what time of year. You'll never be bored around Hamlin Lake!
Some of Hamlin Lake's Top Events
Friendly Businesses to Serve You!When you visit a community away from home, it's typical to find yourself eating out, shopping, or looking for things to do. Hamlin Lake merchants are happy to serve you with a smile! So, take some time and discover the many businesses ready to entertain you, or to provide you with a variety of services.
Quick Links for Hamlin Lake Businesses
So Much to Discover About Hamlin Lake...
- Hamlin Lake--A Lake for All Seasons
- History of the Village of Hamlin Near Ludington, Michigan
- Hamlin Lake Water Levels Now Being Raised
- Explore the Sand Dunes of Hamlin Lake
- Explore Hamlin Lake with a Boat Rental
- History of the Wrens Roost on Hamlin Lake
- Hamlin Lake Prime Spot for Ice Fishing
- Head to Hamlin Lake for the Hottest Ice Fishing!
Thank you for visiting our website!
Please "Like" Us at Facebook.com/HamlinLake
More Hamlin Lake Area Websites...
Hamlin Lake Specialty Websites
Destinations Near Hamlin Lake
- Ludington
- Pentwater
- Scottville
- Pere Marquette River
- Silver Lake Sand Dunes
- Manistee County
- Benzie County
- Leelanau County
Hamlin Lake is just four miles north of Ludington, which is along the route of the Lake Michigan Circle Tour.
local advertisement


text:
AwardOptionsSM allow traders to buy and sell the Oscar nominees with
exclusive Hollywood Derivatives centered on the 95th Academy Awards. The AwardOptions will halt trading at
1 p.m. Pacific on Sunday, March 12th, in preparation for the awards ceremony to be held that evening.
The AwardOption for the winner will cash out at H$25.00, while those failing to win will delist at H$0.00.
|Hollywood Dollars®Change Today
|There are currently no active securities of this type.


text:
Sometimes we take heat for deliberately not implementing certain Web platform features. Three significant examples are SVG Fonts, WebSQLDatabase and H.264 in <video>.
SVG Fonts --- at least the subset implemented in Opera and Webkit --- don't offer anything significant over downloadable Opentype (or WOFF) fonts ... except the last three points of the Acid3 test :-(. And people keep asking for it "because it's in SVG 1.1". But I don't think those are good enough reasons on their own to make SVG Fonts an essential part of the Web platform.
WebSQLDatabase has a completely different problem. It's the only way of doing structured, queryable client-side storage in any browser right now, and a lot of mobile apps targeting Webkit-based browsers use it. The problem with WebSQLDatabase is that it isn't good for the Web, because it depends completely to the semantics and query planning of SQL as implemented by SQLite --- which is a somewhat quirky SQL implementation.
The pros and cons of H.264 have been well documented in this blog and elsewhere...
SVG Fonts and WebSQLDatabase would actually be very easy for us to implement. SQLite is already embedded in Firefox and even exposed to non-Web Javascript. The SVG Fonts subset implemented by Opera and Webkit is very simple. We could even support H.264 by hooking into specific codecs that may be present on various platforms (I think; the licensing for platform codecs is rather vague). It's certainly tempting to just cave in, implement these features, and move on. The people who complain that we're lazy, stubborn, or just wrong would move on or find something else to complain about. If we were only interested in market share, that's definitely what we'd do. But I honestly think we're doing the Web a service by resisting these things.
I think not implementing certain features is one of the hardest and most altruistic things we do.
Update I should also point out that we're not just exerting "stop energy" here; for each of these features that we're not adding, we are promoting superior alternatives --- namely WOFF, IndexedDB, and WebM.