An exciting opportunity has arisen for an Early Stage Researcher in Quantitative T Cell Immunology in the Department of Medicine, Imperial College London.
You will join a new interdisciplinary project headed by Dr Becca Asquith, carrying out experimental research on the dynamics, lineage and generation of stem cell memory T cells in humans. You will be part of the European Union funded H2020 Programme Initial Training Network, which involves Universities, Research Institutes and industrial companies across Europe. You will be one of a cohort of 15 Early Stage Researchers and will undergo training together and attend joint network-wide events. The position includes funding for home/EU PhD tuition fees.
You will be a dedicated member of the group who will perform mathematical modelling work (including model development and parameter inference) and some experimental work (including stable isotope labelling, flow cytometry and RNAseq) to investigate the dynamics, maintenance and and lineage of memory T cells in humans. The ideal candidate will have training in both mathematical modelling techniques and experimental immunology. However, we also welcome applications from individuals with a solely theoretical or solely experimental background.
You must hold a first degree or equivalent (e.g. BSc / BA) in Mathematics, Physics, Bioinformatics, Computer Sciences, Biology, Biomedicine, Biochemistry or other appropriate discipline. Knowledge of immunology, basic research methods and statistical procedures is also required.
Brexit: Please note that this position and the associated funding are guaranteed whatever the outcome of the Brexit negotiations.
The position is funded by the European Union under the Horizon 2020 Programme. Candidates must be eligible to be appointed as an Early Stage Researcher in the UK. You will have, at the time of recruitment, less than four years full-time equivalent research experience and have not yet been awarded a doctoral degree. Full-time equivalent research experience is measured from the date when a researcher obtained the degree which would formally entitle him or her to embark on a doctorate, either in the country in which the degree was obtained or in the country in which the researcher is recruited or seconded, irrespective of whether or not a doctorate is or was ever envisaged.
The successful candidate must be able to start work on or before 1 September 2019.
In addition to the above criteriea, you should, at the time of recruitment, not have resided or carried out your main activity (work, studies, etc.) in the UK for more than twelve months in the three years immediately prior to the date of recruitment). There are no nationality restrictions but the post only covers home/EU PhD tuition fees, if you are not eligible for home/EU fees and wish to undertake a PhD you must fund the difference between overseas and home/EU fees.
Marie Sklodowska-Curie Early Stage Researcher (ESR) - to track nanoparticles as they bind and internalise into mammalian model cell line systems (lung, intestine, blood-brain-barrier).


Did my lawyer make a Serious mistake?
I established the Law Office of Charles P. Kazarian in Boston more than three decades ago to use my experience as a trial attorney to successfully battle negligent lawyers and uncaring insurance companies. I also represent business owners in disputes with partners, shareholders and other businesses.
I feel strongly that a broad background in the practice of law is necessary to adequately represent my clients. Over the past 35 years I have acquired solid experience, handling cases against lawyers who have mishandled client matters in the areas of commercial and business law, personal injury, civil rights / discrimination, consumer protection, corporate law, criminal law, employment law, ethics & professional responsibility. I have earned the respect of my peers and numerous referrals from satisfied clients throughout Massachusetts and New England.
As an attorney, my goals are to earn the trust and confidence of new clients from the very beginning and to consistently maintain a positive attorney-client relationship with every one of my clients.
Many of my new clients are confused and hesitant — especially those who feel betrayed by their previous attorney and are coming to me with a legal malpractice case. The goal of my initial discussion with you will be to demystify the legal process and empower you to make well-informed decisions. I offer a team-approach to the attorney-client relationship where the goals of both must be in sync. I never stop until I am certain that I understand exactly what you need, or until you understand exactly not only your legal rights, but where the practical and legal solutions are.
Good communication is key to a successful attorney-client relationship. I will try to place your concerns in the context of your everyday life and to address your concerns in a thorough, professional and courteous manner.
I don't use the term "personal attention" as a hollow buzzword. Rather, I adhere to the meaning of the term by giving my clients frequent case updates and promptly returning their phone calls. To me, keeping you informed leads to positive, constructive progress in your case and ensures your expectations are met.
Call (617) 723-6676 today for a confidential review of your case. There is no cost for an initial e-mail exchange or telephone consultation with me or my staff. Or you can fill out the contact form on this site, including as many details as you feel are necessary about your legal malpractice or other matter. We try to respond to all emails within 24 hours.
Charles Kazarian has been named as a MA SuperLawyer in the field of Plaintiffs Legal Malpractice in 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 and 2015.
Attorney Charles P. Kazarian represents clients in Boston, Cambridge, Brookline, Stoughton, Concord, Lawrence, Needham, Framingham, Quincy, Woburn, Waltham, Worcester, Springfield, Plymouth, Suffolk County, Middlesex County, Plymouth County, Barnstable County, Norfolk County, Essex County, Bristol County and other communities in Massachusetts, Rhode Island, New Hampshire, Maine, and throughout Cape Cod and New England.


Fiat Flameout: Hi Ho Silver!
While many gold market technicians have been neutral to slightly negative about gold in the short-term, I've been extremely positive.
As of today, I've become outrageously more positive. This is the spectacular daily gold chart.
I'll dare to suggest that gold investors have behaved very well this year.
As a result of that behaviour, Santa has put a beautiful bull wedge breakout into everybody's Christmas stocking!
The near-immediate price target is $1310, but $1360 should also be hit during what looks to be a very positive Chinese New Year season.
Do the festivities extend to gold stocks as well?
Absolutely! This is the GDX chart.
GDX is sporting a great looking inverse head and shoulders bottom, and the rally from the head of the pattern has a bull pennant formation breakout in it.
This is quite exciting. For gold stock investors around the world, it is really ushering in the New Year in a great way.
I've suggested that the $25 - $26 target zone is likely to turn out to be little more than a pitstop on the road to the $35 area.
I've argued that the biggest bubble of all time is the bubble of government fiat money, and that bubble has started to burst. The initial bursting of the bubble has seen all global fiat collapse against blockchain currencies like bitcoin.
That's a lot like how the stock market crashes when it becomes a bubble. The initial collapse happens in the most speculative stocks. From there, the collapse spreads to the big Dow Jones Industrial Average component stocks.
In the case of the fiat bubble, I've predicted that the collapse of fiat against bitcoin is only the very beginning of a horrific collapse that will ultimately see fiat fall hard against gold, silver, and mining stocks.
This is the exciting bitcoin chart. Technically, the double bottom pattern is arguably the most difficult one for investors to handle emotionally. A great double bottom appears to be in play now on this short-term bitcoin chart. Note the immense panic volume on the first low, and the much lighter volume on the second one.
That's classic technical action. There's also a potential flag-like pattern in play, which is quite positive. A breakout above $15,000 is likely, and it would serve as a lead indicator for an imminent and powerful rally in the precious metal markets.
The bottom line: gold investors don't need to be invested in bitcoin, but it's important to follow the price action as a lead indicator for the spread of the global fiat wildfire.
Some heavyweight institutional analysts are concerned that a fall in bitcoin against fiat could trigger a stock market crash.
Governments and central banks are becoming pushed into a corner. They need to quickly regulate bitcoin markets so that a rogue bank or other nefarious entity doesn't try to cause a global markets crash by crashing bitcoin.
Tom Lee was head of equities for JP Morgan. He turned bullish on the US stock market at almost the exact low in 2009, and stayed bullish until 2016 when be saw the market as fully valued.
He's started his own firm now. He's moved his focus to bitcoin and was an eager buyer on Friday, as I was. With heavyweights like Tom in the blockchain house, the global fiat fire is likely to intensify.
This is the key money velocity chart. I think most mainstream analysts are underestimating the commitment of Trump and new Fed chair Powell to small bank deregulation.
That deregulation can end the twenty-year money velocity bear market, and usher in an era of inflation.
Hi ho silver! When inflation becomes widely accepted by institutional investors, they will flock to silver more than gold. This is particularly true if global growth continues. Watch for a trendline breakout fuelled by bank deregulation to send silver soaring to my initial $26 target, and on to higher prices after a brief rest there!
Special Offer For Gold-Eagle Readers: Please send me an Email to freereports4@gracelandupdates.com and I'll send you my free "Golden Rocket Man!" report. I highlight about eight key junior gold and silver stocks that could rocket 100% higher during the Chinese New Year season of 2018! I include precise buy and sell points for each of these great stocks.


Turgut — 06.11.2014 at 13:47:53 Civil, civil water, small claims, domestic last 4 digits of the.
Polat_Alemdar — 06.11.2014 at 23:59:55 Divorced, it really is often ideal ceberus will.
2OO8 — 06.11.2014 at 22:20:29 Bidder need to post with the Clerk ask for permission to search and loved ones member.


text:
Islamic Feminism Revisited
Margot Badran
Posted Feb 24, 2006 •Permalink • Printer-Friendly Version
Surveying the most recent developments in Islamic feminism, Margot Badran finds an increasingly dynamic global phenomenon that is as varied as it is radical
I gave a talk in Cairo in 2002 titled: "Islamic Feminism: What's in a Name?" There I explored the paradigm shift in feminism occurring within the Muslim umma at various locations during the 1990s that Muslim observers led in the process of naming Islamic feminism (see Al-Ahram Weekly, 17- 23 January, 2002). Now, four years later, I would look at the current chapter in Islamic feminism.
I had offered a concise definition of Islamic feminism gleaned from the writings and work of Muslim protagonists as a feminist discourse and practice that derives its understanding and mandate from the Qur'an, seeking rights and justice within the framework of gender equality for women and men in the totality of their existence. Islamic feminism explicates the idea of gender equality as part and parcel of the Qur'anic notion of equality of all insan (human beings) and calls for the implementation of gender equality in the state, civil institutions, and everyday life. It rejects the notion of a public/private dichotomy (by the way, absent in early Islamic jurisprudence or fiqh ) conceptualising a holistic umma in which Qur'anic ideals are operative in all space.
Islamic feminism aims to recover the notion of gender equality, radical in its day, that the Qur'anic revelation introduced into 7th century (C.E) patriarchal Arabia. Insan -ic equality, from which gender equality cannot be separated, did not sit well with the patriarchal cultures into which Islam was first introduced and spread. Patriarchal thought, institutions, and behaviours largely remained resistant over time to the revolutionary Qur'anic notion of gender equality to the extent that the equation of "patriarchy and Islam" became axiomatic.
Islamic feminism has taken on the two-fold task to expose and eradicate patriarchal ideas and practices glossed as Islamic—'naturalised' and perpetuated in that guise—and to recuperate Islam's core idea of gender equality (indivisible from human equality). For this Islamic feminism has incurred enemies from within and without the Muslim community: 1) from within—men who fear the loss of patriarchal privilege and women who fear the loss of patriarchal protection, and 2) from without—those whose pleasure and politics are found in denigrating Islam as irredeemably anti-women.
The new Islamic feminist paradigm began to surface a decade and a half ago simultaneously in old Muslim societies in parts of Africa and Asia and in newer communities in Europe and North America. I give three examples.
In Iran, immediately post-Khomeini, Muslim women, along with some male clerics, associated with the then new paper Zanan, as Muslims and citizens of an Islamic Republic called, in the name of Islam, for the practice of women's rights they found being infringed upon or rolled back, grounding their arguments in their readings of the Qur'an as the virtual constitution of the republic.
In South Africa, Muslim women and men, who had engaged as South Africans in one of history's fiercest battles for human dignity and justice, in the immediate post- apartheid period focussed their attention upon questions of justice, and especially gender justice, within their own Muslim community. Having been shunted around and cordoned off, conscientised (to use the expression from the Struggle) South African Muslims were sensitive to issues of access to space and the injustices and indignities attendant upon selective use of space and mandatory cordoning off of some human beings (on the basis of physical attributes) from "preferred others." These sensitised South African Muslims fought equal access to mosque/communal space for all Muslims, women and men alike.
In North America, women in immigrant (especially the second-generation) and convert communities turned to the Qur'an as a guide to life in new complex environments in which they did not have ready-made life-templates as Muslims. Patriarchal patterns of life in the villages and cities from which first-generation Muslim immigrants had come, which they tried to re-impose on women as Islamic, jarred in their new environments. Convert women in western societies were faced with a painful contradiction between what they understood to be Qur'anic ideals of justice and equality and various patriarchal notions and practices urged upon them as novices by self-appointed custodians of Islam.
Islamic feminism is an inter-Islamic phenomenon produced by Muslims at various locations around the globe. There is no East/West fault line. We cannot speak of Islamic feminism and the West. Islamic feminism, like Islam today, is in the West as it is in the East. Muslim detractors allege that "the West" has foisted feminism, first secular and now Islamic, upon Muslims to the detriment of Islam and society. Muslim proponents, on the other hand, hold that Islamic feminism promotes the enjoyment of social justice within the umma while it will also contribute to the creation of a more pluralistic and socially just West where all insan will be treated equal whatever their ethnic, religious, and gender affiliations. The triumph of Islamic feminism will also be part of the enhancement of social justice and equality in the African and Asian societies where Muslims live.
Turning to the older Muslim societies in Africa and Asia, Islamic feminism appeared first in countries where (patriarchal) Islamism got its earliest start, countries which had a large and expanding educated and professional female middleclass, and countries with a history of homegrown feminist thought and activism. Islamic feminism appeared on terrain prepared by Muslim women's earlier secular feminisms that were an amalgam of Islamic modernist, secular nationalist, and humanitarian (later human rights) discourses. Islamic feminism gave paramount attention to the Islamic modernist strand of secular feminism and, through engaging in new Qur'anic hermeneutic work, articulated an Islamic doctrine of the full equality of women and men across the public/ private spectrum. As such, it was more radical than the secular feminisms that had accepted the notion of gender complimentarity, not gender equality, within the sphere of the family.
It is important to note that Islamic feminism is the creation of women and men for whom religion is important in their daily lives and who are troubled by inequalities and injustices perpetrated in the name of religion. Islamic feminism continues to spread because it is relevant. It is engaged and enlightened. It is also controversial and unsettling.
Islamic feminism circulates globally with great speed and penetration. If early secular feminist thought circulated with the advent of the printing press and the rise of print journalism in Muslim societies, Islamic feminism is spreading infinitely faster and globally via the Internet and the Satellite. It has a vibrant presence in cyberspace reverberating in what Fatima Mernissi colourfully calls the "digital Islamic galaxy."
The theoretical core of Islamic feminism continues to be grounded in Qur'anic interpretation or tafsir. The central focus remains the explication of gender equality in Islam. There is increased evidence of the application of Islamic feminist theory in practice. This is seen in the revision of the Moroccan Mudawwana or Civil Code, now the most gender-egalitarian sharia -grounded civil code. It is also evident in the new draft revision of the Family Code in Indonesia, devised by a commission of religious scholars (half of whom are women) appointed within the Ministry of Justice. Another example of the application of gender-just interpretation of Islam is found in the arguments marshaled, through a dynamic investigation of fiqh (jurisprudence), that led to the acquittal of two Nigerian women accused of adultery and condemned to death under the new hudud (criminal laws) instituted in their northern Nigerian states while their partners were never held accountable.
The terms Islamic feminism and Islamic feminists are now more widely accepted. Islamic feminism is also part of the philosophy and politics of the movement of Progressive Islam. The term Progressive Islam first appeared in South Africa in the 1990s. Two years ago the Progressive Muslim Union was formed in the United States and recently the Progressive British Muslims group was launched in London at the House of Commons. Islamic feminism and progressive Islam are trans/nationally organised. The first international conference on Islamic feminism, held last fall in Barcelona, drew participants from old and new Muslim societies.
Muslim women are moving beyond passive knowledge of religion by engaging in ijtihad (independent investigation of religious sources) and becoming new authorities. In my historical investigation of Muslim women's early (secular) feminisms it was clear that Islam was salient in their gender thinking and activism. In the early decades of secular feminism (the late 19th and early 20th centuries), and let me take the Egyptian example, some women from within their gender-segregated worlds accessed the ideas of Islamic modernism advanced by Shaikh Muhammad Abduh (the famous late 19th and early 20th century Egyptian reformer) that were relevant to their lives as female Muslims. However, women's limited education at the time did not equip them to undertake their own interpretation of the Qur'an (Nazira Zain al-Din being an exception that proves the rule).
Since the final years of the 20th century women started to become part of new interpretive communities, producing compelling tafsir (analysis) and treatises on gender issues. While new female exegetes have commanded considerable respect in the global umma, they have also, not surprisingly, been discredited and maligned. However, if the messenger and her authority are attacked, the new gender-sensitive exegesis itself is becoming an authority. Meanwhile, it is becoming increasingly apparent that it is difficult to square Islamic notions of equality and justice with (secular) patriarchy still supported by conventional male religious authorities. The new Islamic feminist theorists and interpreters include: Asma Barlas (Pakistani), Riffat Hassan (Pakistani), Amina Wadud (African-American), Ziba Mir-Hosseini (Iranian), Qudsiyya Mirza (Iranian), and Aziza al-Hibri (Lebanese), to name just a few.
Muslim women are moving beyond patriarchal protection and re-figuring obedience. Islamic feminist tafsir elaborates a compelling explication of the equality of all human beings, male and female alike, while at the same time recognising gender difference. (There is a male/female duality in all creation, reflected in the grammatical construction of the Qur'anic language in reference to humankind and animals, which are rendered in the dual form: insan and hayawan. ) Recognition of biological duality in no way diminishes the idea of fundamental equality of all human beings. Neither sex is superior to the other. Neither sex is ordained to rule over the other. Patriarchy, as ideology and practice, with its stringent hierarchal ordering, fundamentally disrupts the Qur'anic ideal and practice of human equality.
In explicating human equality Islamic feminist exegetes focus on the Qur'anic notions of khilafa and tawhid. The Qur'an speaks of khilafa, or the trusteeship of God on earth, delegated to all human beings, a divinely ordained human agency. This trusteeship or agency, logically and morally cannot be diminished, or "de-equalised", by the biological attributes of insan—sexual, racial, or whatever.
Islamic feminist exegetes connect the idea of equality of all humankind in its (biological) duality with the idea of tawhid—the one-ness of God. No human being can partake of this one-ness. No human being can or should act like a God or exact what is owed only to God. Ta'a, or obedience, is due to God alone. Within the patriarchal universe women owe obedience to men, and younger males to older males. This obedience has often been so starkly constructed and stringently imposed that male human beings have made themselves into virtual gods.
The new gender-sensitive exegetes have focused attention on male supremacy in marriage and the family imposed in the name of Islam that is fundamentally disruptive of the Qur'anic principle of human equality. In 4:34 of the Qur'an, the term " qawwamuna 'ala " has been used to justify and perpetuate male authority over and protection of women as a prerogative and duty of men. The new women exegetes offer a rereading that affirms the Qur'anic ideal of human equality. They place the statement that men are qawwamuna 'ala women in the context of childbearing and nursing when women exert labor that men do not and cannot, and read this as men having responsibility "a degree above" in this context in a way that acts as a balancing or equalising of labour. Patriarchal interpretation reads this verse as ordaining that the male is in charge of the woman or has authority over the woman and he is a "degree above" her. The patriarchal reading has been so firmly and pervasively held over time and place that it is seen as "Islam itself."
This reading has promoted and entrenched the notion of male protection of women, the fundamental duty of a husband to support his wife materially and take charge of her spiritually and morally. Many women have welcomed this notion of male protection and material support as intrinsic to Islam and a decided benefit. But with this protection and material support have come exaggerated forms of obedience to men, to the point that it became a commonplace notion that a woman's path to heaven lay through obedience to her husband, thus detouring her obedience to God and rendering her khilafa second-class.
Along with deconstructing the notion of female dependency and male protection, Islamic feminists elaborate the idea of mutual support/protection of males and females embodied in the notion of awliya enjoined upon male and females believers, specifically citing the two genders . (Qur'an 9:71: "The believers, male and female, are protectors of one another.") Why has this idea historically not been made the touchstone of gender relations?
Islamic feminist interpreters work at the intersection of idea and reality. Gender-tuned interpreters of the Qur'an are mindful of changing social and economic realities as they approach the sacred text for guidance. Today in the greatly expanding middle classes in Muslim societies, husbands and wives have increasingly to pull their joint weight in the economic support of the family and in the everyday running of its affairs. Ideas of socially and religiously ascribed gender roles give way to practical imperatives. The Qur'anic notion of mutuality of spousal support is becoming increasingly operative in the middle strata of society as it has always been among the urban and rural poor who have historically constituted the majority of Muslims. The Qur'anic notion of gender equality, expressed in the notion of the mutual protection of the spouses of each other, has recently been legally established in the idea of dual headship of the family affirmed in the revised Moroccan Mudawwana and the new Indonesian draft family law, both of which are sharia - grounded.
Muslim women and men together are revamping ritual life. It is in Muslim minority communities, especially but not only in the West, that moves toward new ritual practices have been most apparent recently. In Muslim minority communities, participation in mosque-centered activities—especially congregational worship—has an intensity of meaning and social significance different from that found in Muslim majority societies. In minority contexts, individual and collective Muslim identity is expressed and re-affirmed within mosque space. If they are made unequal in religious space it casts them as second-class Muslims. In Muslim majority societies, Muslim identity prevails in society at large. However, while they may be part of the religious majority, women have acquired greater equality in secular space than in religious space. Muslim women find themselves equal in the larger national/secular society and unequal in their own communal space.
To return to the South African Islamic feminist contexts, in Cape Town in the mid-90s a woman (visiting theologian Amina Wadud) gave the first-ever pre- khutba talk at the Claremont Mosque. The 'mosque movement' in South Africa was a fulcrum for Islamic feminist demands for gender equality, or "gender jihad"—a term coined by an imam (Rashied Omar) in South Africa—- within the Muslim community. Now, a decade after the start of mosque activism in South Africa, mosque-centered movements are underway in the United States and Canada with women and men supporting the demand for female access to main mosque space during congregational prayer and women beginning to assume the role of imam, leading gender-mixed congregational worship.
Within the past year women have acted as imams in Friday services in the United States (the first time in a New York church when mosque space was refused them) and at a mosque in Canada. Women's demands for equal access to common mosque space and the ability to lead the congregational prayer for one American male convert conjured up sit- ins in the mid-20th-century United States by African- Americans who were demanding equal access to public institutions and space, denied them simply on the basis of race. This, in turn, reminds me of Muslims' post-apartheid demands in South Africa for non-discrimination of Muslims in mosque space on the basis of gender.
The mosque movement continues to spread and appears to be un-stoppable. The first-ever International Islamic Feminist Conference that took place in Barcelona last October, organised by the Junta Islamica Catalana, reaffirmed the call for women's free access to the mosque as a Muslim women's right. We note that here in Egypt ninety-four years ago among the secular/nationalist feminist demands presented to the Muslim National Congress meeting in Heliopolis (1911) was the call by women for access to mosques for congregational prayer. This was at a time when women of the middle and upper urban strata were segregated from public space; thus their entry into religious space would become part of their entry into public space.
Here I have only been able to touch the surface of the current chapter in the story of Islamic feminism. As seen from the presentation, the further elaboration of tafsir /theory and proliferation of activist projects are part of the dynamism of contemporary Islamic feminism. There are contradictions that Islamic feminist theorists and interpreters have to work through but they always keep their eyes on the highest Qur'anic ideals. There are practical roadblocks Islamic feminists face that not even the shield of unmarked discourse (the blotting out of the term Islamic feminism) can protect from. But, observation confirms that women as Islamic feminists remain committed to elaborating and living a gender- egalitarian Islam that they understand to be at the very core of the religion—a notion radical at the time of revelation and still radical today.
A version of this article was presented recently as a talk at the Netherlands/Flemish Institute in Cairo. Margot Badran is a senior fellow at the Prince Alwaleed Bin Talal Center for Muslim-Christian Understanding, Georgetown University.

redpajama_set_name: RedPajamaCommonCrawl


Made from white cotton-blend denim woven with a hint of stretch, this classic high waist pencil silhouette is updated here with a flattering wrap-effect and detailed with a diagonal row of buttons. Style it effortlessly with everything from tucked-in tees to printed blouses. Also available in Blue.


50 Macedonian business people also find their path to freedom out of the economic rat-race in the continued tour of Mr Georges Aslanis.
Skopje, November 5th 2015. The local IDEAS FreeBoss office in the Republic of Macedonia, headed by Verica Mazevska with her partner Ivana Panovska continued the tour of Mr Georges Aslanis, President WISE Europe. which started in Sofia, Bulgaria.
(See our earlier newsletter of 3 11 2015).
30 Bulgarian business people start the path to freedom by countering 51 ways to make a manager crazy.
Bulgaria, Sofia, November 3th 2015, Suite Hotel.
On a sunny November day, 30 managers gather in Suites Hotel to listen to IDEAs FreeBoss's special guest speaker Mr George Aslanis, President of W.I.S.E. Europe. Mr Aslanis stressed the importance of balancing cope and organize, quoting Mr L.Ron Hubbard: "the end product of copy is drown. The end product of organize is freedom." He gave the attendees precise tools they can use and apply immediately to counter the most important problems they encounter in their daily lives.
Those tools include : hiring correct staff, hatting them, making sure they have no misunderstood words in their job, managing by statistics only, continuous creation and much more.
After the seminar 4 people showed interest to become wise members and to give power to the purpose of WISE, which is to create a more sane business world.
Different attendees acquired 15 books of Mr L. Ron Hubbard and wanted more data via in house seminars.
IDEAs Freeboss and Mr Aslanis continue their Balkan tour with a seminar in Skopje, Republic of Macedonia on November 5th 2015.


text:
//
// Copyright 2020 Google LLC
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//

using Google.Solutions.IapDesktop.Extensions.Shell.Controls;
using Google.Solutions.Mvvm.Controls;
using NUnit.Framework;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Google.Solutions.IapDesktop.Extensions.Shell.Test.Controls
{
    [TestFixture]
    [Apartment(ApartmentState.STA)]
    public class TestVirtualTerminal : ShellFixtureBase
    {
        private readonly string Esc = "\u001b";

        private VirtualTerminal terminal;
        private Form form;
        private StringBuilder sendData;

        protected static void PumpWindowMessages()
            => System.Windows.Forms.Application.DoEvents();

        protected IList<string> GetOutput()
            => this.terminal.GetBuffer()
                .Split('\n')
                .Select(s => s.Trim())
                .Where(s => !string.IsNullOrEmpty(s))
                .ToList();

        [SetUp]
        public void SetUp()
        {
            this.sendData = new StringBuilder();
            this.form = new Form()
            {
                Size = new Size(800, 600)
            };

            terminal = new VirtualTerminal()
            {
                Dock = DockStyle.Fill
            };
            form.Controls.Add(terminal);

            terminal.SendData += (sender, args) =>
            {
                this.sendData.Append(args.Data);
            };

            form.Show();
            PumpWindowMessages();

            Clipboard.Clear();
        }

        [TearDown]
        public void TearDown()
        {
            //for (int i = 0; i < 20; i++)
            //{
            //    PumpWindowMessages();
            //    Thread.Sleep(100);
            //}

            this.form.Close();
        }

        [Test]
        public void WhenReceivedTextContainsCrlf_ThenOutputSpansTwoRows()
        {
            this.terminal.ReceiveData("sample\r\ntext");

            var output = GetOutput();
            Assert.AreEqual(2, output.Count);
            Assert.AreEqual("sample", output[0]);
            Assert.AreEqual("text", output[1]);
        }

        //---------------------------------------------------------------------
        // Clipboard
        //---------------------------------------------------------------------

        [Test]
        public void WhenPastingClipboardContentWithCrlf_ThenTerminalSendsClipboardContentWithNewline()
        {
            ClipboardUtil.SetText("sample\r\ntext");

            this.terminal.PasteClipboard();

            Assert.AreEqual("sample\rtext", this.sendData.ToString());
        }

        [Test]
        public void WhenEnablingBracketedMode_ThenPastedTextIsBracketed()
        {
            //
            // NB. This test requires a patched version of vtnetcore. If it fails,
            // you're probably using an unpatched version.
            //

            ClipboardUtil.SetText("text");

            this.terminal.ReceiveData($"{Esc}[?2004h"); // Set bracketed paste mode.
            this.terminal.PasteClipboard();
            this.terminal.ReceiveData($"{Esc}[?2004l"); // Reset bracketed paste mode.
            this.terminal.PasteClipboard();

            Assert.AreEqual($"{Esc}[200~text{Esc}[201~text", this.sendData.ToString());
        }

        //---------------------------------------------------------------------
        // Clipboard: Ctrl+V
        //---------------------------------------------------------------------

        [Test]
        public void WhenCtrlVIsEnabled_ThenTypingCtrlVSendsClipboardContent()
        {
            ClipboardUtil.SetText("sample\r\ntext");

            this.terminal.EnableCtrlV = true;
            this.terminal.SimulateKey(Keys.Control | Keys.V);

            Assert.AreEqual("sample\rtext", this.sendData.ToString());
        }

        [Test]
        public void WhenCtrlVIsDisabled_ThenTypingCtrlVSendsKeystroke()
        {
            ClipboardUtil.SetText("sample\r\ntext");

            this.terminal.EnableCtrlV = false;
            this.terminal.SimulateKey(Keys.Control | Keys.V);

            Assert.AreEqual("\u0016", this.sendData.ToString());
        }

        //---------------------------------------------------------------------
        // Clipboard: Shift+Insert
        //---------------------------------------------------------------------

        [Test]
        public void WhenShiftInsertIsEnabled_ThenTypingShiftInsertSendsClipboardContent()
        {
            ClipboardUtil.SetText("sample\r\ntext");

            this.terminal.EnableShiftInsert = true;
            this.terminal.SimulateKey(Keys.Shift | Keys.Insert);

            Assert.AreEqual("sample\rtext", this.sendData.ToString());
        }

        [Test]
        public void WhenShiftInsertIsDisabled_ThenTypingShiftInsertSendsKeystroke()
        {
            ClipboardUtil.SetText("sample\r\ntext");

            this.terminal.EnableShiftInsert = false;
            this.terminal.SimulateKey(Keys.Shift | Keys.Insert);

            Assert.AreEqual($"{Esc}[2;2~", this.sendData.ToString());
        }

        //---------------------------------------------------------------------
        // Clipboard: Ctrl+C
        //---------------------------------------------------------------------

        [Test]
        public void WhenCtrlCIsEnabledAndTextSelected_ThenTypingCtrlCSetsClipboardContentAndClearsSelection()
        {
            this.terminal.ReceiveData(
                "first line\r\n" +
                "second line\r\n" +
                "third line");
            this.terminal.SelectText(2, 0, 7, 1, TextSelectionDirection.Forward);

            this.terminal.EnableCtrlC = true;
            this.terminal.SimulateKey(Keys.Control | Keys.C);

            Assert.AreEqual("rst line\nsecond l", ClipboardUtil.GetText());
            Assert.AreEqual(string.Empty, this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenCtrlCIsEnabledButNoTextSelected_ThenTypingCtrlCSendsKeystroke()
        {
            this.terminal.ReceiveData(
                "first line\r\n" +
                "second line\r\n" +
                "third line");
            this.terminal.ClearTextSelection();

            this.terminal.EnableCtrlC = true;
            this.terminal.SimulateKey(Keys.Control | Keys.C);

            Assert.AreEqual("", ClipboardUtil.GetText());
            Assert.AreEqual("\u0003", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenCtrlCIsDisabledAndTextSelected_ThenTypingCtrlCClearsSelection()
        {
            this.terminal.ReceiveData(
                "first line\r\n" +
                "second line\r\n" +
                "third line");
            this.terminal.SelectText(2, 0, 1, 7, TextSelectionDirection.Forward);

            this.terminal.EnableCtrlC = false;
            this.terminal.SimulateKey(Keys.Control | Keys.C);

            Assert.AreEqual("", ClipboardUtil.GetText());
            Assert.AreEqual("", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenCtrlCIsDisabledAndNoTextSelected_ThenTypingCtrlCSendsKeystroke()
        {
            this.terminal.ReceiveData(
                "first line\r\n" +
                "second line\r\n" +
                "third line");
            this.terminal.ClearTextSelection();

            this.terminal.EnableCtrlC = false;
            this.terminal.SimulateKey(Keys.Control | Keys.C);

            Assert.AreEqual("", ClipboardUtil.GetText());
            Assert.AreEqual("\u0003", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Clipboard: Ctrl+Insert
        //---------------------------------------------------------------------

        [Test]
        public void WhenCtrlInsertIsEnabledAndTextSelected_ThenTypingCtrlInsertSetsClipboardContentAndClearsSelection()
        {
            this.terminal.ReceiveData(
                "first line\r\n" +
                "second line\r\n" +
                "third line");
            this.terminal.SelectText(2, 0, 7, 1, TextSelectionDirection.Forward);

            this.terminal.EnableCtrlInsert = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Insert);

            Assert.AreEqual("rst line\nsecond l", ClipboardUtil.GetText());
            Assert.AreEqual(string.Empty, this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenCtrlInsertIsEnabledButNoTextSelected_ThenTypingCtrlInsertSendsKeystroke()
        {
            this.terminal.ReceiveData(
                "first line\r\n" +
                "second line\r\n" +
                "third line");
            this.terminal.ClearTextSelection();

            this.terminal.EnableCtrlInsert = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Insert);

            Assert.AreEqual("", ClipboardUtil.GetText());
            Assert.AreEqual($"{Esc}[2;5~", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenCtrlInsertIsDisabledAndTextSelected_ThenTypingCtrlInsertClearsSelection()
        {
            this.terminal.ReceiveData(
                "first line\r\n" +
                "second line\r\n" +
                "third line");
            this.terminal.SelectText(2, 0, 1, 7, TextSelectionDirection.Forward);

            this.terminal.EnableCtrlInsert = false;
            this.terminal.SimulateKey(Keys.Control | Keys.Insert);

            Assert.AreEqual("", ClipboardUtil.GetText());
            Assert.AreEqual("", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenCtrlInsertIsDisabledAndNoTextSelected_ThenTypingCtrlInsertSendsKeystroke()
        {
            this.terminal.ReceiveData(
                "first line\r\n" +
                "second line\r\n" +
                "third line");
            this.terminal.ClearTextSelection();

            this.terminal.EnableCtrlInsert = false;
            this.terminal.SimulateKey(Keys.Control | Keys.Insert);

            Assert.AreEqual("", ClipboardUtil.GetText());
            Assert.AreEqual($"{Esc}[2;5~", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Text selection: Ctrl+A
        //---------------------------------------------------------------------

        private static string GenerateText(int rows, int columns)
        {
            Debug.Assert(columns >= 10);
            var buffer = new StringBuilder();

            for (int i = 0; i < rows; i++)
            {
                buffer.Append($"{i:D8}: ");
                for (int j = 0; j < columns - 10; j++)
                {
                    buffer.Append('.');
                }

                buffer.Append("\r\n");
            }

            return buffer.ToString().Trim();
        }

        [Test]
        public void WhenCtrlAEnabledAndCursorAtEnd_ThenTypingCtrlASelectsAllText()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            this.terminal.EnableCtrlA = true;
            this.terminal.SimulateKey(Keys.Control | Keys.A);

            Assert.AreEqual("", this.sendData.ToString());
            Assert.IsTrue(this.terminal.IsTextSelected);
            Assert.AreEqual(
                textStraddlingViewPort.Replace("\r\n", "\n") + "\n",
                this.terminal.TextSelection);
        }

        [Test]
        public void WhenCtrlAEnabledAndCursorNotAtEnd_ThenTypingCtrlASelectsAllText()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            this.terminal.EnableCtrlA = true;
            this.terminal.MoveCursorRelative(-5, -1);
            this.terminal.SimulateKey(Keys.Control | Keys.A);

            Assert.AreEqual("", this.sendData.ToString());
            Assert.IsTrue(this.terminal.IsTextSelected);
            Assert.AreEqual(
                textStraddlingViewPort.Replace("\r\n", "\n") + "\n",
                this.terminal.TextSelection);
        }

        [Test]
        public void WhenCtrlAEnabledAndCursorNotAtEnd_ThenTypingCtrlACtrlCCopiesTimmedTextToClipboard()
        {
            var textSmallerThanViewPort = GenerateText(3, 20);
            this.terminal.ReceiveData(textSmallerThanViewPort);

            this.terminal.EnableCtrlA = true;
            this.terminal.EnableCtrlC = true;
            this.terminal.MoveCursorRelative(-5, -1);
            this.terminal.SimulateKey(Keys.Control | Keys.A);
            this.terminal.SimulateKey(Keys.Control | Keys.C);

            Assert.AreEqual("", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
            Assert.AreEqual(
                textSmallerThanViewPort.Replace("\r\n", "\n"),
                ClipboardUtil.GetText());
        }

        [Test]
        public void WhenCtrlAEnabledAndScrolledToTop_ThenTypingCtrlASelectsAllText()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            this.terminal.EnableCtrlA = true;
            this.terminal.ScrollViewPort(-100); // All the way up.
            this.terminal.SimulateKey(Keys.Control | Keys.A);

            Assert.AreEqual("", this.sendData.ToString());
            Assert.IsTrue(this.terminal.IsTextSelected);
            Assert.AreEqual(
                textStraddlingViewPort.Replace("\r\n", "\n") + "\n",
                this.terminal.TextSelection);
        }

        [Test]
        public void WhenCtrlADisbled_ThenTypingCtrlASendsKeystroke()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            this.terminal.EnableCtrlA = false;
            this.terminal.SimulateKey(Keys.Control | Keys.A);

            Assert.AreEqual("\u0001", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Text selection: Shift+Left/Right
        //---------------------------------------------------------------------

        [Test]
        public void WhenShiftLeftRightEnabled_ThenTypingShiftLeftStartsSelection()
        {
            this.terminal.ReceiveData("0123456789");

            this.terminal.EnableShiftLeftRight = true;
            this.terminal.MoveCursorRelative(-5, 0);
            this.terminal.SimulateKey(Keys.Shift | Keys.Left);

            // Start single-character selection.
            Assert.IsTrue(this.terminal.IsTextSelected);
            Assert.AreEqual("45", this.terminal.TextSelection);

            // Extend selection.
            this.terminal.SimulateKey(Keys.Shift | Keys.Left, 2);
            Assert.AreEqual("2345", this.terminal.TextSelection);

            // Shrink selection.
            this.terminal.SimulateKey(Keys.Shift | Keys.Right, 2);
            Assert.AreEqual("45", this.terminal.TextSelection);

            // Invert selection.
            this.terminal.SimulateKey(Keys.Shift | Keys.Right, 2);
            Assert.AreEqual("56", this.terminal.TextSelection);

            Assert.AreEqual(string.Empty, this.sendData.ToString());
        }

        [Test]
        public void WhenShiftLeftRightEnabled_ThenTypingShiftRightStartsSelection()
        {
            this.terminal.ReceiveData("0123456789");

            this.terminal.EnableShiftLeftRight = true;
            this.terminal.MoveCursorRelative(-5, 0);
            this.terminal.SimulateKey(Keys.Shift | Keys.Right);

            // Start single-character selection.
            Assert.IsTrue(this.terminal.IsTextSelected);
            Assert.AreEqual("56", this.terminal.TextSelection);

            // Extend selection.
            this.terminal.SimulateKey(Keys.Shift | Keys.Right, 2);
            Assert.AreEqual("5678", this.terminal.TextSelection);

            // Shrink selection.
            this.terminal.SimulateKey(Keys.Shift | Keys.Left, 2);
            Assert.AreEqual("56", this.terminal.TextSelection);

            // Invert selection.
            this.terminal.SimulateKey(Keys.Shift | Keys.Left, 2);
            Assert.AreEqual("45", this.terminal.TextSelection);

            Assert.AreEqual(string.Empty, this.sendData.ToString());
        }

        [Test]
        public void WhenShiftLeftRightEnabled_ThenTypingShiftLeftOrRightExtendsSelectionBeyondCurrentRow()
        {
            this.terminal.ReceiveData(
                "abcde\r\n" +
                "0123456789\r\n" +
                "vwxyz");

            this.terminal.EnableShiftLeftRight = true;
            this.terminal.MoveCursorRelative(0, -1);
            this.terminal.SimulateKey(Keys.Shift | Keys.Left, 6);

            // Move left until preceding line.
            Assert.IsTrue(this.terminal.IsTextSelected);
            Assert.AreEqual("e\n012345", this.terminal.TextSelection);

            // Move left till end.
            this.terminal.SimulateKey(Keys.Shift | Keys.Left, 10);
            Assert.AreEqual("abcde\n012345", this.terminal.TextSelection);

            // Move right till third line.
            this.terminal.SimulateKey(Keys.Shift | Keys.Right, 16);
            Assert.AreEqual("56789\nvw", this.terminal.TextSelection);

            // Move right till end.
            this.terminal.SimulateKey(Keys.Shift | Keys.Right, 10);
            Assert.AreEqual("56789\nvwxyz\n\n\n\n\n\n\n", this.terminal.TextSelection);

            Assert.AreEqual(string.Empty, this.sendData.ToString());
        }

        [Test]
        public void WhenShiftLeftRightDisabled_ThenTypingShiftLeftSendsKeystroke()
        {
            this.terminal.EnableShiftLeftRight = false;
            this.terminal.SimulateKey(Keys.Shift | Keys.Left);

            Assert.AreEqual($"{Esc}[1;2D", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenShiftLeftRightDisabled_ThenTypingShiftRightSendsKeystroke()
        {
            this.terminal.EnableShiftLeftRight = false;
            this.terminal.SimulateKey(Keys.Shift | Keys.Right);

            Assert.AreEqual($"{Esc}[1;2C", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Text selection: Shift+Up/Down
        //---------------------------------------------------------------------

        [Test]
        public void WhenShiftUpDownEnabled_ThenTypingUpOrDownExtendsSelectionBeyondCurrentRow()
        {
            this.terminal.ReceiveData(
                "abcde\r\n" +
                "0123456789\r\n" +
                "vwxyz");

            this.terminal.EnableShiftLeftRight = true;
            this.terminal.MoveCursorRelative(-2, -1);
            this.terminal.SimulateKey(Keys.Shift | Keys.Up, 1);

            // Move Up to preceding line.
            Assert.IsTrue(this.terminal.IsTextSelected);
            Assert.AreEqual("de\n0123", this.terminal.TextSelection);

            // Move up beyond top.
            this.terminal.SimulateKey(Keys.Shift | Keys.Up, 2);
            Assert.AreEqual("de\n0123", this.terminal.TextSelection);

            // Move down till third line.
            this.terminal.SimulateKey(Keys.Shift | Keys.Down, 2);
            Assert.AreEqual("3456789\nvwxy", this.terminal.TextSelection);

            // Move down beyond end.
            this.terminal.SimulateKey(Keys.Shift | Keys.Down, 1);
            Assert.AreEqual("3456789\nvwxyz\n", this.terminal.TextSelection);

            // Move up again.
            this.terminal.SimulateKey(Keys.Shift | Keys.Up, 1);
            Assert.AreEqual("3456789\nvwxy", this.terminal.TextSelection);

            Assert.AreEqual(string.Empty, this.sendData.ToString());
        }

        [Test]
        public void WhenShiftUpDownDisabled_ThenTypingShiftDownSendsKeystroke()
        {
            this.terminal.EnableShiftUpDown = false;
            this.terminal.SimulateKey(Keys.Shift | Keys.Down);

            Assert.AreEqual($"{Esc}[1;2B", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenShiftUpDownDisabled_ThenTypingShiftUpSendsKeystroke()
        {
            this.terminal.EnableShiftUpDown = false;
            this.terminal.SimulateKey(Keys.Shift | Keys.Up);

            Assert.AreEqual($"{Esc}[1;2A", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Text selection: Clearing
        //---------------------------------------------------------------------

        [Test]
        public void WhenTextSelected_ThenTypingClearsSelectionAndSendsKey()
        {
            var textStraddlingViewPort = GenerateText(3, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            this.terminal.SelectText(0, 0, 20, 2, TextSelectionDirection.Forward);
            Assert.IsTrue(this.terminal.IsTextSelected);

            this.terminal.SimulateKey(Keys.Space);

            Assert.AreEqual(" ", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenTextSelected_ThenTypingEnterClearsSelectionWithoutSendingKey()
        {
            var textStraddlingViewPort = GenerateText(3, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            this.terminal.SelectText(0, 0, 20, 2, TextSelectionDirection.Forward);
            Assert.IsTrue(this.terminal.IsTextSelected);

            this.terminal.SimulateKey(Keys.Enter);

            Assert.AreEqual("", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Navigation: Control+Left/Right
        //---------------------------------------------------------------------

        [Test]
        public void WhenControlLeftRightEnabled_ThenTypingControlLeftSendsJumpWordKeystroke()
        {
            this.terminal.EnableCtrlLeftRight = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Left);

            Assert.AreEqual($"{Esc}[1;5D", this.sendData.ToString());
        }

        [Test]
        public void WhenControlLeftRightDisabled_ThenTypingControlLeftSendsKeystroke()
        {
            this.terminal.EnableCtrlLeftRight = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Right);

            Assert.AreEqual($"{Esc}[1;5C", this.sendData.ToString());
        }

        [Test]
        public void WhenControlLeftRightDisabled_ThenTypingControlRightSendsKeystroke()
        {
            this.terminal.EnableCtrlLeftRight = false;
            this.terminal.SimulateKey(Keys.Control | Keys.Right);

            Assert.AreEqual($"{Esc}[1;5C", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenControlLeftRightDisabled_ThenTypingControlKeftSendsKeystroke()
        {
            this.terminal.EnableCtrlLeftRight = false;
            this.terminal.SimulateKey(Keys.Control | Keys.Left);

            Assert.AreEqual($"{Esc}[1;5D", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Scrolling: Control+Up/Down
        //---------------------------------------------------------------------

        [Test]
        public void WhenControlUpDownEnabledAndTerminalFull_ThenTypingControlUpScrollsUpOneLine()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            Assert.AreNotEqual(0, this.terminal.ViewTop);
            var previousViewTop = this.terminal.ViewTop;

            this.terminal.EnableCtrlUpDown = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Up);

            Assert.AreEqual(previousViewTop - 1, this.terminal.ViewTop);
            Assert.AreEqual("", this.sendData.ToString());
        }

        [Test]
        public void WhenControlUpDownEnabledAndTerminalNotFull_ThenTypingControlUpIsIgnored()
        {
            var textNotEnoughToFillViewPort = GenerateText(3, 20);
            this.terminal.ReceiveData(textNotEnoughToFillViewPort);

            Assert.AreEqual(0, this.terminal.ViewTop);

            this.terminal.EnableCtrlUpDown = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Up);

            Assert.AreEqual(0, this.terminal.ViewTop);
            Assert.AreEqual("", this.sendData.ToString());
        }

        [Test]
        public void WhenControlUpDownEnabledAndTerminalFull_ThenTypingControlDownScrollsUpOneLine()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            this.terminal.ScrollToTop();
            Assert.AreEqual(0, this.terminal.ViewTop);

            this.terminal.EnableCtrlUpDown = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Down, 2);

            Assert.AreEqual(2, this.terminal.ViewTop);
            Assert.AreEqual("", this.sendData.ToString());
        }

        [Test]
        public void WhenControlUpDownEnabledAndTerminalScrolledToEnd_ThenTypingControlDownIsIgnored()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            var previousViewTop = this.terminal.ViewTop;

            this.terminal.EnableCtrlUpDown = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Down);

            Assert.AreEqual(previousViewTop, this.terminal.ViewTop);
            Assert.AreEqual("", this.sendData.ToString());
        }

        [Test]
        public void WhenControlUpDownDisabled_ThenTypingControlUpSendsKeystroke()
        {
            this.terminal.EnableCtrlUpDown = false;
            this.terminal.SimulateKey(Keys.Control | Keys.Up);

            Assert.AreEqual($"{Esc}[1;5A", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenControlUpDownDisabled_ThenTypingControlDownSendsKeystroke()
        {
            this.terminal.EnableCtrlUpDown = false;
            this.terminal.SimulateKey(Keys.Control | Keys.Down);

            Assert.AreEqual($"{Esc}[1;5B", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Scrolling: Control+Home/End
        //---------------------------------------------------------------------

        [Test]
        public void WhenControlHomeEndEnabledAndTerminalFull_ThenTypingControlHomeScrollsToTop()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            Assert.AreNotEqual(0, this.terminal.ViewTop);

            this.terminal.EnableCtrlHomeEnd = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Home);

            Assert.AreEqual(0, this.terminal.ViewTop);
            Assert.AreEqual("", this.sendData.ToString());
        }

        [Test]
        public void WhenControlHomeEndEnabledAndTerminalNotFull_ThenTypingControlHomeIsIgnored()
        {
            var textNotEnoughToFillViewPort = GenerateText(3, 20);
            this.terminal.ReceiveData(textNotEnoughToFillViewPort);

            Assert.AreEqual(0, this.terminal.ViewTop);

            this.terminal.EnableCtrlHomeEnd = true;
            this.terminal.SimulateKey(Keys.Control | Keys.Home);

            Assert.AreEqual(0, this.terminal.ViewTop);
            Assert.AreEqual("", this.sendData.ToString());
        }

        [Test]
        public void WhenControlHomeEndEnabledAndTerminalScrolledToTop_ThenTypingControlDownScrollsToEnd()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            var previousViewTop = this.terminal.ViewTop;

            this.terminal.ScrollToTop();
            Assert.AreEqual(0, this.terminal.ViewTop);

            this.terminal.EnableCtrlUpDown = true;
            this.terminal.SimulateKey(Keys.Control | Keys.End);

            Assert.AreEqual(previousViewTop, this.terminal.ViewTop);
            Assert.AreEqual("", this.sendData.ToString());
        }

        [Test]
        public void WhenControlHomeEndEnabledAndTerminalScrolledToEnd_ThenTypingControlDownIsIgnored()
        {
            var textStraddlingViewPort = GenerateText(100, 20);
            this.terminal.ReceiveData(textStraddlingViewPort);

            var previousViewTop = this.terminal.ViewTop;

            this.terminal.EnableCtrlUpDown = true;
            this.terminal.SimulateKey(Keys.Control | Keys.End);

            Assert.AreEqual(previousViewTop, this.terminal.ViewTop);
            Assert.AreEqual("", this.sendData.ToString());
        }

        [Test]
        public void WhenControlHomeEndDisabled_ThenTypingControlHomeSendsKeystroke()
        {
            this.terminal.EnableCtrlHomeEnd = false;
            this.terminal.SimulateKey(Keys.Control | Keys.Home);

            Assert.AreEqual($"{Esc}[1;5H", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        [Test]
        public void WhenControlHomeEndDisabled_ThenTypingControlEndSendsKeystroke()
        {
            this.terminal.EnableCtrlHomeEnd = false;
            this.terminal.SimulateKey(Keys.Control | Keys.End);

            Assert.AreEqual($"{Esc}[1;5F", this.sendData.ToString());
            Assert.IsFalse(this.terminal.IsTextSelected);
        }

        //---------------------------------------------------------------------
        // Select word.
        //---------------------------------------------------------------------

        [Test]
        public void WhenPositionHitsRowThatIsAllWhitespace_ThenSelectWordIsWhitespace()
        {
            this.terminal.ReceiveData("\r\n\r\n\r\n\r\n\r\n\r\n");
            this.terminal.SelectWord(6, 3);
            Assert.AreEqual(
                string.Empty,
                this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsWhitespaceBetweenWords_ThenSelectWordReturnsWhitespace()
        {
            this.terminal.ReceiveData("first  second");

            this.terminal.SelectWord(5, 0);
            Assert.AreEqual("  ", this.terminal.TextSelection);

            this.terminal.SelectWord(6, 0);
            Assert.AreEqual("  ", this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsWord_ThenSelectWordReturnsWord()
        {
            this.terminal.ReceiveData("first second third");

            this.terminal.SelectWord(6, 0);
            Assert.AreEqual("second", this.terminal.TextSelection);

            this.terminal.SelectWord(10, 0);
            Assert.AreEqual("second", this.terminal.TextSelection);

            this.terminal.SelectWord(11, 0);
            Assert.AreEqual("second", this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsWordThatExtendsToEndOfBuffer_ThenSelectWordReturnsWord()
        {
            var lineOfA = new string('a', this.terminal.Columns);
            this.terminal.ReceiveData(lineOfA + "\r\n" + lineOfA);

            this.terminal.SelectWord(0, 0);
            Assert.AreEqual(lineOfA + "\n" + lineOfA, this.terminal.TextSelection);

            this.terminal.SelectWord(this.terminal.Columns - 1, 1);
            Assert.AreEqual(lineOfA + "\n" + lineOfA, this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsWordThatExtendsToPartsOfNextLine_ThenSelectWordReturnsWord()
        {
            var lineOfA = new string('a', this.terminal.Columns);
            this.terminal.ReceiveData(lineOfA + "b c");

            this.terminal.SelectWord(0, 0);
            Assert.AreEqual(lineOfA + "\nb", this.terminal.TextSelection);

            this.terminal.SelectWord(this.terminal.Columns - 1, 0);
            Assert.AreEqual(lineOfA + "\nb", this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsWordThatExtendsToEntireNextLine_ThenSelectWordReturnsWord()
        {
            var lineOfA = new string('a', this.terminal.Columns);
            this.terminal.ReceiveData(lineOfA + "\r\n" + lineOfA + " b c");

            this.terminal.SelectWord(0, 0);
            Assert.AreEqual(lineOfA + "\n" + lineOfA, this.terminal.TextSelection);

            this.terminal.SelectWord(this.terminal.Columns - 1, 0);
            Assert.AreEqual(lineOfA + "\n" + lineOfA, this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsWordThatExtendsToStartOfBuffer_ThenSelectWordReturnsWord()
        {
            var lineOfA = new string('a', this.terminal.Columns);
            this.terminal.ReceiveData(lineOfA + "b c");

            this.terminal.SelectWord(0, 1);
            Assert.AreEqual(lineOfA + "\nb", this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsWordThatExtendsToEntirePreviousLine_ThenSelectWordReturnsWord()
        {
            var lineOfA = new string('a', this.terminal.Columns);
            this.terminal.ReceiveData("xxx yy zz\r\n" + lineOfA + "b c");

            this.terminal.SelectWord(0, 1);
            Assert.AreEqual(lineOfA + "\nb", this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsWordThatExtendsToPartsOfPreviousLine_ThenSelectWordReturnsWord()
        {
            var lineOfA = new string('a', this.terminal.Columns - 2);
            this.terminal.ReceiveData("x " + lineOfA + "b c");

            this.terminal.SelectWord(0, 1);
            Assert.AreEqual(lineOfA + "\nb", this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsLastWord_ThenSelectWordReturnsWord()
        {
            this.terminal.ReceiveData("first second third");

            this.terminal.SelectWord(14, 0);
            Assert.AreEqual("third", this.terminal.TextSelection);

            this.terminal.SelectWord(16, 0);
            Assert.AreEqual("third", this.terminal.TextSelection);

            this.terminal.SelectWord(17, 0);
            Assert.AreEqual("third", this.terminal.TextSelection);
        }

        [Test]
        public void WhenPositionHitsFirstWord_ThenSelectWordReturnsWord()
        {
            this.terminal.ReceiveData("first second third");

            this.terminal.SelectWord(0, 0);
            Assert.AreEqual("first", this.terminal.TextSelection);

            this.terminal.SelectWord(2, 0);
            Assert.AreEqual("first", this.terminal.TextSelection);

            this.terminal.SelectWord(4, 0);
            Assert.AreEqual("first", this.terminal.TextSelection);
        }

        //---------------------------------------------------------------------
        // Unicode
        //---------------------------------------------------------------------

        [Test]
        public void WhenReceivedDataContainsSingleHighReversed9QuotationMark_ThenCharacterIsKept()
        {
            // NB. \u201b "embeds" \u1b, which is the Escape character.
            var text = $"abc\u201bxyz";
            this.terminal.ReceiveData(text);
            var buffer = this.terminal.GetBuffer();

            Assert.AreEqual(text, buffer.Trim());
        }

        [Test]
        public void WhenReceivedDataContainsInvalidUnicodeSequence_ThenCharacterIsIgnored()
        {
            var text = $"abc{Esc}\u0090\u0091xyz";
            this.terminal.ReceiveData(text);
            var buffer = this.terminal.GetBuffer();

            Assert.AreEqual("abc\u0091xyz", buffer.Trim());
        }

        //---------------------------------------------------------------------
        // Colors
        //---------------------------------------------------------------------

        public void WhenTerminalBackgroundColorSet_ThenColorsAreUpdated()
        {
            this.terminal.TerminalBackgroundColor = Color.Aquamarine;
            Assert.AreEqual(Color.Aquamarine, this.terminal.TerminalBackgroundColor);
            Assert.AreEqual(Color.White, this.terminal.TerminalForegroundColor);
            Assert.AreEqual(Color.White, this.terminal.TerminalCaretColor);
        }
        public void WhenTerminalForegroundColorSet_ThenColorsAreUpdated()
        {
            this.terminal.TerminalBackgroundColor = Color.Aquamarine;
            Assert.AreEqual(Color.Black, this.terminal.TerminalBackgroundColor);
            Assert.AreEqual(Color.Aquamarine, this.terminal.TerminalForegroundColor);
            Assert.AreEqual(Color.Aquamarine, this.terminal.TerminalForegroundColor);
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
Endangered No More? Humpback Whales Make A Comeback
(WHALES/OCEAN CONSERVATION) Since commercial whaling was banned 50 years ago, humpback whale populations are witnessing a dramatic recovery. In response, the federal government has proposed removing most humpback whale populations off the Endangered Species List.
Humpback whales are known for their massive body length and size. The species can grow up to 45 feet long, weighing up to 50 tons. They also have a habit of breaching out of the water, an act which occurs more frequently with humpbacks than any other marine species.
Since the species' population has increased by tens of thousands in the last several years, the whales have been seen by whale-watching tours and photographers more frequently off the coasts of California, Oregon, Washington, and Hawaii.
Today, there are approximately 21,000 humpback whales in the North Pacific Ocean. Photo Credit: The Guardian
"We live in an age where all we hear is terrible news," said Dan Costa, a biology professor and humpback whale expert at UC Santa Cruz.
"We hear about species going extinct. And the fact that something as iconic and amazing as a humpback whale can be taken off the endangered species list is a phenomenal thing."
In the 19th and 20th centuries, humpback whales were hunted severely–first for whale oil, and then eventually fertilizer, poultry meal, and pet food, which caused their numbers to plummet.
By 1966, most humpback hunting ended worldwide due to an international agreement. In response, the U.S. officially banned all commercial whale hunting in 1971.
President Richard Nixon approved adding humpback whales to the Endangered Species Act in 1973, making them one of the first animal species to ever be listed for protection under the Endangered Species Act.
In 1966, there were only about 1,400 humpback whales in the North Pacific Ocean. Today, that number has risen to approximately 21,000 humpbacks.
Although the species' worldwide population is less clear, the National Oceanic Atmospheric Administration believes there are about 100,000 humpbacks in the wild.
Under last week's proposal by NOAA Fisheries, humpback whales were separated into 14 population groups around the world. Of those 14 groups, 10 were proposed to be removed from the federal list of endangered species, two were proposed to be changed from endangered to threatened, and two were to be left as endangered.
However, whale hunting will still be prohibited under the 1972 Marine Mammal Protection Act, which also calls for the protections of sea otters and sea lions, among other species.
The humpback whale recovery follows comebacks of species such as the bald eagle, the brown pelican, the peregrine falcon, and the gray whale, which was removed from the Endangered Species List in 1994.
— Sabrina Clinkenbeard, exclusive to Global Animal
Zoos: The Historical Debate


Birthdays are always a good time to take stock of one's achievements, make some resolutions and contemplate the road ahead. So, with NATO turning sixty-seven today, perhaps it's time for the military alliance to engage in some honest self-reflection.
The problem is, sometimes it's just hard to let go. No one wants to admit their glory days are behind them. Everyone wants to feel they have a purpose, some grand vision yet to fulfill. When the time comes to hang up your hat, some bow out gracefully. Others need to be dragged kicking and screaming.
If Supreme Allied Commander General Philip Breedlove's latest comments are anything to go by, the alliance won't be performing a graceful exit any time soon. Instead, the 28-member bloc is simply recalibrating its efforts in an attempt to justify its existence and remain relevant.
Intending to provide collective security against the Soviet Union, the military alliance was founded on April 4, 1949 by 12 countries, led by the United States. The bloc would aim to prevent the spread of communism and promote American economic interests across the European continent. Once the Soviet Union collapsed and ceased to exist in December 1991, NATO was at a bit of a loose end. Instead of disbanding, the organization continued to usher in new members in bouts of expansion that were sure to provoke modern Russia.
For as long as it has existed, NATO has been geared primarily towards serving Washington's geostrategic interests. It was then, as it is now, far more about creating vassal states in Europe that would do America's bidding than it was about keeping them safe. The goal was to unite as many nations as possible under a pro-Washington umbrella which would rarely, if ever, question US foreign policy.
This entry was posted in Anti-War & Non-Violence, Imperialism & Colonialism, NWO & Global Governance, War & Terror and tagged Europe, NATO, Russia, USA. Bookmark the permalink.


Pumps are usually categorized in two major groups: conventional-sealed pumps and seal-less pumps. The first group contains pumps that need a seal system, usually in the form of a mechanical seal. The second group includes all types and models of seal-less pumps; these pumps do not require a seal. Magnetic-driven pumps are an important class of seal-less pumps. They are used for services in which leaks cannot be tolerated or liquids are difficult to seal. Magnetic drive pumps, also known as magnetically coupled pumps, vary from the traditional pumping style because the electric motor (the driver) is coupled to the pump by magnetic means rather than by a direct mechanical shaft. The pump works via a drive magnet that eliminates any shaft sealing required by the pump. This is a major advantage. On the other hand, magnetic drive pumps cannot be used in some applications and do have limits for power ratings. This article discusses magnetic drive pumps in processing facilities and their characteristics, advantages and disadvantages.
Magnetic drive pumps are typically used where leakage of the pumped liquid poses a great risk such as with aggressive or risky liquids, exotic materials, acids, alkalis, corrosives, pollutants and toxics. They are also used for ultra-pure liquids and hard-to-seal liquids. Sealed pumps applied to these types of services may leak over time or require complex, expensive double seals to prevent hazardous/challenging liquids from escaping to the atmosphere, which can lead to safety hazards, downtime and increased maintenance requirements.
Another important application for magnetic drive pumps is for difficult liquids; for example, some liquids can crystallize on seal faces, which then can cause seal failures. To avoid this, a permanent flush system should be run to the seal. This, however, can increase the cost of maintenance, seal flushing liquids and energy consumption. A better solution for these difficult services is to use a magnetic drive pump.
Magnetic drive pumps have no direct connection between the electric motor shaft and the impeller; therefore, no seal is needed. There is no risk of leakage unless the pump casing is broken. Seals are known as a major cause of pump trips and unscheduled shutdowns. Obviously, the elimination of seals is a great improvement for performance, reliability and availability of pumps. The risk of leakage is completely eliminated; this means that liquids can be pumped without spillages. Eliminating the seals also gets rid of associated friction loss, wear, costs and noise. This provides complete separation of liquid from the pump drive and better transfer of motor power to the pump. There is practically no heat transfer from the electric motor because the pump chamber is completely separated from the electric motor by a large air gap; this provides an effective barrier between the two. The magnetic coupling will soften any shock or spike torques. Even in extreme situations, it will act as a fuse. Magnetic couplings can be broken temporarily if the load of the pump is too great. In practice, it means the pump does not overload and get damaged.
Magnetic drive pumps are available in most metallurgies and materials, metallic and nonmetallic. Polymer lining pumps are also used because they offer improved corrosion resistance. Polymer coating options include polytetrafluoroethylene (PTFE), perfluoroalkoxy alkanes (PFA) and polyvinylidene fluoride (PVDF). These lined or non-metallic options are usually employed for ordinary temperatures, below 90°C as a rough indication. Metallic magnetic drive pumps have been used for even higher temperatures.
Because a magnetic drive pump is an enclosed piece of equipment, lubrication oil or grease cannot be used for bearings. Therefore, pumped liquid is used for the lubrication of bearings as well as for cooling needs. A portion of pumped liquid is usually taken from the discharge of the pump; this flow is often known as recirculation flow and is usually employed for the cooling of the magnetic system, lubrication of radial and thrust bearings and for other similar applications where lubricant or cooling fluid is needed.
Magnet drive pumps are usually equipped with "sleeve bearings," which use the pumped liquid for hydrodynamic lubrication. A sleeve bearing is one of the simplest types of bearing, comprising just bearing surfaces and no rolling elements. Therefore, the sleeve or journal slides over the bearing surface where pumped liquid is used for its lubrication. These bearings are also compact and lightweight and have a high load-carrying capacity and longer life compared to many rolling-element bearings. The materials of construction of these and the required clearances of the sliding surfaces may restrict the liquids and services for which this kind of pump may be used.
Traditionally, magnetic drive pump bearings have been made from silicon carbide, which has been an excellent bearing material under normal operation; however, it can suffer during some abnormal conditions such as dry running, dynamic loading and potential impact. Some modern materials such as advanced ceramics have been used in these with great success. Another proposed material is a fiber-reinforced silicon carbide ceramic composite with bearing properties similar to silicon carbide, but with high impact resistance and excellent tolerance of dry running. These modern options offer great benefits such as better impact resistance, excellent wear resistance and generally longer life and better performance.
Modern sleeve bearings for magnetic drive pump applications should feature smooth surfaces whether by a dedicated surface treatment on sleeve surfaces or a coating to sufficiently reduce the coefficient of friction, which enables longer periods of safe operation under dry run conditions. Dry running can occur from a wide range of malfunctions and maloperations. The heat generation from dry running conditions is the number one mode of failure for magnetic drive pumps. Modern bearing materials are usually up to two times harder than conventional silicon carbide, ensuring they won't be compromised in even the harshest operational environment.
To successfully perform its task of lubrication and cooling, the recirculated flow should remain in the liquid phase at all points at all times. An area for concern is the magnetic coupling area where the intense heat could boil the liquid. Therefore, a robust design and sufficient flow rate are needed for these areas. The determining factors for preventing phase change are the mass flow rate, heat capacity and localized pressure at any point within the system. The details related to recirculation flow will affect the variables of mass flow rate and localized pressure.
To act as a lubricant, the pumped liquid should maintain a proper film thickness (at least a few microns) at operating temperature and load or else the sleeve bearings will experience severe wear. Many liquids such as hot water and most solvents do not have this property and cannot act as lubricant. On the other hand, if sufficient pressure or flow rate is not provided for the liquid through the bearings and other critical areas, it leads to overheating of the area, which can become a serious problem. The result can be flashing of the liquid and a potential loss of lubricating ability as the liquid increases in temperature and decreases in viscosity.
Because magnetic drive pumps utilize magnets to transfer the torque and power from the drive assembly to the impeller assembly, there are some limitations with these pumps. For example, when magnet materials are exposed to temperatures above their threshold, they can begin to lose their magnetism. Therefore, temperature characteristics of each service are a critical factor. Some energy is lost in the magnetic coupling. This is primarily due to some magnetic resistance. As the result of this and some other effects, a typical magnetic drive pump is usually less efficient than conventional centrifugal pumps.
There are some limitations in power rating as a very large or powerful magnetic coupling is neither feasible, nor cost-effective. Power and torque limitations should always be considered for the selection of these pumps.
One of major limitations of magnetic drive pumps is the risk associated with running dry. Because the pumped liquid will act as lubricant and coolant, in case of dry run, the bearing and some other parts could overheat and eventually become damaged. In services and applications with risks of dry running, magnetic drive pumps should not be used.
Magnets should be sized correctly so magnetic-coupling breakaway torque is not exceeded during startup or in all other potential transient operational cases. If breakaway torque is exceeded, the magnetic coupling between the drive and the driven assemblies is lost, and the impeller will cease to spin, which means the pump should be tripped to allow the magnets to recouple. These pumps are also extremely sensitive to transient cases such as low flows and operation near shutoff head conditions.
Magnetic drive pumps have very limited solids handling capability. The pumped liquid should be clean or else the solids will collect in the passages surrounding the magnet and in the close tolerances of bearings such as between the sleeves. This will interfere with the pump's performance and cause problems, sometimes even failures. In addition, solids will wear out the bearings and other components.
Liquids containing ferrous particles are problematic in a magnetic drive pump because the particles collect on the magnet and can cause the pump to weaken and even stop working over time. Theoretically, sleeve bearings might be able to grind up some particles of a lesser hardness; this has resulted in some claims for solids handling capabilities of magnetic drive pumps. These "wild" claims by some manufacturers have been extraordinary, exaggerated and even false. This solids handling capability depends on details, like the size of the solids as well as the materials and characteristics of the bearings — the presence of some solids can be less problematic with hard and strong bearing materials than with weaker materials used in some low-cost bearings.
As a rough indication, the upper percentage and size limits of solids in the pumped liquid might be noted as 1.5 percent and up to 70 microns. For some special pumps, the latter might be up to 100 microns. There was a case of very strong and robust magnetic drive pumps that successfully handled 2 percent or 2.5 percent of solids to 150 microns. The limit on particle size is usually dictated by bearing clearances. Higher particle size may be screened out with a screen, strainer or filter in the way of liquid to bearings. There can be pumps operated for 5 percent solids (or sometimes more) up to 200 microns (or even more) if a clean flush is provided to the magnetic drive or if a closed-loop system is fitted; such a system is a special one available only from a few manufacturers.
Indeed, the above-mentioned figures are some very simplified and rough limits. For a reliable and optimal selection of pump for each service, comprehensive analyses and studies should take into account characteristics and the nature of solids. For instance, sticky or fibrous solids may block bearings or flow channels. Highly abrasive solids will eventually wear parts, and in these services, strong wear-resistant materials should be selected for the maximum pump life. All potential operating ranges should be considered for a proper pump selection. At low flows, the recirculation will accelerate wear, and at higher flow rates, the high rates of solids will increase the wear rate.


The Adamawa State Government in conjunction with European Union, EU has organized a two day capacity building workshop to ensure implementation of sanitation reforms for civil society organizations and media practitioners in the state.
Declaring the workshop open on Friday in Yola, the state capital, commissioner for Water Resources, Honorable Julius K. Kaddala described the workshop as a critical stakeholders meeting which is expected to be valuable not only in accelerating safe sanitation coverage in the state but to increase the technical capacity of various organizations on sanitation issues.
Kaddala stated that, the capacity training programme was a continuation of their resolve to empower all stakeholders groups with the skills and knowledge to drive sanitation campaign in the state.
"We deliberately created the media non-governmental organization and two critical non-state actors to this workshop in view of their strategic roles and responsibilities.
"While the media is regarded as the fourth estate of the realm with a constitutional responsibility of upholding the accountability of the Government to the people, the non-governmental organizations are widely known for having skills and expertise in community mobilization.
"The two groups are therefore strategic partners in our collective effort to ensure access to safe sanitation services in the state", he stressed.
Poor hygiene habits, poor maintenance cultures, dilapidated sanitation infrastructure, almost zero budgeting for water related sanitation.
Earlier in his keynote address, the representative of Europian Union, EU and institutional policy expert, water supply and sanitation sector reform programme WSSSRP- phase III, Mr. Babatope Babalobi said the rationale behind the choice of Yola for the workshop is to create flat form for the need for reforms review in the sanitation section by the stakeholders.
Babalobi stressed the need and importance of the state actors, civil society organization and the media practitioners in the state to as a matter of public importance established a solid synergy between the three bodies so that sanitation reforms would be implemented for the benefit of all and sundry.
However the programme manager, small towns water supply and sanitation agency in the state Ministry if Water Resources Shuaibu Suleiman lamented that most of the government policies especially in the water sector are non-existence.
Sulaiman therefore call on the stakeholders to as a matter of urgency do something to address the mess militating against the smooth sanitation of the water sector in the state.