text:
BOMBSHELL: Covid-19 isn't a pandemic plan, it's an EXTERMINATION plan for humanity
by Mike Adams, Natural News:
About a year ago, I gave a live presentation in Branson, Missouri, that is only now being made fully public. The presentation, shown below via Brighteon.com, reveals that the real master plan which led to COVID is actually an extermination plan for humanity.
Population reduction has been the goal all along. But where the globalists have shown their true evil genius is in their choice of creating a biological weapon with high transmission rather than high fatality rates. The virus was never very deadly to people under the age of 50, but it was always highly contagious to people of all ages. And that contagiousness, it turns out, was enough to advance their nefarious plan against humanity.
TRUTH LIVES on at https://sgtreport.tv/
The rapid spread of the virus allowed the globalist-controlled media to claim "cases" were skyrocketing, thereby justifying weaponized lockdowns and a global rolling out of medical fascism disguised as "public health" policies. Based entirely on the speed of the spread of the virus, cities, states and nations of the world were able to achieve three key goals that represent the necessary precursors to global human extermination:
Crushing the existing human economies of the world, including food production, ultimately leading to mass famine, homelessness and total dependence on government.
Rolling out new, Orwellian medical fascism laws and edicts that set the precedent for mass arrests and forced relocation into "quarantine camps" for those who resist. These camps, of course, are actually death camps and processing facilities for eliminating human beings.
Forcing compliance with global vaccine mandates which will of course be used to achieve global infertility and accelerated deaths from diseases and subsequent infections. Whereas a pathogen could not achieve a 90% death rate on its own, the engineered pathogen (the Wuhan coronavirus) was able to be used to drive people into mass vaccine compliance, during which they can be directly injected with toxic substances, vaccine compliance tracking nanotech (quantum dots) and biology-altering mRNA sequences that literally hijack the body's cells and reprogram them to produce whatever protein sequences are engineered into the mRNA vaccines.
Thus, globalists have simultaneously built a global pandemic prison camp combined with a mandatory vaccine obedience system through which they can repeatedly spread more infectious disease and promote accelerated deaths or infertility.
The end goal, as globalists like Bill Gates openly support, is the elimination of billions of human beings living today. Ideally, globalists seek to reduce the world population to about 500 million people, which is roughly a 94% reduction in the current human population.
The world you once knew is never coming back, because the globalists who run the world have other plans
Each day, more and more people are coming to realize that there will be no restoration of the world we all once knew. Globalists have no intention of restoring human freedom, economic prosperity and global mobility. Now, human societies are being deliberately crushed — even in the face of contradictory scientific evidence that shows lockdowns don't work — in order to cause mass destitution and collapse.
Only through this planned collapse can the billions of people in the world be forced into subservience to the globalist depopulation agenda.
A key element of this is the Universal Basic Income (UBI), which has already been rolled out across America for the last several months, under the approval of Republicans, Democrats and President Trump. The UBI provides basic sustenance income to allow people to purchase food and stay alive, while CDC mandates prohibit the eviction of renters who can no longer pay rent. Through the UBI, the eviction ban and the pumping up of the stock market with Fed money printing policies, America remains under the false appearance that the economy is rebounding. In truth, these are all temporary, makeshift tactics to prevent millions of homeless from spilling out into the streets right before an election.
The real plan — about to be rolled out — is to tie UBI benefits to vaccine compliance and speech compliance. Only the obedient will be granted government credits for food, and anyone who refuses to take the new vaccine will be cut off from government benefits. This is a deliberate "squeeze" to force the sheeple into mass vaccine suicide by making sure they cannot function in society (or receive government benefits) unless they go along with the vaccine mandates, which are of course a global extermination program disguised as a public health program.
How vaccines will be used to exterminate billions of humans while amplifying infectious disease on a global scale
The mass extermination via vaccines consists of two strategies:
Lacing the vaccines with new bioweapons viral strains to ensure the continuation of the "outbreak" narrative. Notably, this only requires less than one percent of administered vaccines to be laced.
Engineering the vaccines to cause a very high fatality rate upon exposure to a secondary future infection, in a fatal reaction called a "cytokine storm," which is a hyper-inflammation event that leads to rapid death.
Thus, people won't be dropping dead right away after taking the vaccines. Instead, they will seem fine until the next major bioweapon pandemic hits them, at which point the fatality rate will be extremely high (perhaps as high as 75% averaged across all age groups).
The next strain to be released via the vaccines will be COVID-21, and the COVID-21 strain could be rightly considered the second half of a binary weapon system that will achieve extremely high kill rates for human beings across the globe.
Importantly, the mass die-offs will further justify government lockdowns, quarantines and medical authoritarianism that grants governments the power to forcefully inject people, kidnap people, imprison people and even exterminate people at will. The mass hysteria from the sudden wave of deaths will also feed directly into the justification of increased censorship by the tech giants, which will de-platform anyone who discusses the truth about how this entire scheme was planned from the start.
What ends up being created is a feedback loop of death, hysteria and tyranny. The more people die, the more hysteria the media spreads and the more tyranny is justified by the state. This, in turn, results in higher numbers of vaccine injections, which spread more weaponized viral strains, resulting in another wave of hysteria and so on. It's the perfect scam of tyranny and depopulation: The very governments who are building the bioweapons are using them to exterminate the masses while using the infections to justify their own power to administer the extermination weapons (i.e. vaccines).
Government tyrants are giggling with joy with their newfound powers over life and death
YouTube has just recently confirmed it will ban all vaccine videos that don't toe the line of Big Pharma and the China-run WHO. We've all witnessed the accelerating purges of so-called "anti-vax" channels and speakers across all the major tech platforms. It's all part of the narrative control that will maintain information monopolies to keep pushing the vaccines, lockdowns and tyranny that's killing human beings by the billions.
Read More @ NaturalNews.com
Previous articleExposing the Modern Plantation with Larken Rose
Next articleThe US Military/Security Complex Is Destroying Both Peace and the US Economy
Dave Kranzler: Did The Fed Really Talk About Tapering?!!
COVID-19 Vaccines May Have 'Serious Consequences' for Old & Frail, Norway Warns


text:
Edwards Riverwalk hotel signs skier Tess Johnson as its 'Resident Olympian'
EDWARDS — The Inn at Riverwalk and local Olympian and World Cup Moguls medalist Tess Johnson have announced that Johnson has been named the "Resident Olympian" for the hotel.
Johnson grew up in the Vail Valley and began skiing moguls when her mother, Carol, signed her up for the Bumps and Jumps class at Ski and Snowboard Club Vail in 2009.
"I thought it would be a lot of jumping in the park and that is what she loved to do at the time," Carol said. "When I picked her up she told me she skied moguls all day and I said 'Oh no, I'm sorry, did I sign you up for the wrong class?' And she said 'No! I loved it, mom, keep me in this program please.' It's been an honor and a privilege to be on this journey with her."
At age 14, Johnson was the youngest competitor ever to be named to the United States Freestyle team. Now 18, Johnson recently completed her fourth season on the World Cup freestyle tour and was a participant in the 2018 Winter Olympics Games in Pyeongchang, Korea. Her skiing accomplishments include:
5th Place World Cup Overall, (2018-2019).
3rd Place – World Championships Dual Moguls, Deer Valley, Utah (February 2019).
1st Place – World Cup Duals Moguls, Tazawako, Japan (March 2018).
1st Place – US National Championships Dual Moguls, Waterville, New Hampshire (March 2018).
12th Place – Winter Olympic Games, Pyeongchang, South Korea (February 2018).
3rd Place – US National Championships Dual Moguls, Steamboat Springs, Colorado, (March 2017).
2nd place – Junior World Championships, Are, Sweden (April 2016).
Johnson graduated in 2018 from Vail Ski & Snowboard Academy. While at the school, she competed for and was captain of the girls' soccer team at Vail Mountain School, which won two Colorado state championships.
"More important than all of that is that Tess is one of the nicest people you'll ever meet" Inn at Riverwalk General Manager Matt Tabor said. "When we first met with Tess, we were so impressed with how thoughtful, gracious and grateful she is. We were immediately sold that she would be a great representative for the inn as our Resident Olympian."
In her role as Resident Olympian, Johnson will be involved in a number of promotional efforts, including appearances (such as on-site Q&A sessions, or "hike with Tess" events). She will also be a regular blog contributor. The inn also will keep their guests informed as to Johnson's latest activities and accomplishments.
"I am so impressed by the Inn and their staff," Johnson said. The entire property was recently renovated and it's so nice. I really like that they provide 'loaner' bikes and snowshoes for their guests and provide ski transportation to Beaver Creek. It's the perfect place for your relatives and friends when they're in town."
Johnson is the fifth ranked women's moguls skier in the world. Go to her website: www.tessmogulskiing.com and follow her on Facebook or Instagram.

redpajama_set_name: RedPajamaCommonCrawl


4054 PONCE DE LEON Boulevard, Hobart, WI 54155-8651 - Better than new! Gorgeous, 3-4 BR, 3 bath all brick beauty in popular Polo Point-open concept SS appl kit w/corian & tile backsplash, desk planner, FF laundry, oversized deck, master suite w/dual W/I closets, french drs to FD/office, Pella, Kohler & Delta products throughout, floor to ceiling stone gas frpl in GR, unique lighted ceilings and niches, exposed LL family room w/fireplace & a theater room. Sprinkler system, custom blinds, newer floorings, freshly painted, extensive landscaping, lemonade front porch, near 3 prestigious golf courses!


Unique, valuable and highly engaging video content featuring well-known business personalities, high-performance experts, elite sports people, well-regarded academics and commentators and other subject matter experts. The wide range of pre-existing content allows you to select what is most relevant for your contacts. Regular, professionally written e-mail campaigns allow you to include written content related to the video content combined with your own key messages. Advanced analytics can track effectiveness.
Produced to broadcast TV standard.
A significant library of content available covering a wide range of topics proven to be engaging and unique.
Pre-existing playlists selected to align with your communications needs.
Proven to be highly engaging and effective.


