Friday, June 11, 2010

Understanding the Complete Blood Count (CBC)

I got a blood test, a CBC.  I had never paid attention to these things before, but now I decided that perhaps I should.  Tracking down plausible explanations that I could understand took some work, so I thought I would record it for future reference by myself and others.  MedlinePlus describes itself as "a service of the U.S. National Library of Medicine and the National Institutes of Health."  I was under the general impression that these were reliable sources of information, so I decided to lean toward whatever information I could get from MedlinePlus, supplemented as needed by other sources.

An important consideration to keep in mind, for many of the measures discussed in this post, is the occurrence of change.  Doctors sometimes speak of doing the tests so as to establish a baseline, so that a later test can help to detect whether a certain value is changing in an unwelcome direction, even if it does still remain within the generally accepted boundaries.

Components of the CBC

MedlinePlus said that a Complete Blood Count (CBC) measures the numbers of red blood cells (RBCs), white blood cells (WBCs), and usually platelets (PLTs); the total amount of hemoglobin (Hb or HGB); the hematocrit (Ht or HCT) (defined as the fraction of the blood composed of red blood cells); and information about the average red blood cell size (MCV), the amount of hemoglobin per red blood cell (MCH), and the amount of hemoglobin relative to the size of the cell (hemoglobin concentration) per red blood cell (MCHC).

I didn't know much about any of those things.  I was also confused because one of the lab reports I was looking at was apparently more than a CBC.  It had things that weren't on that list (above), things like "NE%" and "MO#."  That document said it was a "CD A" sample type, but my search for something explaining a "CD A" blood sample went nowhere. MedlinePlus didn't seem to have anything on blood NE and MO. Eventually I found a Laboratory Procedure Manual that suggested that I was looking at the results of a "CBC with Five-Part Differential."  This manual was prepared by NHANES, which turned out to be short for the National Health and Nutrition Examination Survey.

I did a search for the five-part differential CBC.  Among the top hits, the Free Dictionary said that this was "A standard automated differential count of WBCs generated by an automated hematology analyzer--AHA from the peripheral circulation, which divides WBCs into neutrophils--PMNs, eosinophils, basophils, lymphocytes, monocytes."  So apparently I was looking at abbreviations for that list of neutrophils:  NE, EO, BA, LY, and MO.

This seemed to be what I needed to understand the letters on my lab report.  Now I needed to figure out how to interpret the numbers. MedlinePlus seemed to indicate that the main focus was on red (RBC) and white (WBC) blood cells and hemoglobin (HGB).  Likewise, much of the information that appeared on my CBC with Five-Part Differential seemed to focus on details about RBCs and WBCs.  I decided to start with RBCs.


CBC Interpretation, Part 1:
Red Blood Cell Measures

Various sources (e.g., MedlinePlus, MedicineNet, Laura Dean of the National Center for Biotechnology Information) listed several measurements related to RBCs.  These included the RBC count itself, as well as HGB, HCT, MCV, MCH, MCHC, and red cell distribution width (RDW).  This section discusses these measures.

Red Blood Cell Value 1:  RBCs

According to MedlinePlus and my lab report, the red blood cell count (RBC) should be between 4.70 and 6.10.  This differed somewhat from that Laboratory Procedure Manual, which I had now located in PDF form.  On pages 29-30, the manual provided these "Reference Ranges (Normal Values)" for the items I was looking at (depending on your screen's resolution, you may want to click on the chart or hit Ctrl-+ to make it larger):



So as a fiftyish male, this chart said my RBC should be between 4.10 and 5.80 million (i.e., 10^6) cells per microliter (i.e., uL or μL) of blood.  The lab report I was looking at did not state my race, weight, or other information that might have explained why their values differed from those of the chart.  MedlinePlus did say that most of these counts would vary with altitude.  As another point of comparison, WebMD agreed on a range of 4.70 to 6.10, with somewhat lower values for women and children (but still not as low as those shown in the chart, above). MedicineNet didn't distinguish by age or gender; they just said the normal range was about 4.2 to 5.9.  Wikipedia provided a chart showing that different sources set the upper limit for adult males, for instance, to anywhere between 5.7 and 6.9.  These variations seemed odd, given Wikipedia's statement, elsewhere, that normal ranges in blood data tended to mean the range in which 95% of the normal population fell. LabTestsOnline said that a reading slightly outside the reference range might not matter; they said that a doctor might respond to that sort of thing by re-running the CBC.

MedlinePlus named a variety of reasons why a person might have an abnormally high or low RBC count.  Examples on the high side included smoking, congenital heart disease, and kidney tumor.  Examples on the low side included leukemia, malnutrition, and overhydration.  A New York Times article provided a longer list.  For all of these tests, certain medications could also affect the counts. LabTestsOnline said, "Fatigue may indicate a low or high RBC count. Fainting, pallor, shortness of breath, dizziness, and/or altered mental status can also indicate low RBCs. Disturbed vision, headache, and flushing may be present with increased numbers of RBCs."

Several searches failed to give me a clear picture of what would count as an extreme or danger-level RBC -- as distinct from, say, one that was abnormal but not really frightening.  Of these various searches, the most promising appeared to be the one in which I named specific problems (e.g., smoking); but it still wasn't getting me anywhere fast. At a certain point, I noticed that the Laboratory Procedure Manual (above) named "panic values" for several other measures (see below) but not for RBCs.  It seemed, then, that RBC values themselves were a sort of art, with doctors varying in their appreciation for or alarm at a given value.  After quite a bit of effort to learn more than that, I decided to move on and see what insight might emerge from other, apparently more precise measures related to RBCs.

Red Blood Cell Value 2:  HGB
(with a comment on the quality of information provided online)


Going down the list in the chart (above), hemoglobin (HGB) for a fiftyish male was apparently supposed to be in the range of 12.7 - 17.1 grams per deciliter (i.e., tenth of a liter) (g/dl).  My lab report said 14.0 - 18.0, however;  MedlinePlus said 13.8 - 17.2 for males generally; MedicineNet said 13.0 - 18.0; and Wikipedia, apparently not yet updated for the several sources just cited, said that sources ranged from a low of 13.0 to a high of 17.5. The National Anemia Action Council stated that the U.S. Food and Drug Administration prohibited blood donations by men with hemoglobin below 13.0.  The Laboratory Manual (above) named "panic values" of 6.5 on the low end and 18.0 on the high end. Ron Kennedy suggested that hemoglobin values under 5 "gm" [sic] may cause heart failure, and values over 20 gm may cause clogging of capillaries.  Mayo Clinic research has linked low hemoglobin with Parkinson's Disease 20 to 30 years later.

When I sought information about symptoms of low or high hemoglobin, I noticed (as I had noticed in other searches) that the top  Google results tended to come from sites with names like eHow.com and Buzzle.com, and that frequently the answers were as much opinion as knowledge -- or, in a glorified version of this phenomenon, from places like Wellsphere, owned by HealthCentral, whose management team appeared to include no doctors and almost nobody with doctoral degrees of any kind.  Wellsphere's own management team included just one doctor; likewise its board of advisors.  A search for symptoms of low or high hemoglobin brought me very few hits from non-commercial websites.  One problem with a commercial orientation in health information was, of course, the potential for conflicts of interest, such as those involving funding or advertising that involves pharmaceutical companies and health care equipment providers.

There seemed to be, in other words, a gap between the information needs of the public and the orientation of the medical profession -- a void that seems to invite individuals from other backgrounds. As a relatively benign example,  Sandy Rothra at eHow.com pointed toward an American Red Cross page that described anemia as the medical term for low hemoglobin.  But things did not appear to be that simple. According to the Iron Disorders Institute, it was possible to have too little iron (equated with low hemoglobin on that Red Cross page) and yet have too much iron at the same time.  WrongDiagnosis.com said there were many types of anemia; and as with RBCs (above), MedlinePlus indicated that low HGB can be due to a variety of sources, including not only anemia but also bleeding, leukemia, malnutrition, and overhydration, and that high HGB could be due to congenital heart disease, dehydration, and low blood oxygen.  Those conditions could have varying creauses and symptoms. Equating anemia with low hemoglobin, Ms. Rothra claimed that "Patients most often complain of fatigue and weakness with a low hemoglobin count, according to the National Heart, Lung and Blood Institute."  But the NHLBI page that Ms. Rothra cited was referring specifically to iron-deficiency anemia, not to low hemoglobin generally.  Equating them could be dangerously misleading.  A person is not going to fix leukemia by taking One-a-Day Multiple Vitamins with Iron.  Elsewhere, the NHLBI did make clear that anemia and low hemoglobin are not synonyms.

According to California Pacific Medical Center, symptoms of low hemoglobin include shortness of breath while doing simple tasks, fatigue, paleness, chilliness, dizziness, irritability, headache (to which Stephan added ringing in the ears).  That did substantially match up with the NHLBI's list of symptoms of iron-deficiency anemia, although the latter also included chest pain (and, in children, poor appetite, slowed growth and development, and behavioral problems).  About-Blood-Disorders.com stated that anemia could also produce rapid heartbeat and weakness. The Iron Disorders Institute added depression, sore tongue, restless legs syndrome, and loss of interest in work, recreation, relationships, and intimacy.  It appeared that the intensity or reliability of such symptoms could vary greatly according to the degree of low hemoglobin; one study of pregnant women in Liberia found significantly lower HGB levels in those who complained of headaches.  Causes of iron deficiency (which, again, is not strictly identical to low hemoglobin) could include age; gender; ethnicity; consuming foods or substances that impair iron absorption (e.g., coffee, milk, calcium supplements, eggs, chocolate, aspirin, antacids); being a super blood donor; certain diseases and disorders (e.g., sickle cell anemia, diseases of the digestive tract or endocrine system, gastric banding, bulimia); inadequate iron intake (e.g., strict vegetarianism); excessive aerobic exercise; certain chemicals (e.g., lead); drug abuse (including pain medications and alcohol); surgery; and infection.

On the high side, symptoms of "iron overload" could include chronic fatigue, joint pain, abdominal pain, liver disease (cirrhosis, liver cancer), diabetes mellitus, irregular heart rhythm, heart attack or heart failure, skin color changes (bronze, ashen-gray green), loss of period, loss of interest in sex, osteoarthritis, osteoporosis, hair loss, enlarged liver or spleen, impotence, infertility, hypogonadism, hypothyroidism, hypopituitarism, depression, adrenal function problems, early onset neurodegenerative disease, and elevated blood sugar.  Note that both over- and under-supply of iron could thus produce some of the same symptoms. Causes of iron overload could include excessive iron shots, supplements, or blood transfusions; excessive amounts of foods that contain or enhance iron absorption (e.g., red meat, supplemental vitamin C, alcohol, sugar); regular tobacco smoke or use; risk factors for metabolic syndrome that heighten the risk of type 2 diabetes and cardiovascular diseases; inherited iron-loading conditions (e.g., hemochromatosis); exposure to iron-containing asbestos; and working and/or living in subways, iron smelters, coal mines, and highly polluted areas.

Red Blood Cell Value 3:  HCT

Hematocrit (HCT) was next on the list in the chart (above). For a man (especially, I now assumed, a white man) in his 50s, the chart said I should be in the range of 38.0% to 50.3%.  As noted above, this was the percentage of the blood composed of red blood cells.  Wikipedia said that various sources had put the range from as low as 39% to as high as 62%, but on a different page stated that it was normally about 48% in men.  MedlinePlus said 40.7% to 50.3%. In terms of danger zones,  Bloodbook indicated, without citation, that the body can typically compensate for a loss of as much as 70% of its red blood cell mass, which would mean an adult male hematocrit as low as 14% (i.e., 30% of 48%), though of course it might be advisable to ask what in the world was causing that level. Random sources suggested that a hematocrit might be considered very low below 30% or below 24%, and that a hematocrit around 34% would be moderately low.  That said, people with hematocrits below 38% were reportedly prohibited from donating blood, even though 36% would still be considered healthy for women (with other levels for children and pregnant women).

According to MedlinePlus, a low hematocrit could result from certain diseases (e.g., lupus erythematosus, rheumatoid arthritis, kidney disease, leukemia, multiple myeloma), blood loss, bone marrow failure, or malnutrition. Wikipedia cited additional conditions specific to women and children. Symptoms of low hematocrit did not appear to be markedly different from those of other red blood cell deficiencies summarized above, although again I was struggling to find credible sources of relevant information.  For instance, the top items on my Google search came from HomeRemediesForYou.com and the aforementioned Wellsphere.

On the high side, one book (p. 385) indicated that 60% would be quite high; another random source considered 60% "extreme." A Merck webpage stated that a high hematocrit was considered an indicator of a disease called polycythemia vera:  "Without treatment, about half of the people who have polycythemia vera with symptoms die in less than 2 years. With treatment, they live an average of 15 to 20 years."  Tamer Fouad said, "A hematocrit greater than 60% is always associated with an increase of RBC mass and is diagnostic of polycythemia. For hematocrit values of 50% to 60%, the diagnosis of polycythemia requires direct measurement of the RBC mass."  According to MedicineNet, though, polycythemia vera is extremely rare in the U.S., occurring in about one person per million; but there are other kinds of polycythemia.  In the familiar list, but with some variations, they said that symptoms of high hematocrit included weakness, fatigue, headache, itching, bruising, joint pain, dizziness, or abdominal pain, and that risk factors included smoking, chronic lung disease, chronic carbon monoxide exposure, living at high altitudes, and certain genetic mutations.  MedlinePlus said that a high hematocrit could also result from dehydration, kidney disease, congenital heart disease, and other disorders (especially cor pulmonale and pulmonary fibrosis).

Red Blood Cell Values 4, 5, 6, and 7:  MCV, MCH, MCHC, and RDW

MedlinePlus combined its treatment of average red blood cell size (MCV), hemoglobin amount per red blood cell (MCH), and the amount of hemoglobin relative to the size of the red blood cell (MCHC). These three, it said, were RBC indices, and their purpose was to diagnose the type of anemia.  In my understanding of the Encyclopedia of Surgery, these three, as well as the red cell distribution width (RDW), could be calculated on the basis of other values described above, without requiring additional measurements.  As calculated values, it did not appear that these figures would be presented in any terms other than those that were standard for the measures (e.g., femtoliters), so I did not dwell upon their terms of expression. That is, I just focused on the values, without paying much attention to what they represented or how they were calculated. For that purpose, MedlinePlus and MedicineNet stated normal values for MCV (80-100), MCH (27-31 or 27-32), MCHC (32-36), and RDW (11-15).

I was not anemic, so I was not really concerned about these indices.  I was curious, though, about the fact that my lab report nonetheless stated low and high values for them.  Would there be any significance to a low or high value for one of these submeasures even without anemia -- or were they meaningful only for people with anemia?  My question, and my search, revealed what I was recognizing, by now, as the usual public uncertainty about what the measures meant in various circumstances.  (As the reader may have surmised, my lab report did not even come with an explanatory brochure, much less a comprehensive interpretive guide.)

For this one, I went into the medical literature, rather than relying on popular reports.  I encountered the interesting case reported by Rao et al., in which a 23-year-old lifelong vegetarian met DSM-IV criteria for major depressive disorder with psychotic symptoms.  Rao et al. refer to research indicating that Vitamin B12 (cobalamin) deficiency could result in psychiatric symptoms that precede hematological symptoms by as long as eight years.  In other words, mental condition can warn of dietary shortcomings long before they are manifested in the blood.  Symptoms of B12 deficiency could include depression, apathy, irritability, dementia, catatonia, delirium, and hallucinations.  The client had low hemoglobin (11.9), high MCH (43.9), high MCHC (36.2), high MCV (121.1), and low B12. According to MedlinePlus, the high MCV would meet the definition of macrocytic anemia, and the high MCH would meet the definition of hyperchromic anemia -- which could be described, together, as macrocytic hyperchromic anemia. I found this case useful for helping me to gain a degree of orientation to the discussion, and also for its discussion of relevant research, as just summarized. That case did feature anemia.

In another case, however, Maamar et al. identified a 33-year-old woman whose RBC tests were all normal, but who was experiencing a neuropsychiatric disorder without anemia -- resolved, again, with B12 injections.  Maamar et al. cited some apparently classic work by Lindenbaum et al. in which, they said, patients in a number of cases had abnormal HGB and/or MCV without anemia.  In a very different direction, Cavusoglu et al. found that high RDW was "a strong and independent predictor of all-cause mortality . . . [among men] referred for coronary angiography."  So I concluded that abnormal values in at least some of these RBC indices -- MCV, MCH, MCHC, and/or RDW -- could signal issues even without anemic values of RBC, HGB, or HCT.  I didn't investigate all of the possible things that various combinations of high and low values of these RBC indices might indicate.

CBC Interpretation, Part 2:
White Blood Cell Measures

As with RBCs, there seemed to be several different WBC measurements in the CBC with Five-Part Differential.  Or as About.com corrected me, there were five different types of WBCs: neutrophils, lymphocytes, monocytes, eosinophils, and basophils. According to MedlinePlus, these were counted via the Blood Differential test.  This terminology led me to think that apparently a regular CBC, without the Five-Part Differential, would include the foregoing RBC measures but would not include anything for WBCs other than the overall WBC count. I verified this by checking a MedlinePlus webpage on the CBC, and also by taking a look at a report of an older blood test in my file from another medical center (described, in that case, as a hemogram).  It had all of the other values discussed above, but not these five components of the Blood Differential test.

White Blood Cell Value 1:  WBCs

The purpose of RBCs is to carry oxygen; the purpose of WBCs is to fight infection.  According to MariAnne, a senior nurse in Adelaide, the ratio of RBCs to WBCs is about 700:1.  MedlinePlus said that a normal WBC count would be in the range of 4,500 to 10,000 white blood cells per microliter (mcL).  My lab report put the range somewhat higher, at 4.8 to 10.8 (thousand).  For my age group, the chart (above) stated a broader range of 3.9 - 12.1. Wikipedia said that various sources set the lower end at several different values between 3.5 and 4.5, and the upper end between 9.0 and 11.0.

According to MedlinePlus and Laura Dean, a high number of WBCs (called leukocytosis) typically indicates an immune system response (e.g., the body is fighting an infection), but may also indicate a WBC tumor (e.g., leukemia) or the effects of a variety of drugs (e.g., NSAIDs).  The Gale Encyclopedia of Medicine said that leukocytosis could also occur naturally after a large meal or after experiencing stress, intense excitement, or vigorous exercise.  Michael Gibson stated that leukocytosis was very common in very ill patients, and (in addition to the causes just mentioned) could result from hemorrhages, steroids, burns, comas, Down Syndrome, and seizures.  As with RBCs, the Laboratory Procedure Manual (above) stated a "panic level" for WBCs at or above 16.0.  According to Gibson, a leukemoid reaction was said to occur when the WBC count exceeded 25 or 30.  Various sources seemed to say that extreme leukocytosis could involve WBC counts of 40, 50, or even 100.  Yitta et al. defined "hyperleukocytosis" as a WBC count of over 100, and seemed to say that this level (typically occurring in leukemia and some other disorders) presages death within a few weeks.

Gibson indicated that leukocytosis and leukopenia were not disorders, but were simply lab results.  This seemed to mean that they did not have observable symptoms of their own, but were rather just consequences of other disorders. MedlinePlus and Laura Dean said that a low number of WBCs (leukopenia) occurs when the bone marrow fails to produce WBCs (usually because of toxins or tumors in the bone marrow) or, more commonly, when a diseased liver or an overactive spleen is removing too many WBCs from the blood.  Dietary deficiencies and some drugs (e.g., antibiotics, diuretics) could also lower the total WBC count. Michael Gibson named a number of diseases (e.g., HIV, flu, malaria) and other conditions (e.g., alcoholism, B12 deficiency) that could produce leukopenia, and said that a reduction in WBC count could place patients at increased risk of infection.  The Laboratory Procedure Manual stated a "panic level" here, too, for WBCs at or below 3.0.  Harrison et al. seemed to indicate that 2.5 would constitute extreme leukopenia and would tend to accompany a severe viral disease or hemorrhagic fever.

White Blood Cell Value 2:  NE

Although there were apparently many kinds of WBCs, MedlinePlus said that neutrophils (NE) tended to account for 40% - 60% of the total WBC count.  Rebecca Frey of the Gale Encyclopedia of Medicine said that, for an average adult, the normal level was 1,500 cells per cubic millimeter (mm3) of blood.  My lab report stated a range of 43% - 65%, or 2.2 to 4.8 x 10^3/μL.  For my gender and age group, the chart (above) said 39.7% - 77.3%.

According to Nancy Nordenson of the Gale Encyclopedia of Medicine, neutrophils fight infection by eating bacteria.  Wikipedia said that "neutrophil" was shorthand for the technical name of neutrophil granulocyte; that neutrophils accounted for about 70% of all WBCs; and that the normal count was 2.5 to 7.5 billion cells per liter of blood (i.e., 2.5 - 7.5 x 10^9/L).  On the separate chart cited several times (above), Wikipedia reported that neutrophils were also known as grans, polys, segs, or PMNs; that on the low side, according to several sources, they accounted for 45-54% of all WBCs (for a count of 1.3 to 2.0 x 10^9/L); and that, on the high side, they accounted for up to 62-74% of all WBCs (i.e., 5.4-7.0%).

Being below that low threshold was called neutropenia, according to Rebecca Frey, and would entail increased risk of infection. Neutropenia was caused by the various problems described for WBCs generally, including decreased WBC production, destruction of WBCs, and removal of WBCs from the blood circulation.  For women,  Stephan said, mild neutropenia would have an absolute neutrophil count (ANC) of 1.0 - 1.5, moderate neutropenia would be in the range of 0.5 - 1.0, and severe neutropenia would be below 0.5.  (ANC included not only neutrophils per se but also "bands," which were apparently neutrophils in development.) According to Bangert et al., being above the high limit just described was called neutrophilia.  Neutrophilia had many causes, mostly mentioned above (e.g., rhematoid arthritis, steroids, exercise), as well as several not listed above (e.g., labor, surgery, panic, rage).

White Blood Cell Value 3:  LY

MedlinePlus said that the second most common kind of white blood cells were the lymphocytes (LY), accounting for 20% to 40% of total WBC count. My lab report put the range at 20.5% - 45.5% (1.3 - 2.9). The chart (above) said 17.8% - 51.8% for a fiftyish male.  Wikipedia said that various sources put the low end of the normal range between 16% and 25% (0.7 - 1.0), and the high end between 33% and 45% (3.5 - 4.8). MedicineNet said there were two kinds of lymphocytes:  B cells (to make antibodies that attack foreign substances) and T cells (to attack virus- or cancer-controlled cells of the human body itself).

As with the neutrophils (above), there was the possibility of lymphocytopenia and lymphocytosis, as described on e.g., specialized Wikipedia and WikiDoc webpages. These conditions would be attributable to causes like those listed by MedlinePlus. I didn't explore those pages at this point because I felt I had the basic ideas pretty much in place by this point, for my purposes, for these aspects of the CBC Differential Test.  It also seemed that we were getting into more minor aspects of blood chemistry (though obviously of life-and-death importance to those who were affected by relevant disorders or conditions); that is, I felt I could come back to this in more detail as needed, and I wanted to get on to platelets (below) and wrap this up.

White Blood Cell Values 4, 5, and 6: MO, EO, and BA

Monocytes (MO) accounted for only 2% to 8% of WBCs, according to  MedicineNet; 4.8% to 10.8%, according to my lab report; and 0% - 12%, according to the chart (above).  Further information was available on Wikipedia and WikiDoc.  Eosinophils (EO) accounted for 1% to 4% of WBCs, according to  MedicineNet; 0.9% to 2.9%, according to my lab report; and 0% to 8%, according to the chart (above).  Further information was available on Wikipedia and WikiDoc.  Basophils (BA) accounted for 0.5% to 1% of WBCs, according to  MedicineNet; 0.2% to 1.0%, according to my lab report; and 0% to 2%, according to the chart (above).  Further information was available on Wikipedia and WikiDoc. According to MedicineNet, neutrophils, eosinophils, and basophils were all types of granulocytes.

CBC Interpretation, Part 3:
Platelet Measures

As with many of the foregoing topics, MedlinePlus had a number of webpages that discussed various aspects of platelets. Platelets, they said, were a certain type of cell. This agreed with WebMD and contradicted MedicineNet and Ron Kennedy, who said that platelets were only fragments of cells. Probably there was a technical clarification by which both could be right; nonetheless, it seemed odd that something so basic to blood chemistry would not have been reduced to common, agreed-upon terms by this point.  In any case, platelets were important for purposes of helping blood to clot, so that bleeding would not continue uncontrolled.

Platelet Value 1:  PLT

MedlinePlus and MedicineNet did agree that a normal platelet count (PLT) would be in the range of 150 to 400 x 10^3 μL.  My lab report said 130-400.  The chart (above) said 157-414.  The "panic level" stated in the Laboratory Procedure Manual (above) was 50.  At that level, Ron Kennedy said that the risk was thrombocytopenia, in which the person would bleed uncontrollably from even a minor trauma.  Signs of bleeding due to low platelet count, he said, could include easy bruising, unusual nosebleeds, black, tarry stools, and heavy vaginal bleeding.  Moreover, he said, at 20, the problem is magnified into a risk of spontaneous bleeding, without any provocation, with a serious risk of death.  Such conditions can be the result of either a failure to produce new platelets or the rapid destruction of existing platelets.  The former can occur when, for instance, the bone marrow is so busy producing WBCs in response to leukemia that it neglects to produce new platelets.  Other possible causes identified by MedlinePlus include massive blood transfusion, prosthetic heart valve, and chemotherapy.

The Laboratory Procedure Manual (above) also stated a "panic level" at 800 on the high side.  This was known as thrombocytosis, and it involved production of too many platelets. Wikipedia suggested investigation of the causes if the level reaches 750. In thrombocytosis, MedlinePlus said, possible causes included anemia, certain cancers, and recent spleen removal.  According to the Mayo Clinic, thrombocytosis does not tend to have symptoms observable outside of the laboratory, and platelet level will ordinarily return to normal when the condition causing it is resolved.  Wikipedia noted, however, that some causes (e.g., hemorrhage, iron deficiency, inflammatory bowel disease, meningitis) might require additional attention to insure that the thrombocytosis eases.

Platelet Value 2:  MPV

According to LabTestsOnline, mean platelet volume (MPV) measures the average size of platelets. This was useful information because newly created platelets apparently tended to be larger; so if the average size was large or increasing, you would know that the bone marrow was producing new platelets.  Bessman et al. were able to link high or low MPV with particular kinds of disorders, including polycythemia vera (above).  Wikipedia noted that, in some cases of increased destruction of platelets, the body may produce so-called "giant" platelets.

Conclusion

Hematology is, of course, a large and complicated field.  The purpose of this post was to take a preliminary step into it, for purposes of interpreting a CBC blood test.  The philosophy or theory guiding this effort was that, once you make that first step, you begin to have a point of reference, some way to orient yourself as you continue to encounter other information about that subject.  It did not appear, from my blood test, that I had anything in particular to worry about; but life is long, and it did not seem wise to leave all of these things in the hands of doctors, who hopefully would but might not notice some particular condition or development in my present or future bloodwork.

Thursday, June 10, 2010

Using Ubuntu Linux Tools on a Windows Machine

I was using Windows XP SP3 on one machine and Ubuntu 10.04 (Lucid Lynx) on another.  There were times when I found that Ubuntu (my preferred version of the Linux operating system) could do things that Windows could not.  For example, Ubuntu was much faster and cleaner at moving large numbers of files from one folder to another.  It could also delete files and folders that Windows said could not be deleted.  So I wondered if there was a way to use Ubuntu tools on a Windows installation.  This post discusses that question.

One solution that I already knew about was to set up a dual-boot machine, with Windows XP and Ubuntu coexisting side-by-side.  If you wanted to do something in Ubuntu, you could just shut down Windows and reboot into Ubunt.  This wasn't always the world's most convenient approach.

Another solution that I was currently using was to use both of them together via virtualization.  The virtualization tool I had been using was VMware Workstation.  The way it worked for me was that I installed Ubuntu as my base layer, installed VMware Workstation in Ubuntu, and then installed Windows XP in a virtual (i.e., make-believe) "computer" inside Workstation.  So if I was working in Windows and had something I wanted to do in Ubuntu, I could just go out of the Windows virtual machine for a moment, do my thing in Ubuntu, and then resume work in Windows.  I have written lots of posts on this combination.

A different approach, for those who didn't mind rebooting and didn't want to install Ubuntu or VMware on their Windows machines, was to use an Ubuntu Live CD.  In this approach, you wouldn't reboot into an Ubuntu installation that was already present on your hard drive; you would reboot into an Ubuntu installation that was self-contained on a CD.  The CD image was free, and could easily be downloaded and burned to a CD.  It would be necessary to adjust the BIOS settings (typically, by hitting Del or perhaps F2 while the computer was booting) so as to set the CD (or DVD) drive to be the first in the boot sequence, so that the computer would try to boot from a CD (if you had inserted one into the computer) before moving on to the option of booting from your Windows installation on the hard drive.  Assuming your computer supported it (and most did, by this point), it was also possible to boot Ubuntu from a USB drive instead of a CD.

Those approaches were all familiar to me.  Two other approaches or variations were not.  The first was to use an Ubuntu live CD or USB stick, but to customize it to include Ubuntu programs that were not included on the standard Live CD.  Among the various ways of doing this, two that seemed to draw frequent attention were Reconstructor and Remastersys.  A recent post made it sound like Reconstructor was especially easy to use.  Among other possibilities, these tools would apparently allow the user to create a bootable CD or USB stick that would contain the user's own customized Ubuntu installation.

There seemed to be an endless number of variations and possibilities, some of which would require a lot of work and/or would not work well.  The last one mentioned here involved running Ubuntu, or something like it, on a Windows installation.  In essence, Ubuntu in this approach would function like just another Windows application.  As such, it would tend to be limited by the things that Windows could do.  Portable Ubuntu Tres was a recent example of this approach.

These possible approaches suggested two steps I could take, as described in more detail in separate posts.  One was to update my knowledge of virtualization alternatives to VMware Workstation.  It had been a year since I had last reviewed that topic, and I did not know whether there had perhaps been developments that would give me a superior alternative to VMware.  The other was to try my hand at burning a custom live Ubuntu DVD via Reconstructor or Remastersys.

Tuesday, June 8, 2010

Bike Trail Ride in Western Michigan: The Plan

This post has been moved to another blog.

Saturday, June 5, 2010

Ubuntu 10.04 & Windows Dual-Boot: Customize GRUB2 Boot Menu

I had a dual-boot machine with Windows XP and Ubuntu 10.04 (Lucid Lynx) on it.  I wanted to clean up and customize the GRUB menu that came up whenever I booted the system.  There were several parts to this.

I started with The Grub 2 Guide.  The Guide's point 6, "Adding Entries to Grub 2," said that files named 10_linux and 30_os-prober would search for installed Linux kernels and other operating systems.  I typed this:

cd /etc/grub.d
ls
and, sure enough, I had files called 10_linux, 20_memtest86+, 30_os-prober, and 40_custom, along with 00_header and 05_debian_theme files.  There seemed to be useful ways to change several of these items, so I went down the list in numerical order, starting with 10_linux.  I typed "sudo gedit /etc/grub.d/10_linux."  The thing to do here was to stop GRUB from listing Recovery Mode options in the startup menu.  I did a Ctrl-F to see if 10_linux contained this line:

GRUB_DISABLE_LINUX_RECOVERY=true

It didn't appear to have that, so I added it near the start of the file, right before the first "if" statement.  That was all for 10_linux, so I saved and closed it.  Now, how about controlling the menu so that it wouldn't list older kernels?  At this point, I thought about going with their "Building a Totally Customized Menu" option.  But the Grub 2 Guide said that a fully customized menu would not be updated with the addition of any new kernels.  The reason seemed to be that I would make 10_linux non-executable, so it would no longer go sniffing around to see what's new.   I didn't want to have to mess with updating the list manually every time a new kernel came along.  For guidance, I looked to the Grub 2 Title Tweaks Thread.  That, and the Grub 2 Guide, led to the following approach:
uname -r
sudo update-grub
ubuntu-tweak
The "uname" command told me what kernel I was now using.  At present, that was 2.6.32-22-generic-pae.  The "sudo update-grub" step told me what else was being listed on the Grub menu.  There was the option of seeking out other kernels in Synaptic, but running ubuntu-tweak (available via Synaptic, if you have the right repository) gave me an easier way of removing older kernels.  In Ubuntu Tweak, I went to Applications > Package Cleaner > Unlock > Clean Kernels.  This showed all installed kernels other than the one currently in use.  They said it was a good idea to keep one previously working kernel, so I skipped the first one on the list and checked the others.  Then I clicked Cleanup.  Ubuntu Tweak did its thing, and then I closed it.  It turned out there was another way to do this, that didn't require the Ubuntu Tweak step:  just tell 10_linux how many kernels to display.  This method required me to type "sudo gedit /etc/grub.d/10_linux" and then search for the place that had these two lines:
list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
done
and change it by inserting another list line between those two:
list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
list=`version_find_latest $list`
done
I found that right at the end of the 10_linux file.  So I made that change and then saved and closed 10_linux.  Next, I didn't want memtest+ to appear in the GRUB menu list, so I typed this:
sudo chmod -x /etc/grub.d/20_memtest86+
I looked for a quick way to confirm whether a file was executable, but there didn't appear to be an option for that in chmod, and the first several webpages I tried in response to a Google search didn't tell me.  Moving on, GRUB on my laptop had gotten confused, and it now pointed to two different Vista installations, only one of which was working.  The Grub 2 Title Tweaks Thread said I could hide it, but it seemed like I should also be able to remove it.  It seemed like a bad idea to have it hanging around.  Here's how those lines looked in GRUB:
Windows Vista (loader) (on /dev/sda1)
Windows Vista (loader) (on /dev/sda2)
The first one was not working.  If I hit it, I got "Disk error.  Press any key to restart."  I actually had to power down the laptop to get past that.  I didn't yet have a very well configured Ubuntu setup on the laptop, so I rebooted with a GParted CD (an Ubuntu Live CD would have worked too).  In GParted, I looked at sda1 and, well, no wonder it was showing up.  I had a Windows XP installation on a hidden partition in there!  I'd had some troubles installing Vista on the laptop, and apparently I had decided to keep the WinXP installation just in case.  So, OK, that was interesting.  I could have tried to rejigger the setup so that I'd have a triple boot system, but I didn't plan to be using XP very often on the laptop, and I could use GParted within Ubuntu (once I finished tweaking the laptop) to hide and unhide as needed.  For now, what I needed to do, in the GRUB menu, was to change the entry so that it would report the situation more informatively.  I typed this:
sudo cat /boot/grub/grub.cfg | grep "menuentry" | cut -d '"' -f 2
sudo gedit /etc/grub.d/30_os-prober
The first line gave me the current list of GRUB menu entries from grub.cfg (in case I hadn't already written down the names I wanted to change).  Precisely what I wanted to change was the first of the two "Windows Vista (loader)" entries.  So:  around the middle of 30_os-prober, I found this:
for OS in ${OSPROBED} ; do
  DEVICE="`echo ${OS} | cut -d ':' -f 1`"
  LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
  LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
  BOOT="`echo ${OS} | cut -d ':' -f 4`"
  if [ -z "${LONGNAME}" ] ; then
    LONGNAME="${LABEL}"
  fi
Following their advice, I could have changed those last three lines to five lines that read as follows:
  if [ "${LONGNAME}" = "Windows Vista (loader)" ] ; then
    LONGNAME="Windows XP (hidden)"
  elif [ -z "${LONGNAME}" ] ; then
    LONGNAME="${LABEL}"
  fi
In this case, unfortunately, both of those items were named "Windows Vista (loader)," so I figured they would both change to "Windows XP (hidden)."  What I needed had to be more specific, so instead I left their last three lines unchanged and added this after them:
  if [ "$LONGNAME" = "Windows Vista (loader)" ] && [ "${DEVICE}" = "/dev/sda1" ] ; then
    LONGNAME="Windows XP (hidden)"
  fi
And that worked.  The one other thing I wanted to change was to get GRUB to remember which operating system choice I had used last time, and default to that one again this time unless I selected something else.  In previous Ubuntu installations, the steps I had taken to do that had been to type "sudo gedit /etc/default/grub"; change one line to say GRUB_DEFAULT=saved instead of GRUB_DEFAULT=0; save and close that file; and then type "sudo update-grub."  But now I saw this in the Grub 2 Guide:  "The default OS will not be set merely by an interactive selection of an OS from the menu."  So that was apparently a change from Grub 1.5, or whatever I had been using previously.  So now, one option was to set up a custom menu, except that it wouldn't be updated for the latest kernels.  But then, confusingly, the Grub 2 Basics seemed to say that there was a simple solution after all.  I typed "sudo gedit /etc/default/grub" and made sure it said that "GRUB_DEFAULT=saved" and I also added a line right after that (since there wasn't already a line for this):

GRUB_SAVEDEFAULT=true

So I saved that, typed "sudo update-grub," and watched as it generated its list.  It looked like it was only going to show one Linux image, but I reserved judgment and rebooted.  Sure enough (speaking, here, of the desktop computer on which I had been making most of these changes), GRUB now showed only two items:  the latest Ubuntu kernel and Windows XP.  I chose Windows, the second of the two items.  I hit Enter and immediately hit F8, in the theory that Safe Mode would load faster than Normal Mode.  I guess it did, but it still wasn't in a hell of a hurry.  I clicked "Turn off computer" > Restart and watched to see if GRUB would remember that I had just booted Windows, not Ubuntu.  It did.  Excellent.  That seemed to be working.  I chose Ubuntu instead and rebooted again.  This time it went into Ubuntu.  Likewise, on the laptop, after some tinkering, sudo update-grub eventually produced the desired list, and it remembered the last boot too.

VMware Workstation 7 Installation: Permission Denied

I had been using VMware Workstation on Ubuntu for several years.  VMware put out a new release of Workstation 7, so I downloaded it.  I tried using the familiar steps I had used to upgrade VMware.  It had been just a matter of entering these two commands:

sudo chmod +x VMware-Workstation-Full-7.1.0-261024.i386.bundle 
sudo ./VMware-Workstation-Full-7.1.0-261024.i386.bundle
This time, though, it didn't work.  The first one went OK; but after the second one, I got this:

bash: ./VMware-Workstation-Full-7.1.0-261024.i386.bundle: Permission denied

Malcolm Lewis explained that I could use ./ to execute the file after running chmod, but I could skip the chmod command and just use one command:  sh [filename].  So I tried that.  And, you know, that worked.  Or at least it went further than before.  So apparently my chmod +x command was not sufficient to make the thing executable.  Possibly I needed to use chmod 777 or something.

I say it went further because I didn't type "sudo sh"; I just typed "sh" followed by the downloaded VMware bundle file.  So after it said, "Extracting VMware Installer...done," it stopped with an error:  "root access is required for the operations you have chosen."  I did it again with sudo, and this time it ran.  End of problem!

Tuesday, May 25, 2010

PUSBLANXAD01 AD-LAN01 PC USB Network Adapter Driver Blues

On Amazon.com, I bought an item described as "NEW USB to LAN RJ45 Ethernet 10/100 Network Adapter Card."  The purpose was to see if I could use USB to connect to the Internet, where I did not have a working ethernet connector for the usual cable connection.  The device was cheap -- about $7 with shipping -- and when I plugged it in, it lit right up.  The problem was, contrary to the ad, it did not come with a driver CD.  And since the Windows Vista computer I wanted to use it on was, of course, not able to go online, I could not download and install the drivers automatically.

The device came in a little box with a label on it that read, "16254 PUSBLANXAD01[J133] PC USB Network Adapter."  The UPC product number on the box was 8-77083-03542-3 (or 877083035423).  The device itself had a label that said, "Model:  AD-LAN01."  Both stickers said, "Made in China."

Buy.com had a review that I didn't see before buying, in which the buyer said that s/he had the same problem -- no driver CD.  That Buy.com webpage said the item was made by eForCity.  I went to the eForCity webpage.  It had no link for driver downloads.  There were several reviews.  Some said they had no problem; some said it didn't work.  I wondered whether it mattered if you used it on Windows XP or Vista.  I plugged it into a WinXP machine and tried that.  Windows recognized it as a "USB Network Controller," but the Found New Hardware Wizard said, "The wizard could not find the software on your computer for USB Network Controller."  I chose the option of connecting and searching for the software on the Internet -- using the existing ethernet connection on that computer to do so.  A minute later, it said, "Cannot Install This Hardware.  The hardware was not installed because the wizard cannot find the necessary software."  I verified that my online connection was working OK, tried again, and got the same thing.

Some of these reviews said something about downloading drivers from other websites.  Good way to get a virus.  I tried a search for AD-LAN01 instead of the previous search for PUSBLANXAD01.  That turned up only a couple of hits, one of which was a thread on which the person said they had tried downloading drivers and still had no luck, and another of which was a driver download page for some kind of graphics device that was apparently also called the AD-LAN01.  I tried a search for the UPC.  This gave me a post from someone who said the CD did come with theirs, but it was nonreadable and they had to reinstall the driver weekly.  So, OK, toss it in the parts box and maybe someday I'll find a computer that it works on.  Junk.  Should have bought a brand-name product.  And that was my next step.

Monday, May 24, 2010

Excel 2003: Count the Number of Times a Letter Appears in a Cell

I had tracked down the solution to this problem once before, and then couldn’t remember it or find it when I needed it again, so here it is.  It’s borrowed from another source, but I don’t mind, as long as it meets the need.

The question is, how do you count the number of times a letter occurs within a cell, in Microsoft Excel 2003?  I was searching for this:

count occurrences "of a letter in a cell" "excel 2003"

when what I should have been searching for was this:

“Count the times a specific character appears in a cell”

but probably not this:

"excel 2003" "Count the number of times a character appears in a cell"

Anyway, the solution is to use either of these:

=LEN(A1)-LEN(SUBSTITUTE(A1,"/",""))
=-LEN(SUBSTITUTE(A1,"/",""))+LEN(A1)

The former is simpler, and it works.

Sunday, May 23, 2010

How to Arrange Cells from Many Columns into One Column in Excel 2003

Suppose you're using Microsoft Excel 2003.  Suppose you have data in multiple columns, in an irregular array, like this:


And suppose you want to get all of that data into column A, like this:


How should you proceed?

Summary

To arrange an irregular table so that all of its cells are in a single column, create a separate worksheet for your calculations.  Count the number of cells containing data, so that you can be sure your process works correctly.  Use the CELL function to return the locations of the cells that actually contain data.  Copy those results into Word.  Convert that table to text.  Use Find-and-Replace to shrink that text file.  Paste it back into Excel.  Use string functions and indexing as needed to arrange the list as you wish. Use the INDIRECT function to show the contents of the referenced cells.

If this post is helpful, please add a comment below.

Step by Step

In this answer, I'll take the slow route, because it may be more efficient.

First, find out how big your spreadsheet is.  From anywhere in the spreadsheet, hit Ctrl-Home.  Let's say that takes you to cell A1.  That's the upper left corner of your spreadsheet.  Now hit Ctrl-End.  Let's say that takes you to FB1765.  That's the lower right corner of your spreadsheet.  (That's a pretty big spreadsheet.)

With a spreadsheet that big, things can get confusing.  If it were smaller, you could do the conversion manually.  There are a couple of ways to do that.  One would be to sort each column, by itself, and cut and paste only those cells containing data to the bottom of column A.  Another way would be to do an AutoFilter (Data > Filter > AutoFilter) and cut and paste the results from each column.

But we have a big spreadsheet, and we want a faster and safer solution than we could get with a manual cut-and-paste operation.  So now open a new worksheet within the existing file.  That's Insert (from the menu bar) > Worksheet.  Do your work here.  This will give you more space to work in, and will protect your original spreadsheet from unwanted changes.  (I'm referring to "spreadsheet" and "worksheet" interchangeably here.)  So remember:  we won't be making any changes to your original spreadsheet; all of this will take place on other spreadsheets.

Let's say the original spreadsheet is called Multiword and this new spreadsheet is called Sheet1. In Sheet1, go to cell A1 and type this:

=IF(LEN(Multiword!A1)>0,"x","")

This says, if the length of cell A1 in Multiword is greater than zero (that is, if there's something in the cell, even just a spacebar space), then give me an "x"; otherwise, give me nothing.  This is useful because sometimes formatting can cause cells in Excel to behave as though there were something in them, when there's not.

Now let's copy that formula so that it covers the same territory in Sheet1 that your data occupy in Multiword.  Move your mouse cursor to the lower right corner of cell A1.  Your cursor will change into crosshairs.  Left-click on that lower right corner of cell A1 and drag it down to A1765.  Let go, and then left-click and drag it across to column FB, and let go.  This gives you an "x" corresponding to each cell in Multiword that contains data.  Now select it all (Ctrl-A) and then go to Format > Column > Width > 1.  (Or even narrower, e.g., .5.)  This gives you a more easily visualized map of how your data is laid out.  You could have done the same thing by just making the formula say =Multiword!A1, and this would have had the advantage of showing you the actual contents of Multiword, as you moved your cursor from one cell to another; but this can be easier to think about.  Besides, we can use those consistent "x" values.

Now let's see how many entries you should wind up with at the end.  In Sheet1, go to a cell outside your data map.  In this example, let's go to A1767.  There, type this:

=COUNTIF(A1:FB1765,"x")

That will tell us how many cells contain data.  It may not display correctly in cell A1767 because the column width is too narrow, but you can see what it says by either widening the column or going to A1767 and hitting F2 and then F9.  In my example, that shows me that I have 21,242 cells containing data.  So in my final result, I should wind up with data in cells A1 through A21242, and nowhere else.

Now let's say I like that map in Sheet1, and I want to save it, but I don't want it to take up calculation time.  I can freeze it all forever -- that is, I can convert it all to values instead of formulas.  To do this, go to A1 and hit Shift End-Home (i.e., while holding Shift, hit End and then Home) to select it all.  Hit Edit > Copy and then Edit > Paste Special > Values.  Hit the Enter key a couple of times, until it looks like it's done.  Now those formulas in Sheet1 will all be converted to simple "x" entries.  Save a version of the file for backup.  For instance, let's call it BigFile 01.xls, and then save again as a newer version (BigFile 02.xls).

Alright.  On to the main event.  Let's create another spreadsheet, Sheet2.  Here, in cell A1, enter this formula:

=if(Sheet1!A1<>"x","",CELL("address",A1))

That tells Sheet2 to enter the location of cell A1 into cell A1.  That is, Sheet2!A1 will now say $A$1.  (Note that, if you didn't want to keep Sheet1 as a map, you could incorporate the LEN calculation (above) into this formula, and do both at the same time on Sheet1.)

In Sheet2, copy that formula to all cells, from A1 to FB1765, as described above.  Here's a before-and-after picture of what that would look like, if I were trying to do it all in a single spreadsheet:


In that example, what I want next would look like this:

$A$2
$A$3
$B$1
$B$2
$B$4
$C$3

This would be a step on the way to getting values like this:

3
2
5
14
8
6

So how do we do that?  In a big spreadsheet like mine, it's easier to do it in Microsoft Word.  So let's get Sheet2 ready for transfer.  Freeze Sheet2 as described above (with Paste Special etc.).  Hit Ctrl-A to select it all, and then Ctrl-C to copy it all.  In an empty Word document, hit Ctrl-V to paste it all.  With a big spreadsheet, this could take a while, as Word slowly gags on a couple hundred columns.  The result could be ugly -- mine was a pinstriped thing that didn't look like it contained any data at all -- but fear not.  When Word is done figuring it out, click somewhere on the resulting table.  Choose Table > Convert > Table to Text > Paragraph marks.  It will default to a checkmark in "Convert nested tables," which is fine.  Click OK.  After a couple of years, Word will give you a very ragged document, with lots of spaces between rows.  (Mine was more than 3,000 pages long.)  These blank rows are easy to clean up with Find-and-Replace.  In Word, ^p is the newline character for most documents.  So do a Find-and-Replace (Ctrl-H) to replace two newlines with one.  In other words, replace ^p^p with ^p.  (Actually, before doing that, you may want to remove spacebar spaces before or after the ^p, else some lines may not get fixed.)  Repeat the ^p^p replacement until all of your cell references are in a nice list.  Word may continue to believe that it needs to remove a couple more ^p^p duplicates, but at some point you can tell it's lying.  Save the result.  Let's call it BigFile.doc.

When I went through these steps with one file, they worked fine.  When I went through them with another file, however, I had a problem at this point.  The problem was that Word did not convert all of the lines properly.  It jammed a bunch of Excel cell contents together on the same line, instead of giving each its own line.  (I could tell:  I did a LEN in a separate column for each imported line in Excel, sorted on that column, and found that some were very long.)  To fix this, I had to search the Excel file to find a character that did not already occur in it (e.g., @ or `), and then revise the formula (above) so that it would stick that character on the end.  (Don't use ^ or ~ or other characters that don't turn up normal search results when you try to search for them.)  Then my first step in Word, after converting table to text, was to search for that character and replace it with ^p.

Another innovation, in that second try, was to combine the text and its cell location.  Using the data shown above, this gave me this kind of result:

3$A$2
2$A$3
5$B$1
14$B$2
8$B$4
6$C$3


That way, I could tell where the number (e.g., 3) had come from (e.g., cell A2), and I could use FIND and MID functions to put the numbers and their locations in separate columns.

Anyway, to continue.  If cell order is important for your purposes, sort the Word doc.  If it's not too big, you can do it in Word.  Hit Ctrl-A and then Table > Sort > Sort by Paragraphs.  Mine was too big, so I created a new Excel spreadsheet, Sheet3, and pasted it back into there.  Sure enough, I had my 21,242 entries in column A.  Excel didn't sort them the way I liked, though:  it had $A$9 after $AY$896.  This called for some use of the LEN and & functions.  For instance, if the LEN of the cell containing $A$9 is less than the LEN of the other cell, then insert some zeroes (using MID and FIND and &) before the 9; and to get $A before $AY, consider using an Index column to rank the entries in the order they should go (with maybe a temporary addition before the $A).

Once you have your 21,242 (or whatever) references in the order you prefer, there in column A in Sheet3, enter this in B1:

="Multiword!"&A1

and enter this in cell C1:

=INDIRECT(B1)

copy cells B1 and C1 all the way down to the bottom of the spreadsheet.  You may want to save your work as a new file (BigFile 03.xls) and then freeze column C, and then delete all other columns and worksheets.

*  *  *  *  *

Again, if this post is helpful, please add a comment below.  Cheers!

Wednesday, May 19, 2010

Disability Prevalence -- Where Are We?

This post summarizes the general flow of my posts on disabilities over the past half-year.  I still have a few more posts in draft form, and I'll be wrapping those up shortly, but this is a good point at which to sketch out the picture as it has developed in this blog.

This post originated as an e-mail message to a researcher who seemed potentially interested in looking into data on disabilities.  I wanted to summarize, for him, the questions I have been studying.  As the message grew longer and began to cite my other blog posts, I realized that I should probably just put it up on the blog and refer him to it.  So what was going to be an e-mail message has now become the following paragraphs.

*  *  *  *  *

Let me describe the situation in general terms, and see if there are particular aspects of it that seem to have the best potential for further investigation from a research perspective.  I tend to be somewhat philosophically oriented, so my apologies in advance if it takes me a while to reach the ground.

What the Question Is

The general question is, how many people have disabilities?  There is a definitional aspect to that question.  Speaking strictly from my own perspective, I have posted some blog entries about such matters.  This definitional question matters in the sense that, if we make the circle too small, we deny relevant assistance to people who need it.  An example, in the area of mental disability, is a person who does not qualify for an official psychiatric diagnosis but nonetheless experiences obvious difficulty.

That general question is operationalized in various surveys.  At this level, we move from the purely conceptual to a mix of the hypothetical and the actual.  Elsewhere, I have cited references to a so-called National Disability Data System (NDDS).  The NDDS itself does not exist formally; the concept is that it exists in effect, through the data provided by actual research efforts.   This is still an academic's discussion; at this level we are kicking around various ways of going at the question of disability prevalence.

From there, we move to a more concrete level.  This is the level at which politicians and the public are given specific numbers.  They may not be the right numbers, but that's what footnotes are for.  Most notably, the American Community Survey (ACS) replaces the decennial census; that is, questions about disabilities have disappeared from the latter because the prevalence of disabilities is now being estimated rather than counted.  The ACS is in the process of replacing the census, for this purpose, down to the local level.

Why It Matters

As you can see, I have been trying to get a grasp on what we think we know, and why we think we know it.  But why does it matter?  Why should we care about the prevalence of disabilities?  There seem to be two ways to answer that.

The National Perspective

On one hand, we can approach the issue from a national perspective.  As the posts describe, the disability-related questions on the ACS have been modified, in the last few years, for purposes of improved reliability.  All well and good; but in the process, the estimate of people with disabilities dropped by some 15%.  Meanwhile, more sensitive measures (e.g., the SIPP) have the potential (but, alas, not the financial backing) to show a significantly higher rate.

The nation has a profound interest, budgetary and otherwise, in knowing whether the number of people with disabilities is 38 million or, instead, 53 million (to cite one alternate figure that I have encountered).  A million people here, a million people there, and pretty soon we're talking about real people.  The estimates are definitionally driven, of course, but that's the point:  how much higher does the prevalence rate go if the researcher uses a different, but comparably respectable, definition?

For example:  in an interesting book, Bagenstos contends that the Americans with Disabilities Act (ADA) has been developed in the direction of treating disability as a minority-rights kind of issue.  This, he says, has had the advantage of drawing upon the legacy of civil rights movements of the 1960s and 1970s, thus giving disability rights advocates a certain automatic sense of legitimacy.  The drawback has been that such movements invite opposition from those whom they exclude, particularly if the latter are expected to pay for adjustments to rectify perceived wrongs.

The alternative, Bagenstos says, is to treat the condition in question -- disability, in this case -- as a universal issue, something in which everyone partakes, or is at risk of partaking, through various forms of inability and imperfection.  In this approach, disability prevalence can be calculated without segregating "people with disabilities" into their own conceptual ghetto.  If disability is treated as something that anyone is capable of experiencing, like chickenpox or the flu, but if only a fraction of the population is likely to experience it at any particular point, what is that fraction?

Good question.  But how can we answer it?  The budgetary infeasibility of extending the SIPP to localities across the entire nation, on a par with the ACS, demonstrates that national disability prevalence estimation is presently stuck in a rather absurd place.  Because of its lack of local foundation, it can be gerrymandered, from a desk in D.C., to add or drop five or ten million people here and there, for reasons of statistical or budgetary convenience.  The nation, and the disability community, need something better than that.  The following suggestion illustrates a national alternative on the local level.

The Local Perspective

The relatively narrow operationalization of disability in the ACS is obviously problematic.  If its national estimate of disabilities is on the conservative side, its local estimate will tend to be so as well.

That seems reasonable enough.  But putting it that way highlights a bigger problem.  The idea seems to be that the best way to know whether my neighbor has a disability is to wait for the latest ACS to be completed; wait for the local-level ACS data to be compiled by someone in Washington; adjust that local number upwards by a fudge factor due to the conservative bias of the ACS; and then calculate my neighbor's odds.

Faced with that kind of logic, practical decisionmakers and advocates say, in effect, "Research be damned."  They aren't going to plumb the intricacies of the Supreme Court's latest interpretations of the Americans with Disabilities Act, and they aren't going to invest the time required for a clear understanding of the ACS.  They're going to rely, instead, on what they've heard and what they believe, supplemented by the occasional citation to some source or other.

Suppose we began, instead, from present experience.  Suppose, for example, that I cannot walk to work.  Research on the benefits of outdoor exposure suggests that this state of affairs will tend to make me less happy than I would be if I could walk to work.  The reason for this impairment of my subjective well-being may not be crucial:  it may not matter, for that purpose, whether I can't walk to work because I have no legs or, instead, because the streets between here and there are dangerous for pedestrians.  Either way, I can't do it.

The focus, in that example, is upon achieving a certain outcome.  Outcome-oriented disability estimation is, in essence, the language of actual local life.  The mayor finds that 39% of her constituents are furious about the state of the roads.  They are experiencing some transportation-related disability.  The fact that 3% of constituents are furious about the state of the sidewalks may be politically trivial, but a transportation-related disability nonetheless exists there as well.

Improved accessibility will often be politically infeasible if the public impression is that we are trying to spend a fortune on curb cuts for a small number of people in wheelchairs who never use the sidewalks anyway.  Rather than ask for special handouts, a more defensible view of transportation-related disability would focus on getting the roads and sidewalks into shape for people on foot, in wheelchairs, and in cars.  Infrastructure is essential.  Everyone needs effective transportation.

Summary

Disability has been defined in different ways.  A cursory review suggests that American law is presently oriented toward treating a disability as a flaw in the individual.  Hence, instruments like the ACS look for vision impairments and other personal characteristics that prevent people from functioning like everybody else.  The social model of disability is incorporated only in the limited sense that some survey questions acknowledge, in various ways, that disability may entail mismatch between person and society; yet even that acknowledgement inevitably brings the focus back to the individual.

That approach to disability has the potential to get everyone bogged down in mutual recrimination, with the familiar old vocabularies of "handouts" versus "privilege," and "normal people" versus "the oppressed."  An approach that could be more readily calculated on the local level, and more consistent and politically supportable on the national level, would focus upon desired life outcomes.

Using transportation as a particularly important disability-related outcome, one can ask how many people are not able to get where they need to go within a reasonable amount of time, in a reasonable manner, at reasonable cost.  There are many kinds of transportation-related disabilities in this sense.  Here are some examples:
  • People who are disabled from independent transportation because they are under the control of others.  Examples include children and prison inmates.  
  • Those whose health precludes independent travel -- hospital inpatients, for instance, and nursing home residents.
  • People may also be economically disabled from utilizing independent transportation:  for instance, they may not have money for a car or even for bus fare, assuming there is a bus line near them.
  • People whose obligations prevent independent travel:  people have to stay at work, or have to stay near a certain location to be available for work, or have to stay home with the kids or with a sick relative.
  • Social disability precluding independent transportation.  People are stared at and harassed if they are someplace where, in effect, they don't belong.  This can include kids in the vicinity of a bully, women who are out late alone, bicyclists on a busy street, individuals of an unfamiliar or unwelcome race, and people who dress funny or act funny.
The purpose of such an investigation would be to provide an alternative perspective that would be more immediately familiar to the public and more responsive to actual human experiences of disability.  The idea is that, for whatever reason, some people can't get where they need to go.

Needless to say, this post does not purport to address the gamut of disability-related concerns and issues.  Indeed, it is precisely not that sort of thing.  What I have observed, in my half-year of exposure to disability-related matters, is that the cerebral model of disability -- the one that begins with abstract, individual-oriented definitions and works its way down to concrete application -- is not really very practical.

It tentatively seems that it would be more useful, marketable, and appropriate to treat disability as a matter of sociopersonal constraints that everyone experiences in various forms, and to focus especially upon those global, national, state, and/or local conditions that most profoundly impair the achievement of the most important outcomes.  This approach would still prioritize many individual impairments, but would do so as a matter of an investment in society's future rather than as a handout to a person who has managed to become privileged in the eyes of the law.

Sunday, May 16, 2010

Resuming a VMware Virtual Machine: Could Not Open /dev/vmmon

I was tweaking Ubuntu 10.04 (Lucid).  One step I took was to clean out old entries from the GRUB menu.  This involved removing some old kernels.  That process may have caused a problem for VMware Workstation 7.  When I tried to resume a previously suspended virtual machine, I got this error:

Could not open /dev/vmmon:  No such file or directory.  Please make sure that the kernel module `vmmon’ is loaded.
One source recommended adding some extra lines to the VMware startup script.  I killed VMware and tried that.  I typed “sudo gedit /etc./init.d/vmware and added those lines at the start of that file, right after the end of the introductory comments.  But it didn’t work, and I wasn’t surprised; the code seemed a bit scrambled.  I closed Workstation and tried “sudo vmware.”  But that didn’t help either.  What did finally solve the problem was a simple command:  “sudo service vmware start.”  Then I started VMware and was able to restore my virtual machine OK.

Compiz in Ubuntu 10.04: Same As It Ever Was

Following Gizmo’s Freeware list of tweaks, I decided to try jazzing up the visual appearance of Ubuntu 10.04 (Lucid Lynx).  To do this, I went into Ubuntu's System > Preferences > CompizConfig Settings Manager > Desktop.  Enable Desktop Cube; disable Desktop Wall.  Unfortunately, I went on to play with Effects at the same time, and managed to halfway freeze my system.  Having wasted hours on fooling with Compiz in previous years, I rebooted and went back to System > Preferences > Appearance > Visual Effects > Normal.

Gizmo also described a Windows 7 Aero Snap tweak in which I could drag a window to the left or right side of the screen and it would automatically fill half of the screen.  To make this work, I installed wmctrl in Synaptic.  Then, in CompizConfig > General > Commands, I entered these commands:

  • Command line 0:  WIDTH=`xdpyinfo | grep 'dimensions:' | cut -f 2 -d ':' | cut -f 1 -d 'x'` && HALF=$(($WIDTH/2)) && wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,0,0,$HALF,-1
  • Command line 1:  WIDTH=`xdpyinfo | grep 'dimensions:' | cut -f 2 -d ':' | cut -f 1 -d 'x'` && HALF=$(($WIDTH/2)) && wmctrl -r :ACTIVE: -b add,maximized_vert && wmctrl -r :ACTIVE: -e 0,$HALF,0,$HALF,-1
  • Command line 2:  wmctrl -r :ACTIVE: -b add,maximized_vert,maximized_horz
Then, in the “Edge Bindings” tab, I changed None to Left (for command 0), Right (for command 1), and Top (for command 2).  I opted to disable the Flip Left, Flip Right, and Flip Up actions of Desktop Wall.  I wasn’t sure what that would mean.  I clicked Back > General > General Options > General tab > Edge Trigger Delay = 500 > press Tab button > Back > Close.  The way this actually worked, as I quickly found, was that whatever window was highlighted at the moment would go to the edge of the screen where I put the cursor.  Nice, but it kept the left panel from coming up (since I had set it to Auto-Hide), and then it made the bottom panel go to the top.

It all felt pretty flaky.  Since I couldn’t get back into the left panel I had to restart the system again.  Or, correction, the only button that worked was the Shut Down, so I did that, and then rebooted.  When the system came back up, the bottom panel was back in place, but I still could not open the left panel to get into System > Preferences and make changes to Compiz etc.  Following howefield’s advice, I hit Alt-F2, typed “gconf-editor” (I could also have typed gnome-terminal if I’d wanted Terminal) and went to /apps/panel/toplevels/top_panel_screen0 and unchecked auto_hide.  I closed that, went back into Compiz Commands, and clicked the brush or broom icon at the left to remove each of those three commands.  I went into Synaptic and removed wmctrl.  I set the left panel back to Auto-Hide.  It would not come up again.  I restarted the system.

The restart option worked this time, at least to the point of taking me to the Ubuntu screen and then freezing.  Eventually, I punched the computer’s reset button.  I tried again with the left panel.  This time, I just turned off its Auto-Hide option and didn’t turn it back on.  I wondered if System > Administration > Update Manager would somehow fix this.  I ran a check for updates and got an indication that there were 21 of them.  I installed those and tried restarting the computer again.  This time, restart worked without having to punch the reset button.  I went back into Appearance > Visual Effects and set it to “None” rather than “Normal” or “Extra.”  I changed the properties of the left panel to Autohide again.  Now it would hide and unhide without a problem.  I went back into Visual Effects and tried the Normal setting.  It said, “Searching for available drivers.”  I opted to keep the settings.  I closed out of that and tried the panel again.  So, back in gconf-editor, I turned off Autohide again to make the panel visible; I went into Visual Effects and set it back to None; and now the panel was back.  So, OK, Compiz had screwed up the Normal setting so that I had to use the None option; but with the None option, everything seemed to be working acceptably.

That took care of this problem.  If the panel had still not worked, Howefield also offered the option of resetting the panels to the original default, which would have required me to reconstruct the way I had set them up.  Moral of the story, for me, on this work-oriented system, was to continue to avoid Compiz special effects.

Importing Microsoft Word Autocorrect Entries into OpenOffice.org Writer

I had been looking, for some years, for a way to import my list of AutoCorrect entries from Microsoft Word 2003 into the OpenOffice.org (OOo) word processing program.

In Word, I had found AutoCorrect invaluable for converting shorthand expressions into longer terms, saving me a lot of typing. For example, I could type “fttt” and watch it expand to “from time to time,” having previously defined it as such. My list of Word AutoCorrect terms had grown long, into the thousands of entries, so I could not just retype them into OOo Writer manually.

I did know how to export the AutoCorrect entries from Word to a text file. There were apparently several macros available for this purpose. The challenge had been in getting the items from there to Writer. A Linuxtopia webpage now suggested a possible approach, however, and I decided to explore it.

My first step was to get into Writer’s DocumentList.xml file. To do this, in Ubuntu’s Nautilus (i.e., File Browser) I went to /usr/lib/openoffice/basis-link/share/autocorr. I double-clicked on acor_en-US.dat (there were files for other languages and for other flavors of English). There was DocumentList.xml. Now, what to do with it? I right-clicked on it and chose Extract > Extract. This gave me an error message: “Extraction not performed. You don’t have the right permissions.” So I went into Applications > Accessories > Terminal and typed “sudo nautilus,” and then, using that superuser File Browser session, went back to that same autocorr folder and tried again. This time, I didn’t try extracting; I just right-clicked on acor_en-US.dat and chose “Open with Archive Manager” and then right-clicked on DocumentList.xml and chose “Open with” and chose gedit. I went to the end of the file, right before the “</block-list:block-list>” entry, and copied the whole previous entry. In my case, it was the one that would change “yuor” to “your.” In full, it read like this:

<block-list:block block-list:abbreviated-name="yuor" block-list:name="your"/>
They all seemed to follow that same format.  So apparently it was just a matter of getting my Word abbreviations into that form.  To test this, I added an entry right after that “your” entry.  Mine read like this:
<block-list:block block-list:abbreviated-name="yr" block-list:name="your"/>
After making that change, I saved the file.  This provoked a File Roller message:  “Update the file ‘DocumentList.xml’ in the archive ‘acor_en-US.dat’?”  I said yes, i.e., Update.  Then I started Writer and tried typing “yr.”  It didn’t work.  It would correct “yuor” to “your,” but it wouldn’t correct “yr” to “your.”  I rebooted the system, in case that would make a difference, and tried again.  It didn’t.  Yr was still not listed in Writer’s autocorrect replacement list.  I went back and looked at the end of DocumentList.xml.  “Yr” was still there.  Had I not entered it correctly?  It looked like I might have entered it twice, possibly from a previous try at the same thing.  I made sure there was just one entry for “yr.”  Then it occurred to me to delete the one for “yuor” and see what would happen.  Or, even better, I deleted the one for “yr,” the one that I had added, and I changed the one for “yuor” to be for “yr” instead.  I went back into DocumentList.xml but, what’s this, there were two entries for “yr” again.  Then I realized that the file edit time had not changed:  it seemed I was editing and saving the changes, no error messages, but I hadn’t come in as root, so there was not anything actually happening.  Editing as root, I saw another problem:  I had apparently inserted a copy of the list-ending “/block-list:block-list” command before my “yr” entry.  So perhaps Writer wasn’t going beyond that, and this was why it wasn’t seeing the “yr” item.  I made those changes, started Writer, and it worked!  “Yr” became “your.”  I went into Writer’s AutoCorrect options, looked at the end of the list, and sure enough, there was “yr.”

So now the mission was to incorporate a bazillion Word AutoCorrect entries into this DocumentList.xml file.  Or, no, as I thought of it, I decided the first step was to make a backup copy of this xml file and then delete its contents.  I had been working with my Word AutoCorrect list for years.  I didn’t need any surprises from whatever might be in DocumentList.xml.  Actually, to make it easier, I just made a quick copy of the whole acor_en-US.dat file.  Then, in DocumentList.xml, I deleted everything except the file starting and file ending lines:

<?xml version="1.0" encoding="UTF-8"?>
<block-list:block-list xmlns:block-list="http://openoffice.org/2001/block-list">

</block-list:block-list>

Since I would probably be doing this again – adding to the OOo AutoCorrect list from the Word AutoCorrect list, or possibly vice versa – I decided to manage it all through an Excel 2003 spreadsheet.  This, I thought, would also be a good way to compare the AutoCorr lists that I had developed on different computers.  That is, I was using AutoCorrect on more than one computer, and it seemed likely that there would be some cases where those lists were not compatible.  So I began with that part of the project.  I ran the AutoCorrect macro in Word on each computer and brought all of the resulting wordlists together into one folder.  I opened one of those wordlists, copied the whole thing, waited a few minutes to make sure it was all there, and pasted it all into an Excel spreadsheet.  Here, too, I wished the AutoCorrect feature included a column indicating the date last used, because a lot of these entries were totally unfamiliar to me and others were for things I was no longer writing about.  Probably I should have done this spreadsheet thing when I first installed Word.  Then it occurred to me that I could set up a virtual machine, install Word on it, and do something like that now.  But without manual examination, I still wouldn’t be able to tell which of those original Word AutoCorr entries I had ever used.

I did manage to come up with some sorting rules that helped somewhat.  After deleting exact duplicates from the several combined AutoCorr files, I sorted alphabetically according to Value (i.e., the term that resulted from the auto-correction) and then according to value length.  For example, I had given “acl” a value of “actual,” and Word came with “actualyl” as also having a value of “actual.”  I could have left both, but it seemed pretty unlikely that I would let a paper go out with “actualyl” in it (not to mention “additinal” and “adequit”).  Actually, I reasoned, I would rather risk letting a paper go out with “actualyl” in it than to endure the insult of having such a spelling correction in my AutoCorrect file.  So I deleted a bunch of those.  I also searched for items containing a space, since those tended to be from Word, not me (e.g., “witht he” becomes “with the”).  I searched for items of the same length before and after, since these tended to be Word’s typo corrections.  When I was done, I copied and pasted it from the Excel file back into the Word AutoCorr list.  Doing that involved creating a new table with enough rows to accommodate all of the Excel entries, highlighting all those empty cells, and pasting the Excel cells into the highlighted space.  There were some extra rows, which Word redundantly filled by starting over at the start of the table and continuing until all rows were filled; I had to delete those.

The next step was to get rid of the existing AutoCorrect entries in Word, so that the unwanted ones that I had deleted would really be gone.  I did this by creating a Word macro to remove them all.  I had no idea how to do this, but it was easy:  in Word 2003, I went into Tools > Macro > Macros > Create.  It had a space for my new macro, starting with Sub AddTBMenuItem() and continuing on to End Sub.  I pretty much replaced that with the following macro, posted in 2001:

Sub RemoveAllDefaultAutoCorrects()
Dim aCor As AutoCorrectEntry
If MsgBox("This is a very destructive macro. Be sure that you " & vbCr & _
"want to delete all the AutoCorrect entries. There is no " & vbCr & _
"for this action. Click OK to continue", vbCritical + vbOKCancel, "CAUTION") _
= vbOK Then
For Each aCor In Application.AutoCorrect.Entries
aCor.Delete
Next aCor
End If
End Sub

I closed that, went back into Tools > Macro > Macros, selected that new macro entry, and ran it.  I gathered from somewhere that Word would restore the old list if you didn’t replace it with at least one new AutoCorrect entry, so I created a dummy one, exited Word, and then came back in to see what it looked like.  Sure enough, there was only that one dummy entry.  So now I ran the macro to restore my new list, and that took care of getting Word’s AutoCorr list updated.

Now, how to do the same thing in OOo Writer?  Using the format shown in that Linuxtopia webpage, I went back to the Excel spreadsheet, added another column on the right side, and used text concatenation to add all the missing stuff – basically, everything other than “yuor” and “your” in that example.  The formula I used was this:
=”<block-list:block block-list:abbreviated-name=”&CHAR(34)&A4&CHAR(34)&”block-list:name=&CHAR(34)&B4&CHAR(34)&”/>”
CHAR(34) was the Excel command for a regular (double) quotation mark.  I had to use CHAR(34) because the quotation mark means something different.  This formula said, take the name in cell A4 (e.g., “yuor”) and replace it with the value in cell B4 (e.g., “your”).  So I copied that formula all the way down the spreadsheet, in my column E (using column D to show the date when I did this, for future reference).  Then I copied all of those cells from column E into Notepad, made sure that Format > Word Wrap was turned off, and saved that as AC.TXT.  Back in Ubuntu, I opened AC.TXT in gedit.  Testing confirmed that OOo Writer was going to have a hard time with items that gedit displayed in funky format, like these:




Most of the items that caused problems that way were due to the use of smart apostrophes (i.e., single quotes) in Word.  So back in Windows, in Notepad, I opened AC.TXT, found an example of a smart apostrophe, highlighted and copied it into the Find & Replace box, and replaced it with a simple apostrophe.  I made a note in the spreadsheet, next to these items, to indicate that they were not compatible with Writer.  Word's em dash () was also problematic as an import into Writer, so I had to replace it, in this imported list, with two hyphens (--).

With these changes made, back in Ubuntu, I was ready to paste the revised AC.TXT into DocumentList.xml.  I closed Writer, did the paste, started Writer, and tried it out.  It didn’t work.  I looked at the AutoCorr list.  It had imported only a few items.  It looked like it had stopped at an item containing an ampersand (&).  I deleted that item from DocumentList.xml and tried again.  Now its AutoCorr list was longer, but still only a fraction.  Sure enough, it had stopped at another ampersand.  I went back to the spreadsheet and deleted or changed all items containing an ampersand, and marked them on the spreadsheet for incompatibility as well.  Trying again:  still no cigar.  This time, it seems there was an item in my list that was already in quotation marks.  So I was trying to import something like ““This”” and Writer wasn’t buying it.  I fixed that and tried again.  This time for sure.  It worked.  I had the entire list, and I played with it.  It looked like they were all going to work.  I doctored up the list by putting a copy of Writer’s special character for the em dash into a document (Insert > Special Character > Box Drawing) and then copying it into the places in the Tools > AutoCorrect list where I had had to import double hyphens (--) instead.  At some point, I would probably do the same with the smart apostrophes, ampersands, and other items if I decided to use Writer frequently.

So it worked.  I could now use my list of abbreviations in OOo Writer instead of having to use Word.