--- layout: post title: "From design patterns to category theory" description: "How do you design good abstractions? By using abstractions that already exist." date: 2017-10-4 10:43 UTC tags: [Software Design, Design Patterns, Article Series] image: "/content/binary/playback-controls.png" image_alt: "Rewind, play/pause, and fast forward symbols." --- {% include JB/setup %}
{{ page.description }}
When I was a boy, I had a cassette tape player. It came with playback controls like these:
Soon after cassette players had become widely adopted, VCR manufacturers figured out that they could reuse those symbols to make their machines easier to use. Everyone could play a video tape, but 'no one' could 'program' them, because, while playback controls were already universally understood by consumers, each VCR came with its own proprietary interface for 'programming'.
Then came CD players. Same controls.
MP3 players. Same controls.
Streaming audio and video players. Same controls.
If you download an app that plays music, odds are that you'll find it easy to get started playing music. One reason is that all playback apps seem to have the same common set of controls. It's an abstraction that you already know.
As I explain in my Humane Code video, you can't program without abstractions. To summarise, in the words of Robert C. Martin
"Abstraction is the elimination of the irrelevant and the amplification of the essential"With such abstractions, source code becomes easier to understand. Like everything else, there's no silver bullet, but good coding abstractions can save you much grief, and make it easier to understand big and complex code bases.
Not only can a good abstraction shield you from having to understand all the details in a big system, but if you're familiar with the abstraction, you may be able to quickly get up to speed.
While the above definition is great for identifying a good abstraction, it doesn't tell you how to create one.
Design Patterns explains that a design pattern is a general reusable solution to a commonly occurring problem. As I interpret the original intent of the Gang of Four, the book was an attempt to collect and abstract solutions that were repeatedly observed 'in the wild'. The design patterns in the book are descriptive, not prescriptive.
Design patterns are useful in two ways:
I have no problems with ready-made solutions, but I think that the other advantage may be even bigger. When you're looking at unfamiliar source code, you struggle to understand how it's structured, and what it does. If, hypothetically, you discover that pieces of that unfamiliar source code follows a design pattern that you know, then understanding the code becomes much easier.
There are two criteria for this to happen:
Programming to a well-known abstraction is a force multiplier, but it does require that those two conditions are satisfied: prior knowledge, and correct implementation.
I don't know how to solve the prior knowledge requirement, other than to tell you to study. I do, however, think that it's possible to formalise some of the known design patterns.
Most design patterns are described in some depth. They come with sections on motivation, when to use and not to use, diagrams, and example code. Furthermore, they also come with an overview of variations.
Picture this: as a reader, you've just identified that the code you're looking at is an implementation of a design pattern. Then you realise that it isn't structured like you'd expect, or that its behaviour surprises you. Was the author incompetent, after all?
While you're inclined to believe the worst about your fellow (wo)man, you look up the original pattern, and there it is: the author is using a variation of the pattern.
Design patterns are ambiguous.
Design Patterns was a great effort in 1994, and I've personally benefited from it. The catalogue was an attempt to discover good abstractions.
What's a good abstraction? As already quoted, it's a model that amplifies the essentials, etcetera. I think a good abstraction should also be intuitive.
What's the most intuitive abstractions ever?
Mathematics.
Stay with me, please. If you're a normal reader of my blog, you're most likely an 'industry programmer' or enterprise developer. You're not interested in mathematics. Perhaps mathematics even turns you off, and at the very least, you never had use for mathematics in programming.
You may not find n-dimensional differential topology, or stochastic calculus, intuitive, but that's not the kind of mathematics I have in mind.
Basic arithmetic is intuitive. You know: 1 + 3 = 4, or 3 * 4 = 12. In fact, it's so intuitive that you can't formally prove it -without axioms, that is. These axioms are unprovable; you must take them at face value, but you'll readily do that because they're so intuitive.
Mathematics is a big structure, but it's all based on intuitive axioms. Mathematics is intuitive.
Writers before me have celebrated the power of mathematical abstraction in programming. For instance, in Domain-Driven Design Eric Evans discusses how Closure of Operations leads to object models reminiscent of arithmetic. If you can design Value Objects in such a way that you can somehow 'add' them together, you have an intuitive and powerful abstraction.
Notice that there's more than one way to combine numbers. You can add them together, but you can also multiply them. Could there be a common abstraction for that? What about objects that can somehow be combined, even if they aren't 'number-like'? The generalisation of such operations is a branch of mathematics called category theory, and it has turned out to be productive when applied to functional programming. Haskell is the most prominent example.
By an interesting coincidence, the 'things' in category theory are called objects, and while they aren't objects in the sense that we think of in object-oriented design, there is some equivalence. Category theory concerns itself with how objects map to other objects. A functional programmer would interpret such morphisms as functions, but in a sense, you can also think of them as well-defined behaviour that's associated with data.
The objects of category theory are universal abstractions. Some of them, it turns out, coincide with known design patterns. The difference is, however, that category theory concepts are governed by specific laws. In order to be a functor, for example, an object must obey certain simple and intuitive laws. This makes the category theory concepts more specific, and less ambiguous, than design patterns.
The coming article series is an exploration of this space:
The purpose of this article series is two-fold. Depending on your needs and interests, you can use it to
The other goal of these articles may be less clear. Object-oriented programming (OOP) is the dominant software design paradigm. It wasn't always so. When OOP was new, many veteran programmers couldn't see how it could be useful. They were schooled in one paradigm, and it was difficult for them to shift to the new paradigm. They were used to do things in one way (typically, procedural), and it wasn't clear how to achieve the same goals with idiomatic object-oriented design.
The same sort of resistance applies to functional programming. Tasks that are easy in OOP seem impossible in functional programming. How do you make a for loop? How do you change state? How do you break out of a routine?
This leads to both frustration, and dismissal of functional programming, which is still seen as either academic, or something only interesting in computation-heavy domains like science or finance.
It's my secondary goal with these articles to show that:
I've been thinking about these topics for years. What's a good abstraction? When do abstractions compose?
My first attempt at answering these questions was in 2010, but while I had the experience that certain abstractions composed better than others, I lacked the vocabulary. I've been wanting to write a better treatment of the topic ever since, but I've been constantly learning as I've grappled with the concepts.
I believe that I now have the vocabulary to take a stab at this again. This is hardly the ultimate treatment. A year from now, I hope to have learned even more, and perhaps that'll lead to further insights or refinement. Still, I can't postpone writing this article until I've stopped learning, because at that time I'll either be dead or senile.
I'll write these articles in an authoritative voice, because a text that constantly moderates and qualifies its assertions easily becomes unreadable. Don't consider the tone an indication that I'm certain that I'm right. I've tried to be as rigorous in my arguments as I could, but I don't have a formal education in computer science. I welcome feedback on any article, both if it's to corroborate my findings, or if it's to refute them. If you have any sort of feedback, then please leave a comment.
I consider the publication of these articles as though I submit them to peer review. If you can refute them, they deserve to be refuted. If not, they just may be valuable to other people.
Category theory generalises some intuitive relations, such as how numbers combine (e.g. via addition or multiplication). Instead of discussing numbers, however, category theory considers abstract 'objects'. This field of mathematics explore how object relate and compose.
Some category theory concepts can be translated to code. These universal abstractions can form the basis of a powerful and concise software design vocabulary.
The design patterns movement was an early attempt to create such a vocabulary. I think using category theory offers the chance of a better vocabulary, but fortunately, all the work that went into design patterns isn't wasted. It seems to me that some design patterns are essentially ad-hoc, informally specified, specialised instances of basic category theory concepts. There's quite a bit of overlap. This should further strengthen the argument that category theory is valuable in programming, because some of the concepts are equivalent to design patterns that have already proven useful.
Comments
What a perfect introduction !
I heard about category theory more than one year ago. But it was from a PhD who code in 'haskell' and I thought it was too hard for me to understand.
And then, this post.
Thank you a lot! (you aleardy published the follow up ! yeah)


Health research programs targeting the population of Gabon and Equatorial Africa at the International Center for Medical Research in Franceville (CIRMF), Gabon, have evolved during the years since its inception in 1979 in accordance with emerging diseases. Since the reemergence of Ebola virus in Central Africa, the CIRMF “Emerging Viral Disease Unit” developed diagnostic tools and epidemiologic strategies and transfers of such technology to support the response of the National Public Health System and the World Health Organization to epidemics of Ebola virus disease. The Unit carries out a unique investigation program on the natural history of the filoviruses, emergence of epidemics, and Ebola virus pathogenesis. In addition, academic training is provided at all levels to regional and international students covering emerging conditions (host factors, molecular biology, genetics) that favor the spread of viral diseases.
The International Centre for Medical Researches of Franceville (CIRMF) was founded in 1974 by His Excellency El Hadj Omar Bongo Ondimba, President of the Gabonese Republic, and Mr. Pierre Guillaumat, the chairman of the petroleum company, Total Gabon. The Centre was inaugurated on December 5th, 1979 with the participation of numerous internationally eminent scientists ( Figure 1).
The International Centre for Medical Research of Franceville (CIRMF). Campus aerial view: the P4 laboratory: A = P4 laboratory facilities; B = Main Building; C = P3 Laboratory; D = Primatology Center.
In the 1990s, viral hemorrhagic fevers became a focus of attention in Equatorial. The decision to develop a high security laboratory for the study of Ebola virus disease came after a 1996 Ebola virus disease outbreak in Mayibout area, Gabon. The main objective was to develop the potential for rapid and specific diagnosis on viral hemorrhagic fevers and to have a backup for field investigation of severe viral hemorrhagic fever epidemics. Because the unique expertise and interaction of the CIRMF team along with the international World Health Organization (WHO) teams for Ebola virus disease, the Gabonese government agreed to such a project. The first BSL3+ (including negative pressure and glove box) laboratory was built in 1997, mostly financed by the Foreign Ministry of France ( Figure 2). This laboratory was built in a period of quasi “emergence” of successive Ebola virus disease outbreaks in Gabon, and the plans to upgrade the BSL3+ laboratory were not efficient. A specific research unit was founded in 1998 to study emerging infectious diseases: The Emerging Viral Disease Unit (UMVE). Thanks to work done between 1996 and 1998, both in the field and in research, CIRMF became a National Reference Laboratory and a WHO Collaborating Center in the Equatorial African region. A second high security laboratory for Risk Group 3/4 Agents, mostly funded by the TOTAL Gabon oil company and the Gabonese Government, was built between 2003 and 2008 on CIRMF campus ( Figure 3). This BSL-4 laboratory was commissioned by a combined team of experts from the Pasteur Institute of Paris, National Institute of Health and Medical Research, France, and Jean Mérieux P4 laboratory of Lyon.
The International Centre for Medical Research of Franceville (CIRMF). Emerging Viral Diseases Unit P3 laboratory.
The Present CIRMF High Security P4 Laboratory with “Glove Box”.
On 45 hectares, the CIRMF campus has a working space of 2,500 square meters composed of a main building, laboratories, service buildings, and living accommodations ( Figure 1). The present high containment and high security laboratory, operated by the Emerging Viral Diseases Unit (UMVE), is one of 2 laboratories in Africa that can manipulate Risk Group 3/4 Agents ( i.e., Ebola, Marburg, and Crimean-Congo hemorrhagic fever viruses). Research, including isolation and characterization of these highly pathogenic viruses is performed in accordance with international rules defined by WHO on the handling Risk Group 3/4 Agents Updated equipment includes a double door autoclave, thermo regulated cabinet, a high security centrifuge system, a conventional photonic microscope, a virus isolation unit, and two independent rooms the can be shut down alternatively after decontamination when necessary. An uninterruptable controlled electrical supply for refrigeration, computer systems, and other systems is ensured by two back-up power plants. The telecommunication network consists of mobile phones and the Internet through a dedicated satellite antenna. Other service units consist of a Primate Center, the Gorilla and Chimpanzee Study Station in Lopé National Park, and the Dienga Health Observatory. Investigators from this observatory conduct field studies on the prevalence of viral and parasitic diseases and their implications for public health [ 1]
Dedicated to medical research, the Primate Center houses more than 450 primates belonging to ten different African species (e.g., chimpanzees ( Pan troglodytes), gorillas ( Gorilla sp), mandrills ( Mandrillus sphinx), guenons ( Cercopithecus sp.), collared mangabeys ( Cercocebus torquatus), greater spot-nosed monkeys ( Cercopithecus nictitans), vervet monkeys ( Chlorocebus pygerythrus) and an Asian macaque ( Macaca sp.) colony. One of the largest primate centers in Africa, the Primate Center is equipped with level A2 and A3 animal facilities for scientific research protocols. The Great Apes are housed in large open-air facilities. Semi-free living colony of twelve forested hectares harbor about half of the primates at the Primate center. At the Gorillas and Chimpanzee Study Station, researchers study ecological approaches to the emergence of zoonotic diseases, inter-species transmission of pathogens, and disease outbreaks in humans and wild animals [ 2].
Several councils composed of eminent scientists and politicians participate in the functioning of CIRMF. The Administrative Council, created by the two cofounders of CIRMF, the Gabonese Government and Total-Gabon is open to other partners like the French Foreign Office, the Institute for Research Development (IRD), Marseille, and other European agencies. The Scientific Council presided by Professor Patrice Debré (National Institute of Health and Medical Research, France) recommends scientific policy to the Board of Directors [ 2].
Running costs are funded by the Ministry of Economy, Gabon, the national petroleum company of Total-Gabon, and the Ministry of Foreign and European Affairs, France. Several international agencies participate in a variety of financial supports including scientists’ salaries, equipment, research projects, and academic grants (e.g., IRD, WHO, United States Agency for International Development, National Center for Scientific Research, France).
Technical laboratory training support of Gabonese teams and other African countries has been one of the major aims of CIRMF. The UMVE actively participates in the academic training at the Regional Graduate School and the different State universities of Equatorial Africa. A special relationship with the “Health Sciences University” of Libreville and the “Sciences and Technology University” of Masuku in Franceville encourages collaborative research projects with teachers and supports students of the Faculties of Medicine and Sciences in the preparation of doctoral theses. CIRMF receives doctoral and post-doctoral scientists from other universities of developed countries (e.g., Bonn, Marseille, Montpellier, and Tübingen Universities). Continuing medical education in the form of post-doctoral workshops are held at the CIRMF for discussion and demonstration of modern techniques.
As a National reference laboratory, CIRMF has the following roles: diagnosis of suspected cases during outbreaks of viral hemorrhagic fevers or severe clinical infectious syndromes; development of new methods for diagnosing such infections; surveillance of animal fatalities in reservoir or intermediate hosts; and intervention during outbreaks of unknown etiology. CIRMF diagnosed infections of more than 70 pathogens that could not be identified in other biology laboratories throughout the country. CIRMF maintains close ties to several components of the National Healthcare system, such as Amissa Bongo Regional Hospital in Franceville or the Sino-Gabonese Friendship Hospital.
In order to facilitate national and international scientific exchanges including scientists, equipment, biological specimens, the capital of Gabon, Libreville, is part of CIRMF operational system. Hosted by the University of Health Sciences, Libreville, one laboratory is now operational. Tight connections with other scientific teams in Libreville are under development ( i.e.,: Military Hospital, Libreville; General Hospital, Libreville; A. Schweitzer Lambarene Foundation).
The Emerging Viral Diseases Unit, CIRMF, proposes forming a research partnership to study infectious diseases transmitted by animals of the tropical rain forests regions of Equatorial Africa. The proposed partnership builds on such existing collaborations of several years between the major research centers of 2 other French speaking Equatorial African countries, namely the National Public Health Laboratory in Brazzaville, Republic of the Congo, and the Institute for Biomedical Research in Kinshasa, Democratic Republic of Congo. An international partnership with the IRD, Marseille, France, and the Institute of Virology, Bonn, Germany, will assist in the development of this regional partnership.
With the WHO Regional Office, Brazzaville, Republic of the Congo, the UMVE-CIRMF field team participates along with other international partners (e.g., Centers for Disease Control and Prevention, USA; Laboratory Centre for Disease Control and National Microbiology Laboratory, Winnipeg, Canada; P4 Laboratory of the National Institute for Communicable Diseases, South Africa) to respond to all Ebola virus disease epidemics in Africa. CIRMF aims to use laboratory and field expertise be a regional focal resource in conjunction with local health authorities to organize epidemic responses. CIRMF expertise is also offered from by entering into laboratory-to-laboratory agreements. Also, an informal international laboratory network for the diagnosis and surveillance of severe infectious clinical syndromes includes: the Institut National de Recherche Biomédicale, Democratic Republic of the Congo; Laboratoire National de Santé Publique de Brazzaville, Republic of the Congo; Metabiota/Laboratoire des Maladies Emergentes, Yaoundé, Cameroon; Pasteur Institute, Bangui, Central African Republic; Institute of Virology, Bonn University, Germany; and P4 Jean Mérieux Lyon, France. Exchange of materials, equipment, and personnel is facilitated through memorandums of understanding.
CIRMF holds more than 250,000 samples of various origins in a biological repository, which is accessible to the International scientific community. The UVME assists the National Public Health System in consolidating and formalizing microbiological monitoring of the Equatorial African sub-region. Ultimately, CIRMF will be positioned as a Center of Excellence for microbiological surveillance and research in a global network.
Developing diagnostic tools and strategies is the main driver to improve surveillance and research of emerging viral diseases. A strategic choice was made to link syndromes to an etiological agent, including hemorrhagic syndromes. To isolate and diagnose highly pathogenic viruses, a progressive and diversified methodology was applied. The first approach used real-time virus-specific PCR (qRT-PCR). If the first approach was not successful, conventional RT-PCR was implemented using degenerate consensus primers targeting conserved regions of the genome. Ultimately, random amplification of nucleotide sequences was directly applied to the original biological material (DNA chip re-sequencing, meta-genomic pyrosequencing (454 Life Sciences, Branford, CT)).
UMVE studied the factors implicated in the three steps that led to Ebola virus and Marburg virus diseases emergence in humans. These steps include: the identification of reservoir species, the circulation within the natural host, the crossing to intermediary animal species, and finally the direct transmission to humans from great apes and fruit bats. Antibodies and nucleotide sequences specific for Ebola virus were detected in the liver and spleen of fruit bat belonging to three species ( Hypsignathus monstrosus, Epomops franqueti, Myonycteris torquata) in Gabon and Republic of the Congo ( Figure 4). Antibodies and nucleotide sequences specific for Marburg virus were found in the Egyptian fruit bat ( Rousettus aegyptiacus) in Gabon, suggesting that bats might be reservoirs for filoviruses [ 3, 4, 5].
Field Biosafety and Trapping Potential Ebola Virus Reservoir Bats in Gabon.
We showed that Ebola virus caused extensive epizootics among gorillas and chimpanzees, killing thousands of animals during the last decade in parts of Gabon and Republic of the Congo [ 4]. We characterized the viral variants associated with all Ebola virus disease outbreaks that occurred between 1996 and 2008 and developed new epidemiological models of Ebola virus disease epidemics, based on the identification of several independent epidemic chains. The identification of multiple variants during the 2001 Gabon/Republic of Congo outbreak and two phylogenetically divergent lineages suggest independent introductions into great ape and human populations following multiple viral spillovers from a reservoir host [ 6, 7]. In this “multi-emergence” hypothesis, Ebola virus disease outbreaks would occur episodically during certain ecological conditions caused by habitat disturbances or climatic phenomena. This hypothesis also implicitly assumes that Ebola virus was present in Equatorial Africa long before the first documented disease outbreak in 1976, as supported by various serological surveys. Furthermore, we recently showed that the 2007 Luebo outbreak in the Democratic Republic of the Congo was linked to massive fruit bat migration, strongly suggesting that humans could be infected directly by bats or by consumption of bats [ 8].
In the study of immunological mechanisms of Ebola virus disease humans, we showed that fatal infection is associated with aberrant innate immunity and global suppression of adaptive immunity [ 9, 10, 11, 12]. The innate immune reaction is characterized by a ‘cytokine storm’, with a hyper secretion of numerous pro-inflammatory cytokines, chemokines and growth factors, and by the noteworthy absence of antiviral interferon (IFN)-α [ 9, 13, 14]. Immunosuppression of adaptive immunity is characterized by very low levels of circulating cytokines produced by T lymphocytes and by massive loss of peripheral CD4 and CD8 lymphocytes, probably through Fas/FasL-mediated apoptosis. Finally, we hypothesized that a viral protein with super-antigen activity might be involved in the massive T cell apoptosis [ 15]. In striking contrast with fatal outcome, effective control of Ebola virus infection is associated with balanced immune responses in survivors. Asymptomatic Ebola virus infection was demonstrated in humans during the 1996-97 disease outbreak in Gabon [ 16]. Asymptomatic infection was associated with an early strong inflammatory response that may be involved in the early inhibition of viral replication [ 16, 17]. Consistent with this discovery, we showed a decade later that a large fraction of the human population living in forested areas of Gabon has both humoral and cellular immunity to Ebola virus [ 18]. In the absence of identified risk factors, the high prevalence of ‘immune’ individuals suggests a common source of human exposure such as fruits contaminated by bat saliva.
Initially focused on Ebola virus disease, UMVE science policy was redirected since 2007 by expanding the main research themes to other emerging viral diseases that could threaten public health in the Congo basin ( Table 1) [ 19, 20, 21, 22].
CIRMF is geographically isolated from the capital of Gabon, Libreville. The Libreville office is essential to the Franceville headquarters as it coordinates visits from staff on field missions, and forwards imported equipment to headquarters. The capital is accessible by a 12-hour ride in a four-wheel drive vehicle or in a train (three times/week schedule) covering 641 km. Due to tropical weather, four weekly domestic plane rotations often fly on an inconsistent schedule. Ultimately CIRMF needs to be largely autonomous in term of electrical power ( i.e.,: unexpected fuel supply disruption), cold chain with the necessity to maintain in situ a unit of liquid nitrogen production (repository), and purified water supply.
Viruses identified by the Emerging Viral Unit using CIRMF high containment facilities.
| centermiddle11 Filoviridae | centermiddle11 Ebolavirus/Ebola virus **** | centermiddle11Mayibout 2/Gabon | centermiddle111996 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Booué/Gabon | centermiddle111997 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Mendemba/Gabon | centermiddle112001 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Makokou/Gabon | centermiddle112002 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Ilahounéné/Gabon | centermiddle112002 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Ekatangaye/Gabon | centermiddle112002 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Ekata/Gabon | centermiddle112001 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Olloba/Gabon | centermiddle112001 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Mbomo/Gabon | centermiddle112002 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Yembelengoye/Gabon | centermiddle112003 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Mvoula/RC * | centermiddle112003 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Mbandza/RC | centermiddle112003 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Etoumbi/RC | centermiddle112005 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Luebo/RDC | centermiddle112007 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Luebo/RDC | centermiddle112008 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11Ekata/Gabon | centermiddle112002 | centermiddle11Bat | centermiddle11+/- |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11/Gabon | centermiddle112002 | centermiddle11Chimp | centermiddle11+/- |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11/Gabon | centermiddle112002 | centermiddle11Gorilla | centermiddle11+/- |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11/Gabon | centermiddle112002 | centermiddle11Duiker | centermiddle11+/- |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11/Gabon | centermiddle112003 | centermiddle11Chimp | centermiddle11+/- |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11/Gabon | centermiddle112003 | centermiddle11Gorilla | centermiddle11+/- |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11/RC | centermiddle112005 | centermiddle11Chimp | centermiddle11+/- |
| centermiddle11 | centermiddle11 Ebolavirus/Ebola virus | centermiddle11/RC | centermiddle112005 | centermiddle11Gorilla | centermiddle11+/- |
| centermiddle11 | centermiddle11 Marburgvirus/Marburg virus | centermiddle11Lambaréné/Gabon | centermiddle112005 | centermiddle11Bat | centermiddle11+/- |
| centermiddle11 | centermiddle11 Marburgvirus/Marburg virus | centermiddle11Tchibanga/Gabon | centermiddle112006 | centermiddle11Bat | centermiddle11+/- |
| centermiddle11 | centermiddle11 Marburgvirus/Marburg virus | centermiddle11Makokou/Gabon | centermiddle112009 | centermiddle11Bat | centermiddle11+/- |
| centermiddle11 Togaviridae | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11Malabo/EG | centermiddle112007 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11Libreville/Gabon | centermiddle112007–2008 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11Oyem/Gabon | centermiddle112007 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11Lambaréné/Gabon | centermiddle112008–2009 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11Ndjolé/Gabon | centermiddle112008 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11Lastourville/Gabon | centermiddle112007 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11Franceville/Gabon | centermiddle112010 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11/Gabon | centermiddle112007–2010 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11Brazzaville/RC | centermiddle112011 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11/RDC | centermiddle112010–2011 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Alphavirus/Chikungunya virus | centermiddle11/Gabon | centermiddle112007–2010 | centermiddle11Mosquito | centermiddle11+/- |
| centermiddle11 Flaviviridae | centermiddle11 Flavivirus/Dengue virus 2 | centermiddle11Libreville/Gabon | centermiddle1120072008 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 2 | centermiddle11Oyem/Gabon | centermiddle112007 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 2 | centermiddle11Lambaréné/Gabon | centermiddle112008–2009 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 2 | centermiddle11Ndjolé/Gabon | centermiddle112008 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 2 | centermiddle11Lastourville/Gabon | centermiddle112007 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 2 | centermiddle11Franceville/Gabon | centermiddle112010 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 2 | centermiddle11/RDC | centermiddle112011 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 2 | centermiddle11/Gabon | centermiddle112007–2010 | centermiddle11Mosquito | centermiddle11+/- |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 1 | centermiddle11Libreville/Gabon | centermiddle112007–2008 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 1 | centermiddle11Lambaréné/Gabon | centermiddle112008–2009 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 1 | centermiddle11Franceville/Gabon | centermiddle112010 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 1 | centermiddle11/RDC | centermiddle112011 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Flavivirus/Dengue virus 3 | centermiddle11Franceville/Gabon | centermiddle112010 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 Flaviviridae | centermiddle11 Flavivirus/Zika virus | centermiddle11Libreville/Gabon | centermiddle112007 | centermiddle11Human/Mosquito | centermiddle11+/- |
| centermiddle11 | centermiddle11 Flavivirus/Wesselsbron virus | centermiddle11/Gabon | centermiddle112010 | centermiddle11Duiker | centermiddle11+/- |
| centermiddle11 | centermiddle11 Flavivirus/Spondweni virus | centermiddle11/Gabon | centermiddle112010 | centermiddle11Duiker | centermiddle11+/- |
| centermiddle11 Bunyaviridae | centermiddle11 Nairovirus/CCHFV | centermiddle11/RDC | centermiddle112009 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Phlebovirus/RVFV * | centermiddle11/Gabon | centermiddle112011 | centermiddle11Tick | centermiddle11+/- |
| centermiddle11 Picornaviridae | centermiddle11Enterovirus/PV1 | centermiddle11Pointe Noire/RC | centermiddle112010 | centermiddle11Human | centermiddle11+/+ |
| centermiddle11 | centermiddle11Rhinovirus/UT ***** | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11Parechovirus/UT | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11Parechovirus/UT | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11Enterovirus/UT | centermiddle11/Gabon | centermiddle112011 | centermiddle11Monkeys | centermiddle11+/- |
| centermiddle11 Coronaviridae | centermiddle11 Coronavirus/HCoV NL63 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Coronavirus/HCoV HKU1 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Coronavirus/HCoV OC43 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Coronavirus/HCoV 229E | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Coronavirus/ UT | centermiddle11/Gabon | centermiddle112005–2009 | centermiddle11Bat | centermiddle11+/- |
| centermiddle11 Paramyxoviridae | centermiddle11 Pneumovirus/hRSV | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Respirovirus/PIV 1 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Rubulavirus/PIV 2 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Respirovirus/PIV 3 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Rubulavirus/PIV 4 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Metapneumovirus/hMPV | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Rubulavirus/ UT | centermiddle11/Gabon | centermiddle112005–2009 | centermiddle11Bat | centermiddle11+/- |
| centermiddle11 | centermiddle11 Morbillivirus/ UT | centermiddle11/Gabon | centermiddle112005–2009 | centermiddle11Bat | centermiddle11+/- |
| centermiddle11 | centermiddle11 Henipavirus/ UT | centermiddle11/Gabon | centermiddle112005–2009 | centermiddle11Bat | centermiddle11+/- |
| centermiddle11 Orthomyxoviridae | centermiddle11 Influenzavirus A/FLUAV H1N1 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Influenzavirus A | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Influenzavirus B | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 Adenoviridae | centermiddle11 Adenovirus/ UT | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 Reoviridae | centermiddle11 Rotavirus/ UT | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 Caliciviridae | centermiddle11 Sapovirus/ UT | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Norovirus/ NoVG2/2 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Norovirus/ NoV1/2 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 Astroviridae | centermiddle11 Astrovirus/ Human astrovirus | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 Herpesviridae | centermiddle11 Simplexvirus/HSV1 & HSV2 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Simplexvirus/HSV1 & HSV2 | centermiddle11/Gabon | centermiddle112010–2011 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Varicellovirus/VZV | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Varicellovirus/VZV | centermiddle11/Gabon | centermiddle112010–2011 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Cytomegalovirus/CMV | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Cytomegalovirus/CMV | centermiddle11/Gabon | centermiddle112010–2011 | centermiddle11Human | centermiddle11+/- |
| centermiddle11 | centermiddle11 Roseolovirus/HHV6 | centermiddle11/Gabon | centermiddle112010–2012 | centermiddle11Human | centermiddle11+/- |
* Each line refers to a serial virus identification and/or isolation (not to one single strain). ** RC = Republic of the Congo, DRC = Democratic Republic of the Congo; EG = Equatorial Guinea. *** Genetic characterization by partial or total sequencing/Virus isolation on cell culture; all Ebola virus strains are of the “Ebola-Zaïre” type; **** Undetermined Type.
CIRMF is uniquely suited to study infectious diseases of the Congolese tropical rain forest, the second world’s largest rain forest. As a central point of a North-South transect of the rain forest, the Center is able to study the biodiversity of Africa including animal species, microbes, and parasites.
CIRMF is dedicated to conduct medical research of the highest standard, and is the only facility of its type in Equatorial Africa. With unrivalled infrastructure, multiple sites, and multidisciplinary teams, the Center promotes a modern healthcare system in Gabon. CIRMF teams are engaged in trans-disciplinary projects bringing together specialists from the health sciences, biological sciences, veterinary medicine, conservation, the humanities, and environmental sciences. The Center welcomes partnerships from around the world to work on global human health issues.
We would like to thank all the UMVE-CIRMF and the Health Ecology Research Unit of CIRMF work teams. We acknowledge the support and funding of the Gabonese Government and the oil company TOTAL-Gabon. We acknowledge foreign agencies that largely contributed to the success of the “CIRMF Filovirus program”: the French Ministry of Foreign and European Affairs through the French Embassy in Gabon; Metabiota and Global Viral (alias GVFI) for technical and equipment support; and the Institute for Research Development, for funding research teams and providing high performance equipment.
The authors declare no conflict of interest.


The sample mean and standard deviation are two commonly used statistics in meta-analyses, but some trials use other summary statistics such as the median and quartiles to report the results. Therefore, researchers need to transform those information back to the sample mean and standard deviation. This package implemented sample mean estimators by Luo et al. (2016) <arXiv:1505.05687>, sample standard deviation estimators by Wan et al. (2014) <arXiv:1407.8038>, and the best linear unbiased estimators (BLUEs) of location and scale parameters by Yang et al. (2018, submitted) based on sample quantiles derived summaries in a meta-analysis.
| Version: | 1.0.0 |
| Depends: | R (≥ 3.3) |
| Imports: | stats, Matrix |
| Published: | 2018-05-29 |
| Author: | Xin Yang [cre, aut], Alan Hutson [aut], Dongliang Wang [aut] |
| Maintainer: | Xin Yang <xyang.krystal at gmail.com> |
| License: | GPL-2 |
| NeedsCompilation: | no |
| CRAN checks: | metaBLUE results |
| Reference manual: | metaBLUE.pdf |
| Package source: | metaBLUE_1.0.0.tar.gz |
| Windows binaries: | r-devel: metaBLUE_1.0.0.zip, r-release: metaBLUE_1.0.0.zip, r-oldrel: metaBLUE_1.0.0.zip |
| OS X binaries: | r-release: metaBLUE_1.0.0.tgz, r-oldrel: metaBLUE_1.0.0.tgz |
Please use the canonical form https://CRAN.R-project.org/package=metaBLUE to link to this page.


Which of the following best describes the value of {dimensionName} for the example below?
{dimensionName}
{option}
How do you feel about your answer?


Rodrigo Roa Duterte
A true leader
Early life
Duterte was born on March 28, 1945, in Maasin. His father was Vicente G. Duterte (1911–1968), a Cebuano lawyer, and his mother, Soledad Duterte (née Roa; 1916–2012), was a school teacher from Cabadbaran, Agusan and a civic leader of Maranao descent.Education
Duterte went to Laboon Elementary School in Maasin, for a year.[36] He spent his remaining elementary days at the Santa Ana Elementary School in Davao City, where he graduated in 1956. He finished his secondary education in the High School Department of the then-Holy Cross College of Digos (now Cor Jesu College) in today's city of Digos in the now defunct Davao province, after being expelled twice from previous schools, including one in Ateneo de Davao University (AdDU) High School due to misconduct. He graduated in 1968 with a Bachelor of Arts degree in political science at the Lyceum of the Philippines in Manila. He obtained a law degree from San Beda College of Law in 1972. In the same year, he passed the bar exam.Personal life
Duterte is known for being an avid fan of big bikes but detests luxury cars. He once owned a second-hand Harley-Davidson and currently a Yamaha Virago. He was once a habitual smoker, but he eventually quit after a doctor's suggestion due to health concerns. Duterte is an avid reader of Robert Ludlum and Sidney Sheldon novels.[404] Duterte is also known for his straightforward and vocal attitude in public especially in interviews, showing no hesitation in using profanity profusely live on-screen on numerous occasions despite formal requests by media groups and schools beforehand to abstain.In office
- 2016 - 16th President of the Republic of the Philippines
- 2013 - 2016 Mayor of Davao City
- 2010 - 2013 Vice Mayor of Davao City
- 2002 Became President Arroyo's anti-crime consultant
- 1998 - 2001 Member of the Philiippine House of Representatives from Davao City's 1st District
- 1983 - 1986 Second Assistant City Prosecutor
- 1979 - 1981 Third Assistant City Prosecutor
- 1977 - 1979 Special Counsel at the City Prosecution Office
Accomplishments while in Malacañang
- Return of the historic Balangiga bells to the Philippines;
- Declaration of the Philippine Rise as a Marine Resource Reserve
- Signing of a memorandum of agreement between the Philippines and Kuwait to protect overseas Filipino workers (OFWs)
- Reopening of the world famous destination Boracay Island after six months of rehabilitation
- A 6.1% growth of the country’s Gross Domestic Product for the third quarter of 2018
- and many more


Weather
in package
Uses
WithExceptionHandler
Table of Contents
Properties
- $weatherData : stdClass|array<string|int, mixed>
Methods
- __construct() : mixed
- airQuality() : AirQuality|null
- The Weather model AirQuality method serves for the Current API method only and cannot be combined with any other API method
- alerts() : Collection<string|int, Alert>|null
- astro() : Astronomy|null
- The Weather model Astro method serves for the Astronomy API method only and cannot be combined with any other API method
- current() : Current|null
- The Weather model Current method serves for the Current API method only and cannot be combined with any other API method
- forecast() : Collection<string|int, Forecast>|null
- ipLookup() : IpLookup|null
- The Weather model IpLookup method serves for the IP Lookup API method only and cannot be combined with any other API method
- location() : Location|null
- marine() : Collection<string|int, Marine>|null
- search() : Collection<string|int, Search>|null
- The Weather model Search method serves for the Search API method only and cannot be combined with any other API method
- sports() : Collection|null
- The Weather model Sports method serves for the Sport API method only and cannot be combined with any other API method
- timezone() : Timezone|null
- handleThrowable() : never
- handleWeatherException() : never
- validateWeatherData() : bool
Properties
$weatherData
protected
stdClass|array<string|int, mixed>
$weatherData
Methods
__construct()
public
__construct(stdClass|array<string|int, stdClass> $weatherData) : mixed
Parameters
- $weatherData : stdClass|array<string|int, stdClass>
airQuality()
The Weather model AirQuality method serves for the Current API method only and cannot be combined with any other API method
public
airQuality() : AirQuality|null
For Forecast API please use the appropriate ForecastDay and ForecastHour GetAirQuality method
Tags
Return values
AirQuality|nullalerts()
public
alerts() : Collection<string|int, Alert>|null
Tags
Return values
Collection<string|int, Alert>|nullastro()
The Weather model Astro method serves for the Astronomy API method only and cannot be combined with any other API method
public
astro() : Astronomy|null
For Forecast API please use the appropriate Forecast Astro method
Tags
Return values
Astronomy|nullcurrent()
The Weather model Current method serves for the Current API method only and cannot be combined with any other API method
public
current() : Current|null
Tags
Return values
Current|nullforecast()
public
forecast() : Collection<string|int, Forecast>|null
Tags
Return values
Collection<string|int, Forecast>|nullipLookup()
The Weather model IpLookup method serves for the IP Lookup API method only and cannot be combined with any other API method
public
ipLookup() : IpLookup|null
Tags
Return values
IpLookup|nulllocation()
public
location() : Location|null
Tags
Return values
Location|nullmarine()
public
marine() : Collection<string|int, Marine>|null
Tags
Return values
Collection<string|int, Marine>|nullsearch()
The Weather model Search method serves for the Search API method only and cannot be combined with any other API method
public
search() : Collection<string|int, Search>|null
Tags
Return values
Collection<string|int, Search>|nullsports()
The Weather model Sports method serves for the Sport API method only and cannot be combined with any other API method
public
sports() : Collection|null
Tags
Return values
Collection|nulltimezone()
public
timezone() : Timezone|null
Tags
Return values
Timezone|nullhandleThrowable()
protected
handleThrowable(Throwable $exception) : never
Parameters
- $exception : Throwable
Tags
Return values
neverhandleWeatherException()
protected
handleWeatherException(WeatherException $exception) : never
Parameters
- $exception : WeatherException
Tags
Return values
nevervalidateWeatherData()
private
validateWeatherData([string|null $outerKey = null ][, string|null $innerKey = null ]) : bool
Parameters
- $outerKey : string|null = null
- $innerKey : string|null = null


{% extends 'layouts/two_pane.html' %} {% block twoThirds %}
If you typed the web address, check it is correct.
If you pasted the web address, check you copied the entire address.
Contact support if you need any help.


Pairing with others to solve challenges are very useful and helpful. When I didn't know some part or cannot figure out, my partner may know this. Then my partner can teach me. So this make 1+1 and sometimes even >2. You see, it's great. And the error we made in pairing is easy to be found by partners. At the same time, the error is easy to be remembered. However, sometimes, I feel difficult to pair when I know nothing about this challenge.
After pairing, writing feedback is necessary. And reading the feedback that partners wrote for me is a happy time :) I can learn something that I can improve, and I can find some place that I am really good but I didn't realize :) And partner's feedback are always very kind and sweet!
We know that it's always very hard to do anything the first time. After it, the more times, easier and better. I think that's because we will get feedback from partners and can improve from it. I really do like this.
After pairing, the first thing is to write the feedback. However, because I am not good at writing, I always spend much time only on some paragraphs. However, writing feedback is a good thing. My feedback can let my partner know what I think about this pairing. And during the time I wrote the feedback, I also thinking about what I did during the pairing.
Before DBC learning, I am not always writing feedback and reading feedback. I find the feedback is very helpful and useful and always very kind!


--- layout: post permalink: cheaphumidors.html Tags: Array NameOfCoupon: Cheap Humidors Cash Back Summary: See our Cheap Humidors Coupon Code, Cheap Humidors Rebate, Cheap Humidors Promo Code, Cheap Humidors Discount, Cheap Humidors Coupon Cash Back Rebate here.  We have the best Cheap Humidors Rebate anywhere. thesis_keywords: Cheap Humidors, Cheap Humidors Coupon Code, Cheap Humidors Discount, Cheap Humidors Rebate product_name: Cheap Humidors hop_url: http://www.icouponblog.com/hop.php?id=4978 ---
Are you a connoisseur of good taste and fine smoking? Do you have a fine collection of cigars that you would like to keep fresh and also show and share with your friends? Then you would need a humidor. Visit the online store www.cheaphumidors.com. They are cheap only in price, not in looks, sophistication or effectiveness. Check out www.cheaphumidors.com for a fine collection of humidors, cigars, hygrometers, cases and tubes, cutters, ashtrays and lighters etc. Use our discount coupon to get a great price.
There is a large collection of humidors available in various price ranges on www.cheaphumidors.com. If you are new to cigars, you might want to order the beautiful, ‘Black protégé glass top cigar humidor. This humidor is awesome.  If you have a large collection of cigars to store, you can get big cabinet that holds over 500 cigars or more. The hygrometer will control the moisture and keep the cigars fresh and tasteful. There is a lot to choose from, visit online and browse through the user friendly website to find your perfect humidor, cigar, lighter and ashtray!
If you like cigars and like to keep them fresh and tasteful, get a humidor which will keep away the moisture from your cigar and keep it fresh in taste and aroma. You can buy the humidor that suits your needs and budget from www.cheaphumidors.com. Save money by using our coupons.