Sustainable livestock raising also helps in minimizing damage to the environment and the produces such as beef, eggs and milk is far more nutritious and taste better then food from factory farms.
Livestock that are raised in limited factory farms have less quality life than those raised on pasture. Livestock when raised on pasture can move around and live an organic life where else in factory facilities the animals are all crowded in confined facilities. These facilities do not have sunshine or fresh air allowing bacteria to develope and affect the livestock. This then results in the livestock being given antibiotics which is not best for the livestock.
Since a whole lot of livestock eat grass, grazing them on pasture has a lot of benefits. Some of the benefits are the livestock are able to produce saliva which is great for neutralizing acids that is in their digestive tract. Since grain fed livestock produce less saliva they frequently suffer from dehydration, intestine damage and even death.


There are two ways to send artwork, depending on the size of your file.
Click here to open a new e-mail message.
Include a short note with your contact info and any special instructions.
Contact us to discuss your best option.
Save all of your files on a CD or DVD, then send the disk to the mailing address on our Contact Us page.


Woods greeted Sam and Charlie, who were just toddlers at the time, with a kiss after his final round at the 2009 AT&T National held at the Congressional Club in Bethesda, Maryland.
Trailing right behind their father dressed in traditional white golf caddy uniforms, Charlie and Sam assisted their dad during the 2015 Par 3 Contest for the Masters at Augusta National.
Charlie and Sam wore their dad's signature red while standing on the sidelines during the final round of the 2016 Quicken Loans National tournament at the Congressional Country Club in Bethesda, Maryland.
Charlie and Sam watched the highly anticipated match between their father and three-time Masters winner Phil Mickelson from behind a white rope at the Shadow Creek Golf Course in Las Vegas, Nevada. The five-hour event that took place in 2018 ended with Mickelson snagging the win.
Wood's kids watched intently as their dad competed in the final round of the 2018 Open Championship at the Carnoustie Golf Club in Carnoustie, Scotland.
It was an emotional moment for the Woods family when Tiger won his fifth Masters at Augusta National Golf Club on Sunday to top off one of the greatest sports comebacks of all time. Tiger's mother Kultida wiped away tears as Tiger hugged both of his kids after the overwhelming moment that marked his first major win in 11 years. "It means the world to me – their love and their support," he said of his kids.


text:
U.S., Belarus level at 1-1 after opening day of Fed Cup final
Associated PressNov 11, 2017, 3:45 PM EST
MINSK, Belarus — U.S. Open champion Sloane Stephens lost in three sets to Aryna Sabalenka as host Belarus and the United States ended the opening day of the Fed Cup final evenly poised at 1-1.
Sabalenka beat Stephens 6-3, 3-6, 6-4 Saturday after CoCo Vandeweghe earlier defeated Aliaksandra Sasnovich 6-4, 6-4 to give 17-time champion United States a 1-0 lead.
The Americans are looking to break a 17-year championship drought, while Belarus is playing in its first Fed Cup final.
Sabalenka's carefree and often careless tennis resulted in 31 winners and 57 unforced errors. She won on a fourth match point when Stephens netted a forehand.
A wild third set saw six straight breaks of serve before Sabalenka held in the seventh game.
"(It's) a good experience for me because I've never felt these emotions, playing at home and the score is 0-1," Sabalenka said.
Stephens has yet to win any of the five matches she's played since winning the U.S. Open.
"We're playing Fed Cup so anything goes," Stephens said. "I want to play like that. That was insane. Playing for her country, the crowd behind her, she played great."
Vandeweghe also faced a boisterous crowd at the indoor hard court in Minsk as she played Sasnovich for the first time.
"I think that's part of having the home court advantage and I would expect the same in the U.S.," Vandeweghe said.
Vandeweghe broke in the opening games of both sets at Chizhovka Arena, and didn't face a break point on her serve in the opener.
In the second set, Vandeweghe lost serve in the second and eighth games, but broke serve on three of four offerings to secure the match.
Vandeweghe holds a perfect record in Fed Cup action this year, winning five singles and one doubles match including her defeat of Sasnovich.
"I think there's different moments that excite you in tennis," Vandeweghe said. "For me, Fed Cup is probably one of the more exciting moments I could have in my career.
"I don't want to use the word `ooze' confidence, but I can't think of a better word. I just take the energy that's around me and I really use it to my advantage."
The Americans won a record 17th Fed Cup title in 2000, with Billie Jean King as captain. Since then, they have played and lost in three finals – 2003, 2009 and 2010.


AgeUK 'Failte' Irish Club, St Claret Centre, St Mary's Church, Botwell Lane, Hayes.
AgeUK Multicultural Food and Fitness Club, Methodist Church, Station Road, Hayes.
Dance, Tone and Stretch for a shapelier YOU! Low-impact basic dance and body-toning, designed with the older person in mind and in a social club setting. More fun than the gym, less stress than a diet!


From whimsical castles floating on top of clouds to picturesque towns with their colorful houses and winding cobbled alleys, these ten fairytale destinations from around the world will add some inspiration to your travel bucket list.
This picturesque town is set on the pine covered hills of the Serra de Sintra, not far from the capital of Portugal, Lisbon. With a variety of historic palaces, ancient ruins, extravagant residences and decorative gardens, Sintra is a treat to the eyes.
Lord Byron called Sintra a "Glourious Eden" and is said to have written "Childe Harold's Pilgrimage" after visiting the city.
Walk the cobbled streets in the historic town center, visit the colorful Pena Palace – one of the Seven Wonders of Portugal, or hike to the ancient Castelo dos Mouros and enjoy the spectacular panoramic views over Sintra and the surrounding region.
Greenland is the world's largest non-continental island. It might very well be remote, cold and dark, but it's so much more than that. A country that has preserved its untouched nature, impressive wildlife and fascinating Inuit culture. A place where ice and snow mold breathtaking landscapes, graced by the phenomenal glow of the Northern Lights. Whether you want to go hiking through mountains, glaciers and fjords, take a kayak down the crystal clear Blue River, or simply be in awe of the stunning Aurora Borealis, you will find incredible views around every corner.
Situated in north-eastern France, in the Alsace region, this charming, little city is straight out of fairy tales. With a population of 65,000, Colmar is peaceful as can be. Walk the streets in the well-preserved old town, take a boat tour of the canals, and explore the famous Alsatian cuisine and wine in one of Colmar's cozy, intimate restaurants.
This pitch black cave in New Zealand is something out of this world. The grotto is lit up by thousands of glow worms, in a jaw-droppingly beautiful display of light streaks. Take a guided boat tour around the 30 million-year-old limestone caves and enjoy the dazzling galaxy of turquoise light.
Cappadocia is a historical region in Central Anatolia, located in the heartland of today's Turkey. Well known for its enchanting fairy chimneys – a true natural wonder, Cappadocia is a popular tourist destination. You can go hot-air ballooning to admire the otherworldly rock formations, valleys, orchards and vineyards from above, or explore one of the many excavated underground cities across Cappadocia.


have? I can go upwhat am I? The matching product will have a skullcandy party hop sticker. Answers: 1) Mi 10000 mah powerbank 2 ( link ) 2) OnePlus 5 Soft Gold 64GB ( link ) Hint : unlocks.2 seconds 3) Timex mens watch ( link ) hint : and tide wait for none) 4) Sennheiser cx180 earphone ( link. However, unless your 1911 is a good one, the air pistol may be more accurate especially at close range. Ans : Predicting the future accurately In March the sun crosses thephenomenon called? True 5) What is the display type on the LG V30? Point Zoom 2) In video recording mode, which of these describes the Cine effects feature on the LG V30? Answer : 3 #2. Answer is 4000 mah.
All the top cigar brands rare cigars in one of the net s best selection with traditional tobacconist service.
High Quality Image Detail Information on Waterhouse The Favorites of the Emperor Honorius Art Gallery of South Australia, Adelaide - John William Waterhouse.
Pre-order Update: Gigabyte has announced a pre-order for this RX 580 Gaming.
Box exclusively through our forum.
This is easier than a group-buy in that.
Ans : Pisces International Womens dayZambia. Ans : USA Amazon Festive Riddle Quiz Answers Q 1) A carpet of rice, flour, sand or petals. Ans: 19:9 Full view display. Click on that sticker and keep looking for more such products to increase the chances of winning. Its perfect for target shooting. 10 Winners will get wrist band from Reebok.
Q 5) Which is not the feature of Note 8s camera? Towards the sky ground. Ans : Pima Colada Level 5 Answers When does oneplus 5t sale begin for prime members? Same will be sent to your registered email id by 30th October 2017. Maze 1 On The Go Snacks 1) Bournvita Crunchy Cookies Tiffin 2) Paperboat coconut water 3) Doritos Cheese 4) Paperboat Chikki 5) Happy Belly Roasted and Salted Cashews Maze 2 On The Go Music TV 1) Amazon Fire TV stick 2) Saregama SC03 Music Player. Those who will find 10 cards will get a chance to win 10000 Rs worth Amazon pay balance. Click here to visit offer page then take the quiz. Fly to the moon 5) How many service centers does TCL have across India? Ans : 18:9 4) Which of these was named International Word of the Year 2013 by the Oxford Dictionaries? Stop at the first click and you have low power. Ans : Ranveer Singh 2) Which of these is NOT a hairstyle for men? Ans: A joke, i come once in a year, twice in week but never in a day.


Level 1 Aisle 3 & 4 and Aisle 28.
Parent Room facilities include baby change table, child-friendly play panel, a microwave and television as well as both private and public feeding areas.
The Customer Service Desk is located inside Gate 4 (Level 1, Aisle 43).
Male, Female and Disabled toilets are located on all levels.


text:
Press Release -- August 30th, 2011
Source: Global Crossing
Tags: Ethernet, Video
SoftLayer Deploys Global Crossing Solution to Meet Growing Demand for Virtual Data Center Connectivity
FLORHAM PARK, N.J., Aug. 30, 2011 /PRNewswire/ -- Global Crossing (NASDAQ: GLBC), a leading global IP solutions provider, today announced it has deployed 14 new 10 Gigabit per second (Gbps) Dedicated Internet Access (DIA) ports for SoftLayer, a global leader in cloud, dedicated and managed private hosting.
Global Crossing DIA connects enterprise networks to the Internet, enabling superior communication among employees, customers and business partners with on-demand scalable bandwidth for increased capacity whenever it is needed.
"At SoftLayer, our innovative virtual data center and hosting services depend on unsurpassed technology and technical execution to empower enterprises with global access, control and security," said Ric Moseley, vice president of Network Engineering at SoftLayer. "Global Crossing provides us with reliable, scalable and secure global connectivity that satisfies our customers' IP services needs."
Global Crossing is a Tier 1 Internet Service Provider (ISP). The company's single Autonomous System (AS) number translates to fewer data hand-offs for faster transmission, less down-time and greater productivity. The Global Crossing network provides the highest levels of security through its precedent-setting National Security Agreement (NSA) mandated by the U.S. Federal Government.
"Our long and fruitful relationship with SoftLayer continues to deliver value to customers," said Julie Masino, Global Crossing's regional vice president for North America. "We are delighted to be able to help SoftLayer provide customers with a superior Internet experience for their applications that can accommodate their business as it continues to grow."
DIA also can be integrated with Global Crossing IP VPN (Virtual Private Network) or other types of transport services as one seamless offer from core to edge to reduce management load, total bandwidth requirements and expenses.
ABOUT SOFTLAYER TECHNOLOGIES
Headquartered in Dallas, SoftLayer is the innovation leader in Cloud, Dedicated, and Managed Hosting, and the largest private hosting company in the world. SoftLayer provides cloud, dedicated, and seamlessly integrated computing environments, with world-class data centers in Dallas, Houston, San Jose, Seattle, and Washington D.C., and network Points of Presence nationwide. The company integrates and automates all elements of its platform, empowering enterprises of any size with complete control, security, scalability, and ease-of-management via a leading Customer Portal and Open API. For more information, please visit www.softlayer.com or call 866.398.7638.
ABOUT GLOBAL CROSSING
Global Crossing (NASDAQ: GLBC) is a leading global IP, Ethernet, data center and video solutions provider with the world's first integrated global IP-based network. The company offers a full range of data, voice, collaboration, broadcast and media services delivered with superior customer service.
Global Crossing provides services to enterprises (including approximately 40 percent of the Fortune 500); government departments and agencies; and 700 carriers, mobile operators and ISPs. It delivers converged IP services to more than 700 cities in more than 70 countries, and has 17 world-class data centers in major business centers around the globe.
Please visit www.globalcrossing.com for more information about Global Crossing.
Global Crossing maintains a corporate website at www.globalcrossing.com, and you can find additional information about the company through the Investors pages on that website at http://investors.globalcrossing.com. Global Crossing utilizes its website as a channel of distribution of important information about the company. Global Crossing routinely posts financial and other important information regarding the company and its business, financial condition and operations on the Investors web pages.
Visitors to the Investors web pages can view and print copies of Global Crossing's SEC filings, including periodic and current reports on Forms 10-K, 10-Q, 8-K, and in respect of GCUK's Forms 20-F and 6-K, as soon as reasonably practicable after those filings are made with the SEC. Copies of the charters for each of the standing committees of Global Crossing's Board of Directors, its Corporate Governance Guidelines, Ethics Policy, press releases and analysts presentations are all available through the Investors web pages.
Please note that the information contained on any of Global Crossing's websites is not incorporated by reference in, or considered to be a part of, any document unless expressly incorporated by reference therein.
CONTACT GLOBAL CROSSING:
Richard Larris
Richard.Larris@globalcrossing.com
Paula Vivo
Paula.Vivo@globalcrossing.com
Nigel Brown
UK and Europe
Nigel.Brown@globalcrossing.com
Analysts/Investors Contact
Mark Gottlieb
glbc@globalcrossing.com
GEN/PR1
SOURCE Global Crossing
Previous: DG to Acquire EyeWonder From Limelight Networks
Next: Limelight Networks(R) Sells EyeWonder Unit to DG(R), Announces Share Repurchase Program, Updates Guidance for Third Quarter 2011 as a Result of Sale
Global Crossing Upgrades Network Capacity to Meet Growing Demand for Broadband Services
Global Crossing Speeds Network Enhancements to Meet Continuing Customer Demand
IPC Extends Global Collaboration with Equinix to Meet Growing Demand for Its Global Electronic Connectivity Services
Savvis Launches Major Data Center Expansion to Meet Growing Demand in Financial Markets
Global Crossing EtherSphere™ Service Keeps Data Center Operations on Track for Railcar Provider TTX Company


text:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.docbook.org/xml/4.5/docbookx.dtd" [
<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
%CustomDTD;
]>
<chapter id="start">
  <title>Getting Started</title>
  <para>
    This chapter tours around the core constructs of Netty with simple
    examples to let you get started quickly.  You will be able to write a
    client and a server on top of Netty right away when you are at the
    end of this chapter.
  </para>

  <para>
    If you prefer top-down approach in learning something, you might want to
    start from <xref linkend="architecture"/> and get back here.
  </para>

    <title>Before Getting Started</title>
    <para>
      The minimum requirements to run the examples which are introduced in
      this chapter are only two; the latest version of Netty and JDK 1.5 or
      above.  The latest version of Netty is available in
      <ulink url="&Downloads;">the project download page</ulink>.  To download
      the right version of JDK, please refer to your preferred JDK vendor's web
      site.
    </para>
    <para>
      As you read, you might have more questions about the classes introduced
      in this chapter.  Please refer to the API reference whenever you want to
      know more about them.  All class names in this document are linked to the
      online API reference for your convenience.  Also, please don't hesitate to
      <ulink url="&Community;">contact the Netty project community</ulink> and
      let us know if there's any incorrect information, errors in grammar and
      typo, and if you have a good idea to improve the documentation.
    </para>

    <title>Writing a Discard Server</title>
    <para>
      The most simplistic protocol in the world is not 'Hello, World!' but
      <ulink url="http://tools.ietf.org/html/rfc863">DISCARD</ulink>.  It's
      a protocol which discards any received data without any response.
    </para>
    <para>
      To implement the DISCARD protocol, the only thing you need to do is
      to ignore all received data.  Let us start straight from the handler
      implementation, which handles I/O events generated by Netty.
    </para>
    <programlisting>package org.jboss.netty.example.discard;

public class DiscardServerHandler extends &SimpleChannelHandler; {<co id="example.discard.co1"/>

    @Override
    public void messageReceived(&ChannelHandlerContext; ctx, &MessageEvent; e) {<co id="example.discard.co2"/>
    }

    @Override
    public void exceptionCaught(&ChannelHandlerContext; ctx, &ExceptionEvent; e) {<co id="example.discard.co3"/>
        e.getCause().printStackTrace();

        &Channel; ch = e.getChannel();
        ch.close();
    }
}</programlisting>
    <calloutlist>
      <callout arearefs="example.discard.co1">
        <para>
          <classname>DiscardServerHandler</classname> extends
          &SimpleChannelHandler;, which is an implementation of
          &ChannelHandler;.  &SimpleChannelHandler; provides various event
          handler methods that you can override.  For now, it is just enough
          to extend &SimpleChannelHandler; rather than to implement
          the handler interfaces by yourself.
        </para>
      </callout>
      <callout arearefs="example.discard.co2">
        <para>
          We override the <methodname>messageReceived</methodname> event
          handler method here.  This method is called with a &MessageEvent;,
          which contains the received data, whenever new data is received
          from a client.  In this example, we ignore the received data by doing
          nothing to implement the DISCARD protocol.
        </para>
      </callout>
      <callout arearefs="example.discard.co3">
        <para>
          <methodname>exceptionCaught</methodname> event handler method is
          called with an &ExceptionEvent; when an exception was raised by
          Netty due to I/O error or by a handler implementation due to the
          exception thrown while processing events.  In most cases, the
          caught exception should be logged and its associated channel
          should be closed here, although the implementation of this method
          can be different depending on what you want to do to deal with an
          exceptional situation.  For example, you might want to send a
          response message with an error code before closing the connection.
        </para>
      </callout>
    </calloutlist>
    <para>
      So far so good.  We have implemented the first half of the DISCARD server.
      What's left now is to write the <methodname>main</methodname> method
      which starts the server with the <classname>DiscardServerHandler</classname>.
    </para>
    <programlisting>package org.jboss.netty.example.discard;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

public class DiscardServer {

    public static void main(String[] args) throws Exception {
        &ChannelFactory; factory =
            new &NioServerSocketChannelFactory;<co id="example.discard2.co1" />(
                    Executors.newCachedThreadPool(),
                    Executors.newCachedThreadPool());

        &ServerBootstrap; bootstrap = new &ServerBootstrap;<co id="example.discard2.co2" />(factory);

        bootstrap.setPipelineFactory(new &ChannelPipelineFactory;() {<co id="example.discard2.co3" />
            public &ChannelPipeline; getPipeline() {
                return &Channels;.pipeline(new DiscardServerHandler());
            }
        });

        bootstrap.setOption("child.tcpNoDelay", true);<co id="example.discard2.co4" />
        bootstrap.setOption("child.keepAlive", true);

        bootstrap.bind(new InetSocketAddress(8080));<co id="example.discard2.co5" />
    }
}</programlisting>
    <calloutlist>
      <callout arearefs="example.discard2.co1">
        <para>
          &ChannelFactory; is a factory which creates and manages &Channel;s
          and its related resources.  It processes all I/O requests and
          performs I/O to generate &ChannelEvent;s.  Netty provides various
          &ChannelFactory; implementations.  We are implementing a server-side
          application in this example, and therefore
          &NioServerSocketChannelFactory; was used.  Another thing to note is
          that it does not create I/O threads by itself.  It is supposed to
          acquire threads from the thread pool you specified in the
          constructor, and it gives you more control over how threads should
          be managed in the environment where your application runs, such as
          an application server with a security manager.
        </para>
      </callout>
      <callout arearefs="example.discard2.co2">
        <para>
          &ServerBootstrap; is a helper class that sets up a server. You can
          set up the server using a &Channel; directly.  However, please note
          that this is a tedious process and you do not need to do that in most
          cases.
        </para>
      </callout>
      <callout arearefs="example.discard2.co3">
        <para>
          Here, we configure the &ChannelPipelineFactory;.  Whenever a new
          connection is accepted by the server, a new &ChannelPipeline; will be
          created by the specified &ChannelPipelineFactory;.  The new pipeline
          contains the <classname>DiscardServerHandler</classname>.  As the
          application gets complicated, it is likely that you will add more
          handlers to the pipeline and extract this anonymous class into a top
          level class eventually.
        </para>
      </callout>
      <callout arearefs="example.discard2.co4">
        <para>
          You can also set the parameters which are specific to the &Channel;
          implementation.  We are writing a TCP/IP server, so we are allowed
          to set the socket options such as <literal>tcpNoDelay</literal> and
          <literal>keepAlive</literal>.  Please note that the
          <literal>"child."</literal> prefix was added to all options.  It
          means the options will be applied to the accepted &Channel;s instead
          of the options of the &ServerSocketChannel;.  You could do the
          following to set the options of the &ServerSocketChannel;:
          <programlisting>bootstrap.setOption("reuseAddress", true);</programlisting>
        </para>
      </callout>
      <callout arearefs="example.discard2.co5">
        <para>
          We are ready to go now.  What's left is to bind to the port and to
          start the server.  Here, we bind to the port <literal>8080</literal>
          of all NICs (network interface cards) in the machine.  You can now
          call the <methodname>bind</methodname> method as many times as
          you want (with different bind addresses.)
        </para>
      </callout>
    </calloutlist>
    <para>
      Congratulations!  You've just finished your first server on top of Netty.
    </para>

    <title>Looking into the Received Data</title>
    <para>
      Now that we have written our first server, we need to test if it really
      works.  The easiest way to test it is to use the <command>telnet</command>
      command.  For example, you could enter "<command>telnet localhost
      8080</command>" in the command line and type something.
    </para>
    <para>
      However, can we say that the server is working fine?  We cannot really
      know that because it is a discard server.  You will not get any response
      at all.  To prove it is really working, let us modify the server to print
      what it has received.
    </para>
    <para>
      We already know that &MessageEvent; is generated whenever data is
      received and the <methodname>messageReceived</methodname> handler method
      will be invoked.  Let us put some code into the
      <methodname>messageReceived</methodname> method of the
      <classname>DiscardServerHandler</classname>:
    </para>
    <programlisting>@Override
public void messageReceived(&ChannelHandlerContext; ctx, &MessageEvent; e) {
    &ChannelBuffer;<co id="example.discard3.co1"/> buf = (ChannelBuffer) e.getMessage();
    while(buf.readable()) {
        System.out.println((char) buf.readByte());
        System.out.flush();
    }
}</programlisting>
    <calloutlist>
      <callout arearefs="example.discard3.co1">
        <para>
          It is safe to assume the message type in socket transports is always
          &ChannelBuffer;.  &ChannelBuffer; is a fundamental data structure
          which stores a sequence of bytes in Netty.  It's similar to NIO
          <classname>ByteBuffer</classname>, but it is easier to use and more
          flexible.  For example, Netty allows you to create a composite
          &ChannelBuffer; which combines multiple &ChannelBuffer;s reducing
          the number of unnecessary memory copy.
        </para>
        <para>
          Although it resembles to NIO <classname>ByteBuffer</classname> a lot,
          it is highly recommended to refer to the API reference.  Learning how
          to use &ChannelBuffer; correctly is a critical step in using Netty
          without difficulty.
        </para>
      </callout>
    </calloutlist>
    <para>
      If you run the <command>telnet</command> command again, you will see the
      server prints what has received.
    </para>
    <para>
      The full source code of the discard server is located in the
      <literal>org.jboss.netty.example.discard</literal> package of the
      distribution.
    </para>

    <title>Writing an Echo Server</title>
    <para>
      So far, we have been consuming data without responding at all.  A server,
      however, is usually supposed to respond to a request.  Let us learn how to
      write a response message to a client by implementing the
      <ulink url="http://tools.ietf.org/html/rfc862">ECHO</ulink> protocol,
      where any received data is sent back.
    </para>
    <para>
      The only difference from the discard server we have implemented in the
      previous sections is that it sends the received data back instead of
      printing the received data out to the console.  Therefore, it is enough
      again to modify the <methodname>messageReceived</methodname> method:
    </para>
    <programlisting>@Override
public void messageReceived(&ChannelHandlerContext; ctx, &MessageEvent; e) {
    &Channel;<co id="example.echo.co1"/> ch = e.getChannel();
    ch.write(e.getMessage());
}</programlisting>
    <calloutlist>
      <callout arearefs="example.echo.co1">
        <para>
          A &ChannelEvent; object has a reference to its associated &Channel;.
          Here, the returned &Channel; represents the connection which received
          the &MessageEvent;.  We can get the &Channel; and call the
          <methodname>write</methodname> method to write something back to
          the remote peer.
        </para>
      </callout>
    </calloutlist>
    <para>
      If you run the <command>telnet</command> command again, you will see the
      server sends back whatever you have sent to it.
    </para>
    <para>
      The full source code of the echo server is located in the
      <literal>org.jboss.netty.example.echo</literal> package of the
      distribution.
    </para>

    <title>Writing a Time Server</title>
    <para>
      The protocol to implement in this section is the
      <ulink url="http://tools.ietf.org/html/rfc868">TIME</ulink> protocol.
      It is different from the previous examples in that it sends a message,
      which contains a 32-bit integer, without receiving any requests and
      loses the connection once the message is sent.  In this example, you
      will learn how to construct and send a message, and to close the
      connection on completion.
    </para>
    <para>
      Because we are going to ignore any received data but to send a message
      as soon as a connection is established, we cannot use the
      <methodname>messageReceived</methodname> method this time.  Instead,
      we should override the <methodname>channelConnected</methodname> method.
      The following is the implementation:
    </para>
    <programlisting>package org.jboss.netty.example.time;

public class TimeServerHandler extends &SimpleChannelHandler; {

    @Override
    public void channelConnected(&ChannelHandlerContext; ctx, &ChannelStateEvent; e) {<co id="example.time.co1"/>
        &Channel; ch = e.getChannel();

        &ChannelBuffer; time = &ChannelBuffers;.buffer(4);<co id="example.time.co2"/>
        time.writeInt(System.currentTimeMillis() / 1000);

        &ChannelFuture; f = ch.write(time);<co id="example.time.co3"/>

        f.addListener(new &ChannelFutureListener;() {<co id="example.time.co4"/>
            public void operationComplete(&ChannelFuture; future) {
                &Channel; ch = future.getChannel();
                ch.close();
            }
        });
    }

    @Override
    public void exceptionCaught(&ChannelHandlerContext; ctx, &ExceptionEvent; e) {
        e.getCause().printStackTrace();
        e.getChannel().close();
    }
}</programlisting>
    <calloutlist>
      <callout arearefs="example.time.co1">
        <para>
          As explained, <methodname>channelConnected</methodname> method will
          be invoked when a connection is established.  Let us write the 32-bit
          integer that represents the current time in seconds here.
        </para>
      </callout>
      <callout arearefs="example.time.co2">
        <para>
          To send a new message, we need to allocate a new buffer which will
          contain the message.  We are going to write a 32-bit integer, and
          therefore we need a &ChannelBuffer; whose capacity is
          <literal>4</literal> bytes.  The &ChannelBuffers; helper class is
          used to allocate a new buffer.  Besides the
          <methodname>buffer</methodname> method, &ChannelBuffers; provides a
          lot of useful methods related to the &ChannelBuffer;.  For more
          information, please refer to the API reference.
        </para>
        <para>
          On the other hand, it is a good idea to use static imports for
          &ChannelBuffers;:
          <programlisting>import static org.jboss.netty.buffer.&ChannelBuffers;.*;
...
&ChannelBuffer;  dynamicBuf = dynamicBuffer(256);
&ChannelBuffer; ordinaryBuf = buffer(1024);</programlisting>
        </para>
      </callout>
      <callout arearefs="example.time.co3">
        <para>
          As usual, we write the constructed message.
        </para>
        <para>
          But wait, where's the <methodname>flip</methodname>?  Didn't we used
          to call <methodname>ByteBuffer.flip()</methodname> before sending a
          message in NIO?  &ChannelBuffer; does not have such a method because
          it has two pointers; one for read operations and the other for write
          operations.  The writer index increases when you write something to
          a &ChannelBuffer; while the reader index does not change.  The reader
          index and the writer index represents where the message starts and
          ends respectively.
        </para>
        <para>
          In contrast, NIO buffer does not provide a clean way to figure out
          where the message content starts and ends without calling the
          <methodname>flip</methodname> method.  You will be in trouble when
          you forget to flip the buffer because nothing or incorrect data will
          be sent.  Such an error does not happen in Netty because we have
          different pointer for different operation types.  You will find it
          makes your life much easier as you get used to it -- a life without
          flipping out!
        </para>
        <para>
          Another point to note is that the <methodname>write</methodname>
          method returns a &ChannelFuture;.  A &ChannelFuture; represents an
          I/O operation which has not yet occurred.  It means, any requested
          operation might not have been performed yet because all operations
          are asynchronous in Netty.  For example, the following code might
          close the connection even before a message is sent:
        </para>
        <programlisting>&Channel; ch = ...;
ch.write(message);
ch.close();</programlisting>
        <para>
          Therefore, you need to call the <methodname>close</methodname>
          method after the &ChannelFuture;, which was returned by the
          <methodname>write</methodname> method, notifies you when the write
          operation has been done.  Please note that, <methodname>close</methodname>
          also might not close the connection immediately, and it returns a
          &ChannelFuture;.
        </para>
      </callout>
      <callout arearefs="example.time.co4">
        <para>
          How do we get notified when the write request is finished then?
          This is as simple as adding a &ChannelFutureListener; to the returned
          &ChannelFuture;.  Here, we created a new anonymous &ChannelFutureListener;
          which closes the &Channel; when the operation is done.
        </para>
        <para>
          Alternatively, you could simplify the code using a pre-defined
          listener:
          <programlisting>f.addListener(&ChannelFutureListener;.CLOSE);</programlisting>
        </para>
      </callout>
    </calloutlist>

    <title>Writing a Time Client</title>
    <para>
      Unlike DISCARD and ECHO servers, we need a client for the TIME protocol
      because a human cannot translate a 32-bit binary data into a date on a
      calendar.  In this section, we discuss how to make sure the server works
      correctly and learn how to write a client with Netty.
    </para>
    <para>
      The biggest and only difference between a server and a client in Netty
      is that different &Bootstrap; and &ChannelFactory; are required.  Please
      take a look at the following code:
    </para>
    <programlisting>package org.jboss.netty.example.time;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

public class TimeClient {

    public static void main(String[] args) throws Exception {
        String host = args[0];
        int port = Integer.parseInt(args[1]);

        &ChannelFactory; factory =
            new &NioClientSocketChannelFactory;<co id="example.time2.co1"/>(
                    Executors.newCachedThreadPool(),
                    Executors.newCachedThreadPool());

        &ClientBootstrap; bootstrap = new &ClientBootstrap;<co id="example.time2.co2"/>(factory);

        bootstrap.setPipelineFactory(new &ChannelPipelineFactory;() {
            public &ChannelPipeline; getPipeline() {
                return &Channels;.pipeline(new TimeClientHandler());
            }
        });

        bootstrap.setOption("tcpNoDelay"<co id="example.time2.co3"/>, true);
        bootstrap.setOption("keepAlive", true);

        bootstrap.connect<co id="example.time2.co4"/>(new InetSocketAddress(host, port));
    }
}</programlisting>
    <calloutlist>
      <callout arearefs="example.time2.co1">
        <para>
          &NioClientSocketChannelFactory;, instead of &NioServerSocketChannelFactory;
           was used to create a client-side &Channel;.
        </para>
      </callout>
      <callout arearefs="example.time2.co2">
        <para>
          &ClientBootstrap; is a client-side counterpart of &ServerBootstrap;.
        </para>
      </callout>
      <callout arearefs="example.time2.co3">
        <para>
          Please note that there's no <literal>"child."</literal> prefix.
          A client-side &SocketChannel; does not have a parent.
        </para>
      </callout>
      <callout arearefs="example.time2.co4">
        <para>
          We should call the <methodname>connect</methodname> method instead of
          the <methodname>bind</methodname> method.
        </para>
      </callout>
    </calloutlist>
    <para>
      As you can see, it is not really different from the server side startup.
      What about the &ChannelHandler; implementation?  It should receive a
      32-bit integer from the server, translate it into a human readable format,
      print the translated time, and close the connection:
    </para>
    <programlisting>package org.jboss.netty.example.time;

import java.util.Date;

public class TimeClientHandler extends &SimpleChannelHandler; {

    @Override
    public void messageReceived(&ChannelHandlerContext; ctx, &MessageEvent; e) {
        &ChannelBuffer; buf = (&ChannelBuffer;) e.getMessage();
        long currentTimeMillis = buf.readInt() * 1000L;
        System.out.println(new Date(currentTimeMillis));
        e.getChannel().close();
    }

    @Override
    public void exceptionCaught(&ChannelHandlerContext; ctx, &ExceptionEvent; e) {
        e.getCause().printStackTrace();
        e.getChannel().close();
    }
}</programlisting>
    <para>
      It looks very simple and does not look any different from the server side
      example.  However, this handler sometimes will refuse to work raising an
      <exceptionname>IndexOutOfBoundsException</exceptionname>.  We discuss why
      this happens in the next section.
    </para>

    <title>
      Dealing with a Stream-based Transport
    </title>

      <title>
        One Small Caveat of Socket Buffer
      </title>
      <para>
        In a stream-based transport such as TCP/IP, received data is stored
        into a socket receive buffer.  Unfortunately, the buffer of a
        stream-based transport is not a queue of packets but a queue of bytes.
        It means, even if you sent two messages as two independent packets, an
        operating system will not treat them as two messages but as just a
        bunch of bytes.  Therefore, there is no guarantee that what you read
        is exactly what your remote peer wrote.  For example, let us assume
        that the TCP/IP stack of an operating system has received three packets:
      </para>
      <programlisting>+-----+-----+-----+
| ABC | DEF | GHI |
+-----+-----+-----+</programlisting>
      <para>
        Because of this general property of a stream-based protocol, there's
        high chance of reading them in the following fragmented form in your
        application:
      </para>
      <programlisting>+----+-------+---+---+
| AB | CDEFG | H | I |
+----+-------+---+---+</programlisting>
      <para>
        Therefore, a receiving part, regardless it is server-side or
        client-side, should defrag the received data into one or more meaningful
        <firstterm>frames</firstterm> that could be easily understood by the
        application logic.  In case of the example above, the received data
        should be framed like the following:
      </para>
      <programlisting>+-----+-----+-----+
| ABC | DEF | GHI |
+-----+-----+-----+</programlisting>

      <title>
        The First Solution
      </title>
      <para>
        Now let us get back to the TIME client example.  We have the same
        problem here.  A 32-bit integer is a very small amount of data, and it
        is not likely to be fragmented often.  However, the problem is that it
        <emphasis>can</emphasis> be fragmented, and the possibility of
        fragmentation will increase as the traffic increases.
      </para>
      <para>
        The simplistic solution is to create an internal cumulative buffer and
        wait until all 4 bytes are received into the internal buffer.  The
        following is the modified <classname>TimeClientHandler</classname>
        implementation that fixes the problem:
      </para>
      <programlisting>package org.jboss.netty.example.time;

import static org.jboss.netty.buffer.&ChannelBuffers;.*;

import java.util.Date;

public class TimeClientHandler extends &SimpleChannelHandler; {

    private final &ChannelBuffer; buf = dynamicBuffer();<co id="example.time3.co1"/>

    @Override
    public void messageReceived(&ChannelHandlerContext; ctx, &MessageEvent; e) {
        &ChannelBuffer; m = (&ChannelBuffer;) e.getMessage();
        buf.writeBytes(m);<co id="example.time3.co2"/>

        if (buf.readableBytes() >= 4) {<co id="example.time3.co3"/>
            long currentTimeMillis = buf.readInt() * 1000L;
            System.out.println(new Date(currentTimeMillis));
            e.getChannel().close();
        }
    }

    @Override
    public void exceptionCaught(&ChannelHandlerContext; ctx, &ExceptionEvent; e) {
        e.getCause().printStackTrace();
        e.getChannel().close();
    }
}</programlisting>
      <calloutlist>
        <callout arearefs="example.time3.co1">
          <para>
            A <firstterm>dynamic buffer</firstterm> is a &ChannelBuffer; which
            increases its capacity on demand.  It's very useful when you don't
            know the length of the message.
          </para>
        </callout>
        <callout arearefs="example.time3.co2">
          <para>
            First, all received data should be cumulated into
            <varname>buf</varname>.
          </para>
        </callout>
        <callout arearefs="example.time3.co3">
          <para>
            And then, the handler must check if <varname>buf</varname> has enough
            data, 4 bytes in this example, and proceed to the actual business
            logic.  Otherwise, Netty will call the
            <methodname>messageReceived</methodname> method again when more
            data arrives, and eventually all 4 bytes will be cumulated.
          </para>
        </callout>
      </calloutlist>

      <title>
        The Second Solution
      </title>
      <para>
        Although the first solution has resolved the problem with the TIME
        client, the modified handler does not look that clean.  Imagine a more
        complicated protocol which is composed of multiple fields such as a
        variable length field.  Your &ChannelHandler; implementation will
        become unmaintainable very quickly.
      </para>
      <para>
        As you may have noticed, you can add more than one &ChannelHandler; to
        a &ChannelPipeline;, and therefore, you can split one monolithic
        &ChannelHandler; into multiple modular ones to reduce the complexity of
        your application.  For example, you could split
        <classname>TimeClientHandler</classname> into two handlers:
        <itemizedlist>
          <listitem>
            <para>
              <classname>TimeDecoder</classname> which deals with the
              fragmentation issue, and
            </para>
          </listitem>
          <listitem>
            <para>
              the initial simple version of <classname>TimeClientHandler</classname>.
            </para>
          </listitem>
        </itemizedlist>
      </para>
      <para>
        Fortunately, Netty provides an extensible class which helps you write
        the first one out of the box:
      </para>
      <programlisting>package org.jboss.netty.example.time;

public class TimeDecoder extends &FrameDecoder; {

    @Override
    protected Object decode(
            &ChannelHandlerContext; ctx, &Channel; channel, &ChannelBuffer; buffer)<co id="example.time4.co1"/> {

        if (buffer.readableBytes() < 4) {
            return null; <co id="example.time4.co2"/>
        }

        return buffer.readBytes(4);<co id="example.time4.co3"/>
    }
}</programlisting>
      <calloutlist>
        <callout arearefs="example.time4.co1">
          <para>
            &FrameDecoder; calls <methodname>decode</methodname> method with
            an internally maintained cumulative buffer whenever new data is
            received.
          </para>
        </callout>
        <callout arearefs="example.time4.co2">
          <para>
            If <literal>null</literal> is returned, it means there's not
            enough data yet.  &FrameDecoder; will call again when there is a
            sufficient amount of data.
          </para>
        </callout>
        <callout arearefs="example.time4.co3">
          <para>
            If non-<literal>null</literal> is returned, it means the
            <methodname>decode</methodname> method has decoded a message
            successfully.  &FrameDecoder; will discard the read part of its
            internal cumulative buffer.  Please remember that you don't need
            to decode multiple messages.  &FrameDecoder; will keep calling
            the <methodname>decoder</methodname> method until it returns
            <literal>null</literal>.
          </para>
        </callout>
      </calloutlist>
      <para>
        Now that we have another handler to insert into the &ChannelPipeline;,
        we should modify the &ChannelPipelineFactory; implementation in the
        <classname>TimeClient</classname>:
      </para>
      <programlisting>        bootstrap.setPipelineFactory(new &ChannelPipelineFactory;() {
            public &ChannelPipeline; getPipeline() {
                return &Channels;.pipeline(
                        new TimeDecoder(),
                        new TimeClientHandler());
            }
        });</programlisting>
      <para>
        If you are an adventurous person, you might want to try the
        &ReplayingDecoder; which simplifies the decoder even more.  You will
        need to consult the API reference for more information though.
      </para>
      <programlisting>package org.jboss.netty.example.time;

public class TimeDecoder extends &ReplayingDecoder;<&VoidEnum;> {

    @Override
    protected Object decode(
            &ChannelHandlerContext; ctx, &Channel; channel,
            &ChannelBuffer; buffer, &VoidEnum; state) {

        return buffer.readBytes(4);
    }
}</programlisting>
      <para>
        Additionally, Netty provides out-of-the-box decoders which enables
        you to implement most protocols very easily and helps you avoid from
        ending up with a monolithic unmaintainable handler implementation.
        Please refer to the following packages for more detailed examples:
        <itemizedlist>
          <listitem>
            <para>
              <literal>org.jboss.netty.example.factorial</literal> for
              a binary protocol, and
            </para>
          </listitem>
          <listitem>
            <para>
              <literal>org.jboss.netty.example.telnet</literal> for
              a text line-based protocol.
            </para>
          </listitem>
        </itemizedlist>
      </para>

    <title>
      Speaking in POJO instead of ChannelBuffer
    </title>
    <para>
      All the examples we have reviewed so far used a &ChannelBuffer; as a
      primary data structure of a protocol message.  In this section, we will
      improve the TIME protocol client and server example to use a
      <ulink url="http://en.wikipedia.org/wiki/POJO">POJO</ulink> instead of a
      &ChannelBuffer;.
    </para>
    <para>
      The advantage of using a POJO in your &ChannelHandler; is obvious;
      your handler becomes more maintainable and reusable by separating the
      code which extracts information from &ChannelBuffer; out from the
      handler.  In the TIME client and server examples, we read only one
      32-bit integer and it is not a major issue to use &ChannelBuffer; directly.
      However, you will find it is necessary to make the separation as you
      implement a real world protocol.
    </para>
    <para>
      First, let us define a new type called <classname>UnixTime</classname>.
    </para>
    <programlisting>package org.jboss.netty.example.time;

import java.util.Date;

public class UnixTime {
    private final int value;

    public UnixTime(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    @Override
    public String toString() {
        return new Date(value * 1000L).toString();
    }
}</programlisting>
    <para>
      We can now revise the <classname>TimeDecoder</classname> to return
      a <classname>UnixTime</classname> instead of a &ChannelBuffer;.
    </para>
    <programlisting>@Override
protected Object decode(
        &ChannelHandlerContext; ctx, &Channel; channel, &ChannelBuffer; buffer) {
    if (buffer.readableBytes() < 4) {
        return null;
    }

    return new UnixTime(buffer.readInt());<co id="example.time5.co1"/>
}</programlisting>
    <calloutlist>
      <callout arearefs="example.time5.co1">
        <para>
          &FrameDecoder; and &ReplayingDecoder; allow you to return an object
          of any type.  If they were restricted to return only a
          &ChannelBuffer;, we would have to insert another &ChannelHandler;
          which transforms a &ChannelBuffer; into a
          <classname>UnixTime</classname>.
        </para>
      </callout>
    </calloutlist>
    <para>
      With the updated decoder, the <classname>TimeClientHandler</classname>
      does not use &ChannelBuffer; anymore:
    </para>
    <programlisting>@Override
public void messageReceived(&ChannelHandlerContext; ctx, &MessageEvent; e) {
    UnixTime m = (UnixTime) e.getMessage();
    System.out.println(m);
    e.getChannel().close();
}</programlisting>
    <para>
      Much simpler and elegant, right?  The same technique can be applied on
      the server side.  Let us update the
      <classname>TimeServerHandler</classname> first this time:
    </para>
    <programlisting>@Override
public void channelConnected(&ChannelHandlerContext; ctx, &ChannelStateEvent; e) {
    UnixTime time = new UnixTime(System.currentTimeMillis() / 1000);
    &ChannelFuture; f = e.getChannel().write(time);
    f.addListener(&ChannelFutureListener;.CLOSE);
}</programlisting>
    <para>
      Now, the only missing piece is the &ChannelHandler; which translates a
      <classname>UnixTime</classname> back into a &ChannelBuffer;.  It's much
      simpler than writing a decoder because there's no need to deal with
      packet fragmentation and assembly when encoding a message.
    </para>
    <programlisting>package org.jboss.netty.example.time;

import static org.jboss.netty.buffer.&ChannelBuffers;.*;

public class TimeEncoder extends &SimpleChannelHandler; {

    public void writeRequested(&ChannelHandlerContext; ctx, &MessageEvent;<co id="example.time6.co1"/> e) {
        UnixTime time = (UnixTime) e.getMessage();

        &ChannelBuffer; buf = buffer(4);
        buf.writeInt(time.getValue());

        &Channels;.write(ctx, e.getFuture(), buf);<co id="example.time6.co2"/>
    }
}</programlisting>
    <calloutlist>
      <callout arearefs="example.time6.co1">
        <para>
          An encoder overrides the <methodname>writeRequested</methodname>
          method to intercept a write request.  Please note that the
          &MessageEvent; parameter here is the same type which was specified
          in <methodname>messageReceived</methodname> but they are interpreted
          differently.  A &ChannelEvent; can be either an
          <firstterm>upstream</firstterm> or <firstterm>downstream</firstterm>
          event depending on the direction where the event flows.
          For instance, a &MessageEvent; can be an upstream event when called
          for <methodname>messageReceived</methodname> or a downstream event
          when called for <methodname>writeRequested</methodname>.
          Please refer to the API reference to learn more about the difference
          between a upstream event and a downstream event.
        </para>
      </callout>
      <callout arearefs="example.time6.co2">
        <para>
          Once done with transforming a POJO into a &ChannelBuffer;, you should
          forward the new buffer to the previous &ChannelDownstreamHandler; in
          the &ChannelPipeline;.  &Channels; provides various helper methods
          which generates and sends a &ChannelEvent;.  In this example,
          &Channels;<literal>.write(...)</literal> method creates a new
          &MessageEvent; and sends it to the previous &ChannelDownstreamHandler;
          in the &ChannelPipeline;.
        </para>
        <para>
          On the other hand, it is a good idea to use static imports for
          &Channels;:
          <programlisting>import static org.jboss.netty.channel.&Channels;.*;
...
&ChannelPipeline; pipeline = pipeline();
write(ctx, e.getFuture(), buf);
fireChannelDisconnected(ctx);</programlisting>
        </para>
      </callout>
    </calloutlist>
    <para>
      The last task left is to insert a <classname>TimeEncoder</classname>
      into the &ChannelPipeline; on the server side, and it is left as a
      trivial exercise.
    </para>

    <title>
      Shutting Down Your Application
    </title>
    <para>
      If you ran the <classname>TimeClient</classname>, you must have noticed
      that the application doesn't exit but just keep running doing nothing.
      Looking from the full stack trace, you will also find a couple I/O threads
      are running.  To shut down the I/O threads and let the application exit
      gracefully, you need to release the resources allocated by &ChannelFactory;.
    </para>
    <para>
      The shutdown process of a typical network application is composed of the
      following three steps:
      <orderedlist>
        <listitem>
          <para>
            Close all server sockets if there are any,
          </para>
        </listitem>
        <listitem>
          <para>
            Close all non-server sockets (i.e. client sockets and accepted
            sockets) if there are any, and
          </para>
        </listitem>
        <listitem>
          <para>
            Release all resources used by &ChannelFactory;.
          </para>
        </listitem>
      </orderedlist>
    </para>
    <para>
      To apply the three steps above to the <classname>TimeClient</classname>,
      <methodname>TimeClient.main()</methodname> could shut itself down
      gracefully by closing the only one client connection and releasing all
      resources used by &ChannelFactory;:
    </para>
    <programlisting>package org.jboss.netty.example.time;

public class TimeClient {
    public static void main(String[] args) throws Exception {
        ...
        &ChannelFactory; factory = ...;
        &ClientBootstrap; bootstrap = ...;
        ...
        &ChannelFuture; future<co id="example.time7.co1"/> = bootstrap.connect(...);
        future.awaitUninterruptibly();<co id="example.time7.co2"/>
        if (!future.isSuccess()) {
            future.getCause().printStackTrace();<co id="example.time7.co3"/>
        }
        future.getChannel().getCloseFuture().awaitUninterruptibly();<co id="example.time7.co4"/>
        factory.releaseExternalResources();<co id="example.time7.co5"/>
    }
}</programlisting>
    <calloutlist>
      <callout arearefs="example.time7.co1">
        <para>
          The <methodname>connect</methodname> method of &ClientBootstrap;
          returns a &ChannelFuture; which notifies when a connection attempt
          succeeds or fails.  It also has a reference to the &Channel; which
          is associated with the connection attempt.
        </para>
      </callout>
      <callout arearefs="example.time7.co2">
        <para>
          Wait for the returned &ChannelFuture; to determine if the connection
          attempt was successful or not.
        </para>
      </callout>
      <callout arearefs="example.time7.co3">
        <para>
          If failed, we print the cause of the failure to know why it failed.
          the <methodname>getCause()</methodname> method of &ChannelFuture; will
          return the cause of the failure if the connection attempt was neither
          successful nor cancelled.
        </para>
      </callout>
      <callout arearefs="example.time7.co4">
        <para>
          Now that the connection attempt is over, we need to wait until the
          connection is closed by waiting for the <varname>closeFuture</varname>
          of the &Channel;.  Every &Channel; has its own <varname>closeFuture</varname>
          so that you are notified and can perform a certain action on closure.
        </para>
        <para>
          Even if the connection attempt has failed the <varname>closeFuture</varname>
          will be notified because the &Channel; will be closed automatically
          when the connection attempt fails.
        </para>
      </callout>
      <callout arearefs="example.time7.co5">
        <para>
          All connections have been closed at this point.  The only task left
          is to release the resources being used by &ChannelFactory;.  It is as
          simple as calling its <methodname>releaseExternalResources()</methodname>
          method.  All resources including the NIO <classname>Selector</classname>s
          and thread pools will be shut down and terminated automatically.
        </para>
      </callout>
    </calloutlist>
    <para>
      Shutting down a client was pretty easy, but how about shutting down a
      server?  You need to unbind from the port and close all open accepted
      connections.  To do this, you need a data structure that keeps track of
      the list of active connections, and it's not a trivial task.  Fortunately,
      there is a solution, &ChannelGroup;.
    </para>
    <para>
      &ChannelGroup; is a special extension of Java collections API which
      represents a set of open &Channel;s.  If a &Channel; is added to a
      &ChannelGroup; and the added &Channel; is closed, the closed &Channel;
      is removed from its &ChannelGroup; automatically.  You can also perform
      an operation on all &Channel;s in the same group.  For instance, you can
      close all &Channel;s in a &ChannelGroup; when you shut down your server.
    </para>
    <para>
      To keep track of open sockets, you need to modify the
      <classname>TimeServerHandler</classname> to add a new open &Channel; to
      the global &ChannelGroup;, <varname>TimeServer.allChannels</varname>:
    </para>
    <programlisting>@Override
public void channelOpen(&ChannelHandlerContext; ctx, &ChannelStateEvent; e) {
    TimeServer.allChannels.add(e.getChannel());<co id="example.time8.co1"/>
}</programlisting>
    <calloutlist>
      <callout arearefs="example.time8.co1">
        <para>
          Yes, &ChannelGroup; is thread-safe.
        </para>
      </callout>
    </calloutlist>
    <para>
      Now that the list of all active &Channel;s are maintained automatically,
      shutting down a server is as easy as shutting down a client:
    </para>
    <programlisting>package org.jboss.netty.example.time;

public class TimeServer {

    static final &ChannelGroup; allChannels = new &DefaultChannelGroup;("time-server"<co id="example.time9.co1"/>);

    public static void main(String[] args) throws Exception {
        ...
        &ChannelFactory; factory = ...;
        &ServerBootstrap; bootstrap = ...;
        ...
        &Channel; channel<co id="example.time9.co2"/> = bootstrap.bind(...);
        allChannels.add(channel);<co id="example.time9.co3"/>
        waitForShutdownCommand();<co id="example.time9.co4"/>
        &ChannelGroupFuture; future = allChannels.close();<co id="example.time9.co5"/>
        future.awaitUninterruptibly();
        factory.releaseExternalResources();
    }
}</programlisting>
    <calloutlist>
      <callout arearefs="example.time9.co1">
        <para>
          &DefaultChannelGroup; requires the name of the group as a constructor
          parameter.  The group name is solely used to distinguish one group
          from others.
        </para>
      </callout>
      <callout arearefs="example.time9.co2">
        <para>
          The <methodname>bind</methodname> method of &ServerBootstrap;
          returns a server side &Channel; which is bound to the specified
          local address.  Calling the <methodname>close()</methodname> method
          of the returned &Channel; will make the &Channel; unbind from the
          bound local address.
        </para>
      </callout>
      <callout arearefs="example.time9.co3">
        <para>
          Any type of &Channel;s can be added to a &ChannelGroup; regardless if
          it is either server side, client-side, or accepted.  Therefore,
          you can close the bound &Channel; along with the accepted &Channel;s
          in one shot when the server shuts down.
        </para>
      </callout>
      <callout arearefs="example.time9.co4">
        <para>
          <methodname>waitForShutdownCommand()</methodname> is an imaginary
          method that waits for the shutdown signal.  You could wait for a
          message from a privileged client or the JVM shutdown hook.
        </para>
      </callout>
      <callout arearefs="example.time9.co5">
        <para>
          You can perform the same operation on all channels in the same
          &ChannelGroup;.  In this case, we close all channels, which means
          the bound server-side &Channel; will be unbound and all accepted
          connections will be closed asynchronously.  To notify when all
          connections were closed successfully, it returns a &ChannelGroupFuture;
          which has a similar role with &ChannelFuture;.
        </para>
      </callout>
    </calloutlist>

    <title>
      Summary
    </title>
    <para>
      In this chapter, we had a quick tour of Netty with a demonstration on how
      to write a fully working network application on top of Netty.  More
      questions you may have will be covered in the upcoming chapters and the
      revised version of this chapter.  Please also note that the
      <ulink url="&Community;">community</ulink> is always waiting for your
      questions and ideas to help you and keep improving Netty based on your
      feed back.
    </para>

</chapter>

redpajama_set_name: RedPajamaGithub


* [http://www.cse.ohio-state.edu/~bondhugu/pluto/ Pluto] - An automatic parallelizer and locality optimizer for multicores.
* [http://pluto-compiler.sourceforge.net/ Pluto] - An automatic parallelizer and locality optimizer for multicores.
* [[Scioto]] - A scalable taskpools framework for global address space programming models.
* [[Tensor Contraction Engine]] - An optimization system for quantum chemistry tensor equations.
* [[UTS]] - The Unbalanced Tree Search benchmark is an irregular parallel benchmark.
* [[PrimeTile]] - A parametric multi-level tiler for imperfect loop nests.
* [[Hybrid MPI+UPC]] - Hybrid parallel programming with MPI and Unified Parallel C.
* [[Polyhedral Compilation]] - Polyhedral Compilation projects.


text:
Supernatural Horror in Literature
by H. P. Lovecraft
The Apex of Gothic Romance
Horror in literature attains a new malignity in the work of Matthew Gregory Lewis (1775-1818), whose novel The Monk (1796) achieved marvellous popularity and earned him the nickname of "Monk" Lewis. This young author, educated in Germany and saturated with a body of wild Teuton lore unknown to Mrs. Radcliffe, turned to terror in forms more violent than his gentle predecessor had ever dared to think of; and produced as a result a masterpiece of active nightmare whose general Gothic cast is spiced with added stores of ghoulishness. The story is one of a Spanish monk, Ambrosio, who from a state of over-proud virtue is tempted to the very nadir of evil by a fiend in the guise of the maiden Matilda; and who is finally, when awaiting death at the Inquisition's hands, induced to purchase escape at the price of his soul from the Devil, because he deems both body and soul already lost. Forthwith the mocking Fiend snatches him to a lonely place, tells him he has sold his soul in vain since both pardon and a chance for salvation were apprroaching at the moment of his hideous bargain, and completes the sardonic betray by rebuking him for his unnatural crimes, and casting his body down a precipice whilst his soul is borne off forever to perdition. The novel contains appalling descriptions such as the incantation in the vaults beneath the convent cemetery, the burning of the convent, and the final end of the wretched abbot. In the sub-plot where the Marquis de las Cisternas meets the spectre of his erring ancestress, The Bleeding Nun, there are many enormously potent strokes; notably the visit of the animated corpse to the Marquis's bedside, and the cabbalistic ritual whereby the Wandering Jew helps him to fathom and banish his dead tormentor. Nevertheless The Monk drags sadly when read as a whole. It is too long and too diffuse, and much of its potency is marred by flippancy and by an awkwardly excessive reaction against those canons of decorum which Lewis at first despised as prudish. One great thing may be said of the author; that he never ruined his ghostly visions with a natural explanation. He succeeded in breaking up the Radcliffian tradition and expanding the field of the Gothic novel. Lewis wrote much more than The Monk. His drama, The Castle Spectre, was produced in 1798, and he later found time to pen other fictions in ballad form--Tales of Terror (1799), Tales of Wonder (1801), and a succession of translations from the German.
Gothic romances, both English and German, now appeared in multitudinous and mediocre profusion. Most of them were merely ridiculous in the light of mature tase, and Miss Austen's famous satire Northanger Abbey was by no means an unmerited rebuke to a school which had sunk far toward absurdity. This particular school was petering out, but before its final subordination there arose its last and greates figure in the person of Charles Robert Maturin (1782-1824), an obscure and eccentric Irish clergyman. Out of an ample body of miscellaneous writing which includes one confused Radcliffian imitation called The Fatal Revenge; or, The Family of Montorio (1807), Maturin at length evolved the vivid horror-masterpiece of Melmoth the Wanderer (1820), in which the Gothic tale climbed to altitudes of sheer spiritual fright which it had never known before.
Melmoth is the tale of an Irish gentleman who, in the seventeenth century, obtained a preternaturally extended life from the Devil at the price of his soul. If he can persuade another to take the bargain off his hands, and assume his existing state, he can be saved; but this he can never manage to effect, no matter how assiduously he haunts those whom despair has made reckless and frantic. The framework of the story is very clumsy; involving tedious length, digressive episodes, narratives within narratives, and laboured dovetailing and coincidences; but at various points in the endless rambling there is felt a pulse of power undiscoverable in any previous work of this kind--a kinship to the essential truth of human nature, an understanding of the profoundest sources of actual cosmic fear, and a white heat of sympathetic passion on the writer's part which makes the book a true document of aesthetic self-expression rather than a mere clever compound of artifice. No unbiassed reader can doubt that with Melmoth an enormous stride in evolution of the horror-tale is represented. Fear is taken out of the realm of the conventional and exalted into a hideous cloud over mankind's very destiny. Maturin's shudders, the work of one capable of shuddering himself, are of the sort that convince. Mrs. Radcliffe and Lewis are fair game for the parodist, but it would be difficult to find a false note in the feverishly intensified action and high atmospheric tension of the Irishman whose less sophisticated emotions and strain of Celtic mysticism gave him the finest possible natural equipment for his task. Without a doubt Maturin is a man of authentic genius, and he was so recognised by Balzac, who grouped Melmoth with Molière's Don Juan, Goethe's Faust, and Byron's Manfred as the supreme allegorical figures of modern European literature, and wrote a whimsical piece called "Melmoth Reconciled", in which the Wanderer succeeds in passing his infernal bargain to a Parisian bank defaulter, who in turn hands it along a chain of victims until a revelling gambler dies with it in his possession, and by his damnation ends the curse. Scott, Rossetti, Thackeray, and Baudelaire are the other titans who gave Maturin their unqualified admiration, and there is much significance in the fact that Oscar Wilde, after his disgrace and exile, chose for his last days in Paris the assumed name of "Sebastian Melmoth".
Melmoth contains scenes which even now have not lost their power to evoke dread. It begins with a deathbed--an old miser is dying of sheer fright because of something he has seen, coupled with a manuscript he has read and a family portrait which hangs in an obscure closet of his centuried home in County Wicklow. He sends to Trinity College, Dublin, for his nephew John; and the latter upon arriving notes many uncanny things. The eyes of the portrait in the closet glow horribly, and twice a figure strangely resembling the portrait appears momentarily at the door. Dread hangs over the house of the Melmoths, one of whose ancestors, "J. Melmoth, 1646", the portrait represents. The dying miser declares that this man--at a date slightly before 1800--is alive. Finally the miser dies, and the nephew is told in the will to destroy both the portrait and the manuscript to be found in a certain drawer. Reading the manuscript, which was written late in the seventeenth century by an Englishman named Stanton, young John learns of a terrible incident in Spain in 1677, when the writer met a horrible fellow-countryman and was told of how he had stared to death a priest who tried to denounce him as one filled with fearsome evil. Later, after meeting the man again in London, Stanton is cast into a madhouse and visited by the stranger, whose approach is heralded by spectral music and whose eyes have a more than mortal glare. Melmoth the Wanderer--for such is the malign visitor--offers the captive freedom if he will take over his bargain with the Devil; but like all others whom Melmoth has approached, Stanton is proof against temptation. Melmoth's description of the horrors of a life in a madhouse, used to tempt Stanton, is one of the most potent passages of the book. Stanton is at length liberated, and spends the rest of his life tracking down Melmoth, whose family and ancestral abode he discovers. With the family he leaves the manuscript, which by young John's time is sadly ruinous and fragmentary. John destroys both portrait and manuscript, but in sleep is visited by his horrible ancestor, who leaves a black and blue mark on his wrist.
Young John soon afterward receives as a visitor a shipwrecked Spaniard, Alonzo de Monçada, who has escaped from compulsory monasticism and from the perils of the Inquisition. He has suffered horribly--and the descriptions of his experiences under torment and in the vaults through which he once essays escape are classic--but had the strength to resist Melmoth the Wanderer when approached at his darkest hour in prison. At the house of a Jew who sheltered him after his escape he discovers a wealth of manuscript relating other exploits of Melmoth, including his wooing of an Indian island maiden, Immalee, who later comes to her birthright in Spain and is known as Donna Isidora; and of his horrible marriage to her by the corpse of a dead anchorite at midnight in the ruined chapel of a shunned and abhorred monastery. Monçada's narrative to young John takes up the bulk of Maturin's four-volume book; this disproportion being considered one of the chief technical faults of the composition.
At last the colloquies of John and Monçada are interrupted by the entrance of Melmoth the Wanderer himself, his piercing eyes now fading, and decrepitude swiftly overtaking him. The term of his bargain has approached its end, and he has come home after a century and a half to meet his fate. Warning all others from the room, no matter what sounds they may hear in the night, he awaits the end alone. Young John and Monçada hear frightful ululations, but do not intrude till silence comes toward morning. They then find the room emtpy. Clayey1footprints lead out a rear door to a cliff overlooking the sea, and near the edge of the precipice is a track indicating the forcible dragging of some heavy body. The Wanderer's scarf is found on a crag some distance below the brink, but nothing further is ever seen or heard of him.
Such is the story, and none can fail to notice the difference between this modulated, suggestive, and artistically moulded horror and--to use the words of Professor George Saintsbury--"the artful but rather jejune2rationalism of Mrs. Radcliffe, and the too often puerile extravagance, the bad taste, and the sometimes slipshod style of Lewis." Maturin's style in itself deserves particular praise, for its forcible directness and vitality lift it altogether above the pompous artificialities of which his predecessors are guilty. Professor Edith Birkhead, in her history of the Gothic novel, justly observes that "with all his faults Maturin was the greatest as well as the last of the Goths." Melmoth was widely read and eventually dramatised, but its late date in the evolution of the Gothic tale deprived it of the tumultuous popularity of Udolpho and The Monk.
clayey: muddy
jejune: dull
Return to the Supernatural Horror in Literature Summary Return to the H. P. Lovecraft Library


text:
Home»Reviews»Manhunter [1986] Review – An Incredibly Stylized and Atypical Take on the 'Hannibal Lecter' Novel
Manhunter [1986] Review – An Incredibly Stylized and Atypical Take on the 'Hannibal Lecter' Novel
Arun Kumar 2020-02-17
Arun Kumar / March 16, 2020 / 0 / 5.2k
Michael Mann's Manhunter (1986), based on Thomas Harris' 1981 novel Red Dragon, was the first of several crime thrillers to feature the popular on-screen psychopath, Hannibal Lecter. Brian Cox plays Hannibal Lecter (what you may call as an extended cameo) in an interestingly mundane manner, compared to Anthony Hopkins ('The Silence of the Lambs', 'Hannibal', 2002 remake of 'Red Dragon') and Mads Mikkelson's (Hannibal series, 2013-2015) menacing and measured rendition of the erudite psychiatrist villain.
Mr. Mann's stylistically superior version hints at the psychological undercurrents of the ongoing conflict between the gifted forensic investigator, Will Graham and the unblinking Hannibal Lecter (spelled 'Lecktor' in Mann's version) confined to a sterile, white cell. There are no elaborate build-ups, no dungeons, and most importantly the main antagonist ('The Tooth Fairy') is more complex (a monster as well as a victim) than Jonathan Demme's stereotypical depiction of 'Buffalo Bill' in The Silence of the Lambs.
Mann's screenplay for Manhunter follows the same structure as the source novel, although he leaves out some backstories that may deepen our understanding of the characters' interiority. Nevertheless, Mann's brilliant aesthetics and attention to detail provide window into the characters' miseries and incertitudes. Manhunter could be termed as a psychological neo-noir (like his 1983 heist flick, Thief) than a crime thriller since Mann keenly follows Will Graham's (William Petersen) torturous journey into the mind of a serial-killer, comprehending his implacable fixations. Moreover, Mann's direction might lack the (entertaining) theatricality of the later adaptations of Thomas Harris' novels, which is actually a good thing because here the normality and psychopathy exists in the same plane, separated by fragile boundaries, whereas usually in serial-killer films (including Silence of the Lambs) the psychosis is depicted as simply aberrant and otherworldly in nature.
Related to Manhunter (1986): Psycho [2020] – A Very Problematic and Insipid Take on the Serial-Killer Narrative
Manhunter opens with Graham enjoying his retirement from the bureau in a bright, beach town with his wife Molly (Kim Greist) and 10-year-old son Kevin. Graham is known for solving difficult cases by completely immersing himself into the killer's subjectivity. Although Graham is blessed with greater feelings of empathy unlike the serial-killers he hunts down, the gift has left him under trauma. Particularly, his recent encounter with the maniacal cannibal Hannibal Lecter (a very low-key Brian Cox) has pushed Graham to early retirement. But FBI chief Jack Crawford (Dennis Farina) is very desperate to get back his gifted protégé on the job of hunting down a cryptic, dangerous killer. Two families in Atlanta and Birmingham were brutally murdered at their home (including the children) and so far no clues. Dubbed as 'Tooth Fairy' by the media, the killer operates on the full-moon day.
Crawford promises Graham that his name won't come out. He just has to provide the killer's psychological profile that may help them in nabbing him. Graham stalks the victims' houses, attempting to discern the human predator's motives, frustrations, and passions. To better tap into the psyche of the killer, Graham voluntarily seeks the help of now-imprisoned Hannibal Lector. The devious Hannibal sets off a chain of events that only deepens Graham's involvement in the case and even puts his family in the path of danger. By Manhunter's third act, Mann jumps to the portrayal of the killer named Dollarhyde (Tom Noonan), a strange man who is both pitiable and monstrous.
Earlier in Manhunter, Mann symbolically hints at the thin barriers separating the tortured soul of Will Graham from sociopaths like Hannibal and Tooth Fairy. Graham and his son Kevin are seen erecting a barrier to save the turtle eggs from the crabs. He tells his son that the fragile-looking thing may save the new-born turtles. It foretells the traumatized Graham's course of action to protect the vulnerable (he eventually saves a person who is physically vulnerable). Much of the tension in the film comes from the anticipation of violence and doom. In fact, for a serial-killer narrative Manhunter features very few violent sequences.
Also Read: Vengeance Is Mine [1979] — An Ominous Remainder of the Darkest Corners of Human Mind
Mann's expressive mise-en-scene (constructed in collaboration with cinematographer Dante Spinotti) of mirror imagery alludes to the narrative's predominant visual motif related to the acts of seeing and searching (at one point, Graham reflects: "Everything you see is with you. Your primary sense of intake is seeing, reflections, mirrors, images. That makes your dream life – in seeing…"). The power of seeing kindles the villain's desire for gross fantasy and provides the protagonist with a link deep into the killer's mental state. And it's fascinating to see how Graham eventually crashes into the glass to directly confront Dollarhyde, signaling the collapse of the antagonist's 'vision'.
Manhunter doesn't just remain as a masterclass in style. Mann handles the emotional dimensions equally well. William Petersen's Will Graham perfectly conveys the emotionality of a man surviving traumatic experience. The scene Graham explains his torment to his son is beautifully written. The introspective and moody Graham without breaking out of his character describes to Kevin his mental collapse. Tom Noonan does a good job in portraying the fractured and unhinged soul of Dollarhyde. Portrayed as a victim of society, the ambiguity attached to Dollarhyde is touched in the scene when Crawford questions Graham, "Are you sympathizing with this guy?", to which Graham replies, "Absolutely. My heart bleeds for him as a child….At the same times as an adult, he's irredeemable. He butchers whole families to pursue trivial fantasies…"
Overall, Manhunter (1986) [120 minutes] is a considerably subtle, low-key psychological thriller that's devoid of the operatic staging found in the later on-screen interpretations of Thomas Harris' famous crime novels.
Manhunter (1986) Trailer
Manhunter Links: IMDb, Rotten Tomatoes
Tags:1986Brian CoxCrimeDante SpinottiDennis FarinaDramaHannibalHannibal LecterJoan AllenKim GreistManhunterMichael MannRed DragonSerial KillerSilence of the LambsThomas HarrisThrillerTom NoonanWilliam Petersen
5 Horse Racing Movies That Should Not Be Missed
Robibaar (On a Sunday) [2019] Review: A One Day Journey of Estranged Lovers
Pramit Chatterjee
Reubyn Coutinho