There's something rather majestic about seeing your community from high above. Your eyes cannot help but trace the familiar streets and admire well-known structures and landmarks from a unique perspective.
Genevans were treated to this in 1869 with the creation of Bird's Eye View of Geneva, expertly rendered by renowned city view artist Albert Ruger. The beauty and accuracy of the work has left generations of admirers wondering just how Ruger was able to capture such an image of Geneva from over 1,000 feet in the air in the days before manned flight.
On the bottom border of the 1869 Bird's Eye View of Geneva map, Ruger also included four larger details of buildings. One was the Kane County Courthouse built in 1856 and destroyed by fire in 1890.
The truth is, he never left the ground throughout the image's creation.
Like other city view artists, the Prussian-born Ruger made a painstaking study of the town by walking the streets, taking notes and drawing sketches of building exteriors. Based on that information, the artist used his imagination as he first drew the network of Geneva roads that framed every city block.
Referring to his sketches, Ruger then redrew every building as accurately as possible. Finally, he added life to his work by adding the hustle and bustle of tiny people on the go, horses and carriages in the street, boats in the Fox River, and an east-bound train headed for Chicago.
It is estimated that his iconic work was completed in under a week.
Photograph of the 1856 Kane County Courthouse, circa 1889.
Ruger was also deliberate in his vantage point. He chose to view Geneva from the southeast, thereby capturing the beauty of the River, the economic importance of the railroad, and the breathtaking expanses of open land that surrounded the town.
In short, Ruger's work was an advertisement of the seemingly limitless potential of Geneva and the Fox River Valley.
Ruger was frequently requested by towns throughout the Midwest to make a bird's eye view of their own communities. In 1869 alone, the year that he drew Geneva, Ruger would go on to create a total of 62 city views, including one of Batavia.
Throughout his 25-year career, Ruger would draw more than 250 aerial images.
Detail of an east bound train from the 1869 Bird's Eye View of Geneva map drawn by Ruger.
It goes without saying that contemporary mapmakers possess many more advantages than Ruger and his 19th-century imagination. Still, the ingenuity and artistry of Ruger continues to impress and inspire engineers and surveyors today.
Geneva's very own Rempe-Sharpe & Associates, Inc. is no exception to that rule. Beginning in 1918 as the Wells Engineering Company, Rempe-Sharpe has developed into an award-winning engineering firm, recently receiving a National Award for Engineering Excellence by the American Public Works Association.
As a celebration of the 150th anniversary of Bird's Eye View of Geneva, Jim Bibby of Rempe-Sharpe will present "The Art of Mapmaking" at noon Tuesday, March 12.
During the Brown Bag Program, Bibby will discuss the evolution of early mapmaking. This is a program that map enthusiasts will not want to miss!
Admission for this program is $5/person or $3/Museum member and includes entry to exhibition galleries. Please register at www.GenevaHistoryMuseum.org or call 630-232-4951.


For the next month the California coast will be hit by high tides called "king tides." This annual occurrence is the result of the gravitational pull between the sun and the moon. I took this shot of Carmel Beach right before sunset yesterday. Note how the tides have carved a ravine out of the beach-. The tides will be at their highest tomorrow when the moon is full. People are asked to take photos to get an idea of how the coast will look as the result of climate change.


text:
Art, Urban Change, and the Public Sphere
NTU Centre for Contemporary Art Singapore (NTU CCA Singapore)
Above: (1) Zulkifle Mahmod, performance, Mapletree Business City II, Singapore, 2017. (2) Discursive Picnic, Archifest, Mapletree Business City II, Singapore, 2017. (3) Art, Urban Change, and the Public Sphere, The Lab, NTU CCA Singapore, 2019, installation view. (4) Culture City. Culture Scape. Public Art Trail artworks, Mapletree Business City II. Clockwise from top left: Dan Graham, Elliptical Pavilion, 2017. Zulkifle Mahmod, Sonic Pathway, 2017. Tomás Saraceno, Stillness in Motion, 3 Airborne Dwellings, 2017. Yinka Shonibare CBE (RA), Wind Sculpture, 2013. All images courtesy NTU CCA Singapore.
NTU Centre for Contemporary Art Singapore
Gillman Barracks
43 Malan Road
ntu.ccasingapore.org
NTU CCA Singapore is pleased to present Art, Urban Change, and the Public Sphere, which engages with art in privately owned public spaces through a Public Art Education Summit and research presentation. Taking as its point of departure the neighbouring Culture City. Culture Scape. Public Art Trail at Mapletree Business City—developed with curatorial consultation by NTU CCA Singapore—the presentation and Summit explore broader cultural and artistic developments on a civic scale situated in urban landscapes. How do political and economic changes in the public realm evoke a regional discourse on art in cities?
Public Art Education Summit
NTU CCA Singapore
The Public Art Education Summit is the first of its kind in Singapore and part of a larger engagement of NTU CCA Singapore in professional education of public art. It focuses on cultural place-making and building communities through artistic practices. It aims to stimulate a debate between art professionals, policy makers, urban developers and other local stakeholders, on how and for whom art creates public spaces in our built environment. Any artistic or curatorial initiative in "public space" must address the question of how to construct "a public" and with it, how to encounter identity. Any difference—be it regional and local, ethnic and religious, economic and social—generates its own cohabitation of urban space and public culture to communicate with. The challenge for art in the public sphere lies in its openness to existing and yet, imagined communities of civic urbanism. Ranging from corporate cultural engagement in privately owned public spaces to urban regeneration, the invited speakers draw connections to the beginnings of community engagement in public art with its fluid methods. Furthermore, they suggest a critical look at different artistic and curatorial practices which reflect on "artists as citizens." Or, how any space called public, first and foremost, is created by the different people inhabiting that space.
With contributions by: Ute Meta Bauer (Germany/Singapore), Richard Bell (Australia), Lewis Biggs (UK), Amanda Crabtree (UK/France), Daniel Mudie Cunningham (Australia), Catherine David (France), Elvira Dyangani Ose (Spain/UK), Sophie Goltz (Germany/Singapore), Kok Heng Leun (Singapore), Hongjohn Lin (Taiwan/Singapore), Massamba Mbaye (Senegal), Nikos Papastergiadis (Australia), Jasmeen Patheja (India), Milenko Prvački (Ex-Yugoslavia/Singapore), Katherine Ann Leilani Tuider (US), Ashley Thompson (UK), Wang Dawei (China), et al.
In association with College of Fine Arts, Shanghai University and Institute for Public Art, London. Supported by Mapletree Investments and, additionally, by Public Art Trust, an initiative of National Arts Council, Singapore.
Research Presentation
NTU CCA Singapore, The Lab
August 31–October 27, 2019
Center-staged at The Lab, the making of the Public Art Trail at Mapletree Business City highlights the permanent works by international renowned artists Dan Graham (US), Zulkifle Mahmod (Singapore), Tomás Saraceno (Argentina/Germany) and Yinka Shonibare CBE (RA) (Nigeria/UK). Animated through augmented reality (AR) in a panorama-like spatial design, the artistic practices and processes are introduced. Entitled Culture City. Culture Scape., both the Public Art Trail and Public Art Education Programme (since 2017) go beyond mere artistic interpretation and audience engagement. Furthermore, it raises questions on art, urban change, and the public sphere, that not only open up a perspective on the complexities involved in public art, but also how any space called public, first and foremost, is created by the different people inhabiting the space.
Public programme with Singaporean Artists
Reloaded, Art in Public Space in Singapore
In Conversation: Priyageetha Dia and Seelan Palay
With guided tours of The Lab and Public Art Trail at Mapletree Business City
October 26, 2019, 3:30pm
Looking Back Forward with Public Art
In Conversation: Speak Cryptic and Robert Zhao
Art, Urban Change, and the Public Sphere is organised by: Sophie Goltz, Deputy Director Research and Academic Programmes and Assistant Professor, School of Art, Design and Media, NTU; Clifford Loh, Project Manager, External Collaborations (till 08.2019); Guineviere Low, Young Professional Trainee, Research and Academic Programmes; Soh Kay Min, Executive, Conference, Workshops & Archive; Leon Tan, Project Manager, External Collaborations.
For further information and detailed programme of Art, Urban Change, and the Public Sphere, please see www.ntu.ccasingapore.org, for more information on Culture City. Culture Scape., please see www.mapletreearts.sg
About NTU CCA Singapore
A leading international art institution, NTU CCA Singapore is a platform, host and partner creating and driven by dynamic thinking in its three-fold constellation: Exhibitions; Residencies Programme; Research and Academic Education. A national research centre for contemporary art of Nanyang Technological University, the Centre focuses on Spaces of the Curatorial. It brings forth innovative and experimental forms of emergent artistic and curatorial practices that intersect the present and histories of contemporary art embedded in social-political spheres with other fields of knowledge.
About Nanyang Technological University
A research-intensive public university, NTU has 33,000 undergraduate and postgraduate students in the colleges of Engineering, Business, Science, and Humanities, Arts and Social Sciences, and its Graduate College. NTU's campus is frequently listed among the top 15 most beautiful university campuses in the world and has 57 Green Mark-certified (equivalent to LEED-certified) buildings. Besides its 200-ha lush green, residential campus in western Singapore, NTU has a second campus in the heart of Novena, Singapore's medical district.
About Mapletree-NTU CCA Singapore
This unique and pioneering collaboration between Mapletree Investments Pte Ltd and NTU CCA Singapore is focused on education on art in public spaces, and features a series of public art installations, as well as a Public Art Education Programme at Mapletree Business City II to bring the arts closer to a variety of communities.
NTU Centre for Contemporary Art Singapore, Singapore
Research and academic programmes 2019
Seeking Deputy and Assistant Directors
Topical seminars: Trees of Life – Knowledge in Material

redpajama_set_name: RedPajamaCommonCrawl


The third and final part of the Kicker Sportmagazin summer 2016 rankings has been released, unveiling the best in the categories of offensive winger, strikers and Germans playing abroad.
A reminder of the ranking criteria: A player is evaluated not based on his potential or his career achievement but on the performances from the 1st of January till the 10th of July (Euro final), receiving a minimum of nine grades for games played in the Bundesliga, DFB-Pokal, Europe or internationals. The evaluation is also based on the position he held the most over that same period.
When a club like Manchester United pays 42m Euros for a player who has only one year remaining on his contract, this means he has been doing a great job. Henrikh Mkhitaryan had a combined total of 55 goals and assists in all three competitions he disputed this past season; his vision, technical finesse, distilled passing, versatility and deadly finish did not go unnoticed.
Franck Ribéry makes his comeback in the rankings after an 18-month absence due to injury. His experience still speaks volume, and showed he still belongs to the elite of Bundesliga players.
Brandt was involved in eleven goals since the restart; he demonstrated with his ball control, great technique and good shots from outside the area that his potential is unlimited. Reus shone in the Europa League, but less so in the Bundesliga; his two appearances with the Mannschaft were appalling, and his absence at the Euro did not help. Draxler was off to a slow start before picking up late in the season, compensated with a place in the starting eleven against France in the Euro.
Costa could not confirm his form seen in the first-half of the season; coming often second best in one-on-ones, and lacking composure in front of goal. Commiserations for Robben: The absence of the Orange at the Euro not only forced him to watch the competition from home, but also denied him of one "graded" game that would have helped him make the cut; he was the best noted Bundesliga player in his position.
There was a long debate in the pressroom as to whether Robert Lewandowski should be retained in the World Class category. He had his critics at the Euro because of the low number of goals produced. But an expert would recognized he was aligned alongside Milik in the Polish attach, playing in a deeper position compared FC Bayern where he occupies the role of the sole striker up front.
Pierre-Émerick Aubameyang could not replicate his "World Class" display from the prior half of season because of the low number of goals, mainly in the Bundesliga with only seven. Claudio Pizarro showed he is still a phenomenal class act at the age of 37; his 12 goals were the guarantee of Bremen staying up.
Raffael is an artist of a player who can destabilize a defense with one genial quick action. Wagner confirmed his role as focal point with Darmstadt; his ten goals and three assists ensuring survival. Schürrle lacked consistency but his nine goals towards the end of the season lifted him up the table.
He is capable of influencing and changing the rhythm of a game, and detecting situations and opportunities to make them decisive, as seen in the Champions League and at the Euro. His absence easily affects his attacking colleagues of Real Madrid and the Mannschaft. That's why all managers he had worked under appreciate him.
Rüdiger overcame is adaptation period at Roma and reduced his rate of mistakes; a great hope for the future if he could get rid of his occasional foolishness. Huth does not represent what a modern defender looks like but his physical presence winning every ball in the air helped surprise package Leicester win the Premier League.
Podolski was one of the few positive signs in a weak Galatasaray season; his winning cup final goal saved their season, going as an immortal in the history of the club. Klose showed Lazio all his qualities; his seven goals and six assists helping them end in decent Serie-A position. No place for Schweinsteiger: His double inner ligament injuries prevented him of any action with Manchester United; his appearances at the Euro were not enough to earn him a mention.
Have Dortmund made the Bundesliga a duopoly?


Edmonton Eskimos' Kenny Stafford drinks from the Grey Cup following his teams win over the Ottawa Redblacks at the 103rd Grey Cup in Winnipeg, Man., Sunday, Nov. 29, 2015.
Kenny Stafford keeps coming back to the Edmonton Eskimos.
The 27-year-old international receiver has agreed to a one-year contract with the Eskimos for the 2018 season.
"I'm comfortable here, I feel like it's home," said Stafford, who elected to stay in Edmonton most of this off-season instead of returning to his home in Florida.
It will be Stafford's sixth CFL season and third with the Green and Gold. He's looking forward to another year in Edmonton.
Because of all that, Stafford feels he will be much more productive. He played in five games for the Eskimos last season, with 20 receptions for 265 yards and two touchdowns.
The Columbus, OH native first landed in Edmonton in 2015 when he was traded from Montreal for Fred Stamps. That was easily the best year of his career as he helped the Eskimos to the 2015 Grey Cup, collecting 732 yards and nine touchdowns along the way.
Stafford opted for free agency that off-season and returned to Montreal for 2016 — only to be released late in the year.
Winnipeg signed Stafford to start last season, but he was released by the Blue Bombers at the end of training camp, only to re-join the Eskimos later that same day.
Already a free agent, Stafford had talked with other teams, but the only contract offer he got was from the Eskimos and that was just fine with him.
WATCH BELOW: Global Edmonton's Quinn Phillips has some rapid fire questions for Kenny Stafford, who also turns the mic on Quinn.
Stafford has played 46 CFL games with 1,479 yards in receiving and 14 TDs. He'll be in the mix to replace Brandon Zylstra, who has left for the NFL.
The Eskimos also announced Thursday the signing of international defensive back Ahmad Dixon. He played in one game with the Eskimos in 2017.


text:
Halt Lawyer Directory | October 14, 2020 | 0 Comments
How To File A Claim Against Royal Caribbean
Royal Caribbean is one of the world's most popular cruise lines. With thousands of people on board each ship and amusement park-like attractions for passenger entertainment, there are plenty of opportunities for injury. No one goes on vacation planning to sustain a life-altering injury, but they are a risk onboard cruise ships. If you have been injured on a Royal Caribbean ship, you should know how to pursue legal action and claims for your injuries.
Cruise Ship Accidents and Injuries
Modern cruise ships like to keep things fun and innovative for passengers, but unfortunately, some of the unique activities they offer come with a significant risk of injury. With attractions such as trampolines, waterslides, and even skydiving, passengers who partake in these activities run the risk of incurring unexpected and potentially severe injuries.
Even if you avoid all the riskier activities, cruise ships are the perfect breeding ground for all kinds of injuries to happen. Wet floors and stairs can cause slip and fall injuries. Slips and falls can also happen near pools and similar water features, in addition to the possibility of drowning accidents. Unfortunately, falling overboard is not an uncommon occurrence either. Passengers may also fall victim to food poisoning or virus outbreaks, which spread rapidly in enclosed environments where people are tightly packed together, such as cruise ships. The sheer number of passengers and crew onboard also raises the danger of physical altercations, assault, and injuries at the hands of other passengers or crew.
Unfortunately, a ship at sea is not the ideal place for proper medical assistance should you require it, and severe injuries will find the onboard medical resources sorely lacking.
Filing Restrictions and Maritime Law
The nature of cruise ship operations means they are subject to maritime laws, which means there are differences from a typical personal injury case. Maritime law holds that a ship is subject to the laws of the country it is registered in, which for tax and other reasons, is almost never the United States or any other homeport country whose laws passengers might assume protect them.
Cruise ships have been flying "flags of convenience" since the days of Prohibition to skirt U.S. laws and regulations. This means most ships are flagged in, and therefore subject to the laws of, countries such as the Bahamas, Panama, Bermuda, and Malta. This, naturally, leads to cruise lines flocking to register in those countries where safety, labor, and environmental regulations are the least stringent.
Your purchase of a Royal Caribbean cruise ticket amounts to a legal contract with the cruise line which bars you from pursuing injury claims except in specifically outlined circumstances such as negligence or intent to harm. The cruise line also places restrictions on where, how, and when you can file a claim.
If you wish to file a claim against Royal Caribbean, there are many complex and confusing laws and regulations by which you must abide. For instance, you are required to file a claim within six months of any injury or death, and it must be filed at Royal Caribbean's headquarters in Miami, which may be problematic for you if you don't live in the area.
For these and other reasons, it is advisable to hire an experienced maritime attorney such as Lipcon, Margulies, Alsina & Winkleman, PA to pursue any claim against Royal Caribbean. These lawyers have the experience and knowledge to guide you through your claim and pursue any remedies that may be available to you.
Share This Post: facebook twitter linkedin google pinterest
Attorney Client
Business & Employment
Court & Alternatives
Debt Consolidation Lawyer
Disability Lawyer
Division of Marital Assets
Drug Attorneys
DWI Attorney
Esports Lawyer
Eviction Lawyers
Gambling Legalization
Gun Rights Lawyer
IRS Tax Attorney
Law Firm Web Design
Marketing for Lawyers
Minneapolis Lawyers
Probation and Parole
Timeshare Law
Weird Laws


text:
17 notable Trinbagonians whose deaths rocked us in 2017
Ricqcolia Phillip Created : 31 December 2017 T&T News
The last year struck all of us a hard blow, with numerous notable Trinis who left a mark on the country passing away. It was a particularly difficult for many in the media and entertainment industry.
Let's take a look at 17 notable Trinbagonians who left us this year:
Dr. Giselle Rampaul
The UWI lecturer died in February after experiencing complications while undergoing surgery. Her work and contributions to the world of literature was immense. In addition to teaching Literature at the University, she published on the intersections between British and Caribbean literature and was working on a monograph on Shakespeare in the Caribbean. She was also the founder and producer of The Spaces between Words: Conversations with Writers podcast series.
She played integral roles in organising literary events such as the annual Campus Literature Week, the Literatures in English Open Day for secondary school students, the 30th Annual Conference on West Indian Literature in 2011 as well as the International Cultural Studies Conference "First They Must Be Children": The Child and the Caribbean Imagi/Nation.
Deborah John
Former Trinidad Express journalist Deborah John died in August after a long battle with cancer. Her death was a striking blow for the Trinidad Express family who, just the year before, mourned the death of Express Woman Editor Angela Martin Hinds.
Tony Voisin
Legendary guitarist Tony Voisin died in May following a long illness. As the nephew of the late parang queen Daisy Voisin, he was known for his distinctive sound, influencing generations of musicians. His work appeared on a range of albums and singles such as the late Mighty Duke's 21st Century Man, Gabby's 'Til Now, Gillo's Ban Fai, Raw Kaiso Volumes One and Two and Big Up, the Grammy-nominated album by British reggae group Aswad.
Anand Yankarran
Yankarran died in January from a suspected heart attack. He was known as a cultural icon for his work in promoting Indian culture both locally and internationally. He is also considered as a pioneer in Indian Classical and Chutney music especially in promoting Indian Culture across the world with his breakout hit, 'Nanda Baba' in 1989.
Chef Raymond Joseph
Chefs, foodies and those in the food industry said goodbye to celebrated Chef Raymond Joseph who died from cancer in July.Joseph was the Head Chef at the Courtyard by Marriott in Port of Spain for eight years. He also led the National Culinary Team which took part in the highly prestigious "Taste of the Caribbean"
Edmond Hart
Veteran mas man Edmond Hart died in September after falling ill. He was 94 years old. Hart founded Harts Carnival in 1960. The band's first band of the year (one of many) came in 1966 with the presentation Playing Cards.
Devon Matthews
DJ and singer Devon Matthews died in July after performing at TRIBE band launch. He'd collapsed backstage and an autopsy later confirmed that he'd died of a heart attack. Just earlier that day, Matthews had shot scenes for the music video of his hit song "D Journey" with Ella Andell. Earlier this year, he placed third at Soca Monarch and Young Kings for the track.
Carlet Holder
Holder was diagnosed with Lupus and lost her battle with the disease on the same day as Devon Matthews. She worked at various media houses including Reuters, Synergy TV and the Government Information Services Ltd (GISL).
Comedian Peter Joseph died in late December, days before Christmas. He experiencing heart problems just before his death. He was known for appearing in numerous local comedy shows over the last 15 years. In addition to being a celebrated comedian, he was also an emcee and writer.
Brigo
Calypso icon Samuel 'Lord Brigo' Abraham has died after suffering from Alzheimer's disease. He began singing in the 1960s is known for his calypsoes such as Mama Popo; Limbo Break; Do So Ent Like So; Obey; Walking in the Dark; After Carnival and Voodoo Man.
He became famous for performing a number of ingenious compositions and for his ability to contort his face to emphasize the story in his songs. He was also famous for his comedic role in numerous commercials for 'Det' insecticide.
Angelo Bissessarsingh
Local historian Angelo Bissessarsingh lost his long battle with pancreatic cancer in February. Known for his riveting Trinidad Guardian columns about various aspects of our history, Bissessarsingh was initially diagnosed with pancreatic cancer in 2015 and was given two months to live.
He was the founder of the Virtual Museum of Trinidad and Tobago heritage resource and published several books titled Walking with the Ancestors—The Historic Cemeteries of Trinidad, Snapshots of the History of Trinidad and Tobago, Virtual Glimpses into the Past, and Pancho's Dilemma.
Nazimool Khan
Well-known East Indian singer, Nazimool Khan died in August. Khan was well-known for his contributions to East Indian music and culture in Trinidad and Tobago. Khan made his debut in public singing in 1976 when he entered the Mastana Bahar Competition, making it to the Grand Finals in 1986. He toured internationally with his sister Ruby Gupter-Khan and the Acme Dil-E-Nadan Orchestra, also touring with the BWIA National Indian Orchestra.
Gitta Dan
Gospel music icon Denton Peschier, better known as Gitta Dan died in October after ailing with an undisclosed illness. He was considered to an inspiration to the country's youth.
Former Chairman of State-owned oil company Petrotrin, Malcolm Jones died in August after ailing for some time.
He was appointed Chairman of the Board of Directors and Chief Executive Officer at Petrotrin in 2002. He was considered a true pioneer whose dedication and commitment to the development of the domestic energy sector was unquestionable.
Johnny Gonsalves
Co-founder of Imij and Company and music producer, Johnny Gonsalves died in April after battling pancreatic cancer. Gonsalves started his musical career with the band Frantic. In 1994, he left Imij to start his own production company with Richard "Char Su" Ahong called Jogo Productions.The label was responsible for producing music for some of Trinidad and Tobago's top R&B, Gospel, Soca and Pop acts such as H2O Phlo, Ghetto Flex, Michael "Zoom," Salloum and Nigel Soyer, among others.
Peter Plummer/Maracas Beach guitar man
As distinctive as bake and shark is to Maracas Beach, Peter Plummer was a part of the beach's tapestry, performing for locals and tourists. He died in May from unknown causes.
Honorary Mention: Derek Walcott
Literary legend Derek Walcott died in March after a prolonged illness at the age of 87. Although St. Lucian-born, Walcott has always been considered a Trini as well, having moved to moved to Trinidad in 1953, where he has worked as a theatre and art critic.
6 politicians we lost in 2017
2017 in review: 10 crimes that shocked Trinidad and Tobago
Year in Review: Unforgettable moments in Entertainment


text:
Robert M. Love (born c. 1981) is an American author, speaker, Google engineer, and open source software developer.

Love is best known for his contributions to the Linux kernel, with notable work including the preemptive kernel, process scheduler, kernel event layer, virtual memory subsystem, and inotify. At Google, he was a member of the Android team and helped launch the first version of the platform. Love is also active in the GNOME community, working on NetworkManager, GNOME Volume Manager, Project Utopia and Beagle.

Biography
Love was born in 1981 in south Florida. He attended and graduated from Charles W. Flanagan High School. For his undergraduate studies, he attended the University of Florida, where he graduated with both a Bachelor of Arts in Mathematics and a Bachelor of Science in Computer Science.

While still in college, Love was employed as a kernel hacker at MontaVista Software. At MontaVista, he worked on procps and several kernel-related projects, including one of his most notable, the preemptive kernel.

Love began work at Ximian on December 15, 2003, where he first served as Senior Engineer in the Linux Desktop Group. At Ximian, he spearheaded an effort, named Project Utopia, to better integrate hardware management into the Linux desktop. After Ximian's acquisition by Novell, Love rose to the position of Chief Architect of SUSE Linux Enterprise Desktop. At Novell, he worked on various kernel and GNOME projects, including inotify and Beagle.

Love resigned from Novell on May 4, 2007, to work at Google on their mobile device platform, Android. Joining the project before it was announced, he engineered several kernel and system-level solutions for Android, including its novel shared memory subsystem, ashmem. Love worked at Google as Director of Engineering for Search Infrastructure through May 2021. Love now works as VP of Engineering at Toast where he builds cloud platforms to help restaurants thrive.

Love lives in Boston, Massachusetts.

Writing and speaking
Love is the author of Linux Kernel Development, now in its third edition, a book on understanding and developing code for the Linux kernel. The book is widely regarded as approachable and well written and has been translated into several languages. All three editions are published by imprints of Pearson Education.

He also wrote Linux System Programming, now in its second edition, subtitled Talking Directly to the Kernel and C Library, and published by O'Reilly Media. This work documents Linux's system call and C library API.

Love is also a coauthor of Linux in a Nutshell, a comprehensive Linux command reference also published by O'Reilly Media. "Linux in a Nutshell" was awarded "Favorite Linux Book of All Time" by Linux Journal.

Love is Contributing Editor for Linux Journal and author of articles for the magazine.

Love has been invited to speak around the world, including linux.conf.au in Australia, FOSDEM in Belgium, and GUADEC in England, where he was a keynote speaker.

Bibliography

Love has written and co-written several books on the Linux operating system:

References

External links
 Robert Love's Homepage
 Article on his Novell resignation
 Historical context on kernel patches

1981 births
Living people
Linux kernel programmers
American bloggers
People from Florida
University of Florida College of Liberal Arts and Sciences alumni
GNOME developers
Google employees

redpajama_set_name: RedPajamaWikipedia


What makes a good online advocacy platform? The world of online advocacy has changed much since the early days in the mid-1990's. We've evolved from the first custom build-outs from CTSG. That was quickly followed by the first off-the-shelf platform for online advocacy, Capwiz; launched in 1996 by Capitol Advantage. Since then, we've seen greater power in targeting emails to activists, customizing messages to Members of Congress based on their behavior (votes, sponsorships, committee assignments, etc.) and some social media integration.
The fact that social media integration has been limited is of concern. We know that social media is how an increasing number of people find their news. We also know that essentially all Members of Congress are on Facebook and Twitter, significant numbers of state and local lawmakers use social media, as well as many policy experts and members of the press. We know that when people learn about politics from their friends, there is a good chance that friend got their information via social media. And we know that lawmakers are paying attention to social media to better understand their constituents' needs and desires.
And yet, when it comes to software platforms for advocacy campaigns, most simply incorporate the ability for activists to share the campaign with their social networks. But there is so much more that needs to be done when it comes to integrating social media into advocacy software.
We are seeing a few platforms building out Facebook action centers, where organizations can drop their campaign action pages into a tab on their Facebook pages. And even if it is not built into the advocacy platform, these action centers can often be dropped into a Facebook page with iframes.
But the real integration that is sorely lacking is the ability to send messages to Congress via social media. It is standard for advocacy platforms to match citizens' ZIP codes and/or addresses to their elected officials and allow them to send an email to those lawmakers. The systems also typically allow citizens to print a letter to be mail by post. Some even facilitate citizens calling their Members. But what is missing from almost all of the platforms – and is long overdue – is giving citizens the ability to tweet at their lawmaker or directly post on their Member's Facebook page.
The sad part of this omission is that it is pretty easy to set up Several years ago, Jim Gilliam of NationBuilder and Wayne Moses Burke developed GovLuv.org, which matched people's ZIP code to their elected officials via Twitter. Even the Obama White House developed and used a Tweet Congress tool to help pass the President's job proposals.
Yet, at this point, the only advocacy platforms that have this feature are CQ Engage and BIPAC's P2. It is possible to hack the Engaging Networks platform to add it and they are planning to build it into the platform in the next year, or so. And the new EveryAction platform also plans to add it to its platform next year. As far as we have been able to determine, that is it.
Why is this so important? It is important because we know that leveraging multiple channels to mobilize citizens and multiple channels to message policymakers increases the chances of success. In psychology, the concept is called additive summation. In advertising it manifests itself as source amnesia. Essentially, the combined effect of multiple channel message delivery outperforms the expectations of all the channels used added together. The whole is greater than the sum of the parts.
Further, social advocacy—delivering activist messages to policymakers via social media—adds immense power to any advocacy campaign by creating public pressure and accountability on policymakers that emails, letters and phone calls cannot. Those methods of communication with policymakers are private (one-to-one). But like bird-dogging a lawmaker at a townhall, tweeting at them or posting on their Facebook page is on display to the public (including the press). That makes it significantly harder for lawmakers to claim they are unaware of people holding the campaign's position.
My favorite example happened during the legislative battle to pass the Affordable Care Act. Then Minority Leader John Boehner claimed in a press conference that he had never met an American who favored the "public option." After an AFSCME campaign to get thousands of people to tweet at Boehner saying they supported the public option, Boehner had to walk back his earlier comments at a press conference. It was a small victory, but it clearly shows that the model works.
Now we move on to our survey of the tools of the trade. The table below features a catalogue of online advocacy platforms with information about each. We have worked to fill out the fields for several weeks, but we know there is still more information on these out there. So, if you work for one of these companies or use one of these products, we invite you to help us fill out the table even more. That said, this should give you quite a start on your own research about what online advocacy tool to use.
And check back here regularly. In addition to turner4D's other fascinating blog posts, we will be doing more of these Tools of the Trade posts on other types of tools for advocacy, social media and communications campaigns.
Alan Rosenblatt, Ph.D., is the Senior Vice President of Digital Strategy at turner4D. Lauryn Gutierrez, Junior Associate at turner4D, assisted with the research for this post.


text:
LVCCLD_Camille
View all cards in Art
View all cards in Galleries
View all cards in Gallery Exhibits
Detroit: Art in Decay by Christopher J. Brandstetter
We're Nominated for the 2019 Best of Las Vegas Awards!
25 Art Exhibits to See (For Free!) this Summer
An American Family: An AIDS Legacy (1989-2019) by Tomas Gaspar
Through the Eyes of Hans Van de Bovenkamp
Flying Geese by Marie Martelly
by LVCCLD_Camille May 17, 2018
Marie Martelly examines her identity as a military spouse by piecing together elements representing tradition, comfort, security, and protection. She uses encaustic medium to coat the patterns of traditional quilt blocks, distancing layers, at once blurring and preserving them like memories over time.
The traditional flying geese quilt motif first entered Martelly's practice as a response to grief experienced following a training accident. In January 2014, a helicopter in her husband's squadron collided with a flock of geese on the coast of England. From this place of heartbreak, the flying geese pattern in Martelly's work has grown to also represent the opposite - symbolizing the strength and resilience of military families and communities.
Martelly was born in Newport News, Virginia. She received a BA in Art History from McGill University in Montreal, Canada, and an MA in Fine Arts from the Cambridge School of Art in England. She now lives and works in and around Air Force bases in the U.S. and overseas.
Photos from the Flying Geese reception:
marie martelly_birds in flightPhoto by Bee Aspinall
martelly reception 1Photo by Bee Aspinall
Centennial Hills Library
6711 N. Buffalo Dr.


⭐Your Videos will be Promoted Through Display Networks & Related Partners.
⭐Campaign Will Be 100% Organic Resulting In Natural Engagement Based On Video Content And User Behavior.
⭐◈ 100% Guaranteed Delivery | Full Refund If Not Delivered.


text:
On a Flying Fish
David Applefield
Mosaic Press (February 2003)
$15.00 (160pp)
Brave indeed is the novelist whose gregarious, anxious, polyglot alter-ego (yes, his name is Ernest) dares to anatomize—even celebrate—that peculiar inertia of beginning to write. In this novel, inspiration eluding the narrator in his sterile publishing job in New York and a torpid love affair in Frankfurt, with typewriter packed, he flees to a nondescript Caribbean island where he witnesses the murder of a rather witless shaggy dog story of an ex-pat.
It's enough to bring cork-lined bedrooms back into fashion.
Nor is it entirely without risk for said narrator to repeatedly interrupt his story to muse on composition in general, even to plead directly to his putative readers and reviewers for consideration of literary merit. So much of the writerly life is mood. That said, the reflections are an almost welcome respite from the lukewarm patois of an island roman policier, for in imagining a dialogue with his faceless audience, asking that his words engage their imagination, for all its self-regard, it is also plaintive, taking him to what is his ultimate theme and concern: that searching for a voice, inventing a style, that all novel-creating ultimately is.
"It's that process of filling in that I want the novel to oblige readers to follow… therefore I offer only half-stories, pieces," he says. "Scream 'not fair' or 'artistic incompetence' or 'boring' and I've succeeded in moving you off-center… I've created a conscious reaction and have thereby proved something."
The author's verve of language, his relish of engaging the maddening daily noise of the world, is in perfect pitch. Even his beloved Lab's animal antics steal the scene, written in great comic strokes. If only the girlfriend, the "she" who is given no name and precious little French dialogue, could have held her own with his masculine pre-occupations.
The author has spent nearly twenty-five years in Paris as a bilingual French-English source, a writer of guidebooks, and a lecturer on contemporary culture at the Institut d'Etudes Politiques de Paris. This is his second novel, following Once Removed; his next will be set in the Ukraine. He may be in the midst of some cultural lag. True, France is a nation that reveres the vocation of writing, from Montaigne to Proust: one's writing is a reading of the self, the ultimate confessional. But self-reflection, mirror to mirror, can also be blinding. (August)
Leeta Taylor
Reviewed by Leeta Taylor
September / October 2004
Disclosure: This article is not an endorsement, but a review. The author of this book provided free copies of the book to have their book reviewed by a professional reviewer. No fee was paid by the author for this review. Foreword Reviews only recommends books that we love. Foreword Magazine, Inc. is disclosing this in accordance with the Federal Trade Commission's 16 CFR, Part 255.
Rich Pickings
Cuts That Don't Bleed


text:
Pardosa oljunae is een spinnensoort in de taxonomische indeling van de wolfspinnen (Lycosidae).

Het dier behoort tot het geslacht Pardosa. De wetenschappelijke naam van de soort werd voor het eerst geldig gepubliceerd in 1978 door Lobanova.

Wolfspinnen


Recently I was nearly driven crazy by the task to create an msi-setup for my version control add-in for Microsoft Access in Visual Studio 2013. I referenced the correct PIA assemblies in my Visual Studio project, but other versions of them ended up on the target machines. My add-in was not working properly on some computers. Actually it was not working at all then.
I finally managed to solve the problem to reliably target multiple versions of an Office Application (Access in my case) with a single add-in. But as it required a bit of research and a lot of trial and error, I am writing this down to help you preserve your sanity if to want to achieve the same.
The first important thing is to reference the PIAs (Primary Interop Assemblies) for the oldest Office Version you want to support. That is Access 2007 (version 12.0) in my case. Even without the technical requirement to do this to compile an assembly that will run with all intended version, it is helpful during coding, as it prevents you from accidentally using features, which are not available in the older versions of your targeted application.
Downloading and installing the PIAs is fairly straight forward. Referencing them is as well, but that is where the trouble starts. The msi-setup for the PIAs installs them right into the GAC (Global Assembly Cache). When adding the references to your project, you can select the version you need in your project. But if you have got a newer version of the same PIA installed on your machine as well, Visual Studio will automatically perform assembly binding redirection and relink the references to the newer Versions of the files. That is not what I wanted! And the properties of the reference in Visual Studio are somewhat confusing.
To prevent this version mix-up and really compile your add-in with the old PIA-version you selected, you will have to export the PIAs from the GAC to another folder, specific to your project. - I used GACView for this. - Then reference the PIA-files from that folder into your Visual Studio project, using the "browse"- option when adding the references.
It would probably work equally well to disable the assembly binding redirection by editing the policy files in the GAC, as described in this stack-overflow-answer. But that would affect all projects that reference these files on your computer. Therefor I choose the option to put them in a separate folder for my project.
Even now Visual Studio will still write the version number of the highest available version of those files to your project file.
But that does not affect the build process. If you open the compiled assembly in ILDASM and take a look at the assembly manifest, you'll see that the correct versions of the PIA are referenced there.
Now with the build issues solved we should take care of the setup/deployment process.
I currently use a Visual Studio Installer Project to build an msi setup for the users to install my add-in on the target machines. I think this is the most convenient way to create a setup for simple projects. I probably will use WiX (Windows Installer XML toolset) for that end in the future. WiX gives you much more control over your setup project, but it has a much steeper learning curve as well.
When I first just referenced the Office 12.0 PIAs from the GAC in the add-in-project, I ended up with a reference to the 12.0 version, my assembly was linked to the 15.0 version and yet the installer project, automatically detecting dependencies, added the 14.0 (!?) version to the setup. – That was bound for failure.
After changing the things described in Step 1 and 2 it looks like the installer behaves now and is packing the correct versions. Still I want to take no chances anymore and control this myself instead of using the automatic dependency detection.
Therefore I explicitly exclude the automatically detected dependencies to the PIA files from the setup project and then add the files from the file system folder. That leaves no room for any excuse for VS to mess with my setup project.
Now I just build the solution and the installer project and upload the msi setup file to my website. Done!
As an afterthought, I would like to mention that there are some interesting alternatives to this approach that might prevent the whole problem.
You could use the NetOffice API instead of the PIAs to write add-ins for MS Office. NetOffice looks very promising and I actually tried to use it to address my problem. However I found a couple of Microsoft Access' Enums and Methods (e.g. AcObjectType-Enum and the ControlType- and SourceObject-Properties) are not implemented yet. If you are writing an add-in for Word- or Excel you should definitely evaluate NetOffice as an option for you. These Office Applications are probably better supported by NetOffice as they are more widely used.
Another option might be to use the CLR 4.0 and embed the types from the PIA you are using. This would have actually been my preferred solution, but my project needs to talk to some other APIs as well and those are having serious issues when called by a CLR 4.0 component.
Do you use another reliable approach to create and distribute COM-Add-Ins for Microsoft Office? – Let me know in the comments.


text:
Chan Lowe: Gov. Scott vetoes DREAMer driver's licenses
By By Chan Lowe
Gov. Scott vetoes DREAMers driver's licenses
"No lo soporto (I can't stand him)." That's what a majority of Florida Latinos would say about Gov. Rick Scott if asked. His policies to date have reflected his clear bias toward corporations over people, and a lack of respect for the working poor and the unemployed (Remember the urine test for welfare recipients?).
But, thanks to a looming reelection battle, Gov. Scott has been displaying signs of humanity. He reversed himself to endorse Medicaid expansion, though he failed to deliver — he was notably missing in action when the Legislature needed moral suasion and political cover.
His support of election reform was risk-free. Even our tone-deaf Legislature realized that a law so regressive, inefficient and biased — and that made our state, once again, a national punch line — needed some "tweaking."
But these so-called humanizing moves have come at a cost. The natives — Scott's troglodytic base that votes in Republican primaries — are getting restless. Their boy's going soft, and maybe they'll just scrape around under the floorboards and find him a challenger who either knows how to toe the line or scares him straight.
Hence, the veto of the DREAMer driver's licenses. The base feels America's giving those illegals enough of a free ride as it is, just because they managed to duck the border patrol, or navigate the shark-infested straits, or whatever. While the veto accomplishes little in real terms, it provides an important reminder that Scott's willing to slap those self-entitled freeloaders around a little.
Spending over $70 million of your own money on a campaign to buy the governor's chair when you're an unknown is one thing. Getting people to vote for you after they already know you and dislike you is another. Money just doesn't provide the same clout.
Therefore, it's easy to see why our governor bucked the almost unanimous will of his own Legislature on this one. He shored up his right flank while losing little — because the majority of Latinos will never vote for him, anyway.
"No lo soporto." It was all part of the calculation.


text:
Торѝто (, на местен диалект Terìtte, Терите) е градче и община в Южна Италия, провинция Бари, регион Пулия. Разположено е на 233 m надморска височина. Населението на общината е 8580 души (към 2010 г.).

Източници

Външни препратки
 Уебсайт на общината

Бари (провинция)
Градове в Пулия


text:
Q: Manually sort entries without glossaries-extra package since none of my issues could be solved yet
( Define special sorting for Lualatex glossaries in Japanese? )
( Bib2Gls doesn't compile CJK characters correctly ) and I won't be able to turn in my paper with an unsorted glossary, I am quite desperate for help (or I'll have to get back to MS Office :( .. )
I would need a manual sorting (at least) for my glossary using glossaries package (as the glossaries-extra package doesn't work for me with CJK character (s. 2nd issue with compiling issues of bib2gls) with LuaLaTeX, because this combination is the only, that worked "somewhat".
Since I am using CJK characters and the current list appears to be random to me, I would need to be able to manually change the order of the glossary (according to japanese order).
Is there any way I can manually sort them with the glossaries package?
Thank you!
I know it is annoying that similar questions are being asked repeatedly, but I need to come to some solution somehow, to be able to turn in the paper :/
I spent the last weeks trying to figure things out and as a LaTeX noob that wasn't always easy. (Although I think I found some clues, which didn't help me solve the overall issues in the other questions though).
(MWE in case it is of help:)

\documentclass{scrreprt}
\usepackage[main=ngerman, english]{babel}
\usepackage[babel, german=quotes]{csquotes}
\usepackage[ngerman]{isodate}
\usepackage[ngerman]{datetime}
\usepackage{libertine}
\usepackage{libertinust1math}
\usepackage[match,ipaex]{luatexja-preset}
\setmainjfont{IPAexMincho}
\usepackage{luatexja-ruby}
\ltjsetparameter{jacharrange={-3}} %    punctuation is Latin
\usepackage[acronym, toc, nopostdot]{glossaries}
\glsnoexpandfields
\makeglossaries
\input{glossary}

\begin{document}
\gls{oilshock}
\gls{serienfertigung}
\gls{afghanistanintervention}
\gls{sozialistischewirtschaft}\gls{kommunistischepartei}
\printglossary
\end{document}

Glossary entries:
\newglossaryentry{oilshock}{name={\cjkname{オイルショック}},
  description={Ölpreiskrise}
  }
\newglossaryentry{serienfertigung}{name={\cjkname{\ltjruby[]{多|品|種少|生産}{た|ひんしゅ|しょう|せいさん}}},
  description={Serienfertigung}
  }
\newglossaryentry{afghanistanintervention}{name={\cjkname{アフガン\ltjruby{侵|攻}{しん|こう}}},
  description={Intervention in Afghanistan}
  }
\newglossaryentry{kommunistischepartei}{name={\cjkname{ソ\ltjruby{連|共産|党}{れん| きょうさん|とう}}},
  description={Kommunistische Partei der Sowjetunion}
}
\newglossaryentry{sozialistischewirtschaft}{name={\cjkname{\ltjruby{社会|主義|経済}{しゃかい|しゅぎ|けいざい}}},
  description={sozialistische Wirtschaft}
  }

A: Assuming that you want to use lualatex, remove all the pdflatex stuff and add sort keys everywhere. Then it should compile:
\documentclass{scrreprt}
\usepackage[main=ngerman, english]{babel}
\usepackage[babel, german=quotes]{csquotes}
\usepackage[ngerman]{isodate}
\usepackage[ngerman]{datetime}
\usepackage{libertine}
\usepackage{libertinust1math}
\usepackage[match,ipaex]{luatexja-preset}
\setmainjfont{IPAexMincho}
\usepackage{luatexja-ruby}
\ltjsetparameter{jacharrange={-3}} %    punctuation is Latin
\usepackage[acronym, toc, nopostdot]{glossaries}
\glsnoexpandfields
\makeglossaries
\newglossaryentry{oilshock}{name={オイルショック},
  description={Ölpreiskrise},
  sort=xxx
  }
\newglossaryentry{serienfertigung}{name={\ltjruby[]{多|品|種少|生産}{た|ひんしゅ|しょう|せいさん}},
  description={Serienfertigung},sort=aaa
  }
\newglossaryentry{afghanistanintervention}{name={アフガン\ltjruby{侵|攻}{しん|こう}},
  description={Intervention in Afghanistan},sort=bbb
  }
\newglossaryentry{kommunistischepartei}{name={ソ\ltjruby{連|共産|党}{れん| きょうさん|とう}},
  description={Kommunistische Partei der Sowjetunion},sort=ccc
}
\newglossaryentry{sozialistischewirtschaft}{name={\ltjruby{社会|主義|経済}{しゃかい|しゅぎ|けいざい}},
  description={sozialistische Wirtschaft},sort=ddd
  }

\begin{document}
\gls{oilshock}
\gls{serienfertigung}
\gls{afghanistanintervention}
\gls{sozialistischewirtschaft}\gls{kommunistischepartei}
\printglossary
\end{document}

redpajama_set_name: RedPajamaStackExchange


Well, they insisted that I go through chemo immediately. And when all the guys in white coats are telling you this, you simply have no logical choice to disagree, so I went through 5 weeks of terrible chemo. Later, they directed us to go to Seattle to get stem cell transplants, which were designed to prevent a return of the cancer. But while we were there, but before starting the procedures (which are like chemo on steroids), we got an email from a friend in China, who had just had cancer herself and who feels her life was saved by a video series with content unlike anything we know of or hear about from the US medial community. About three videos into the nine video series we turned to each other up there in Seattle and both said to each other "we're going home!" . So we did. Skipped all the procedures. One of the things in the video series was the great, great value of using trampoline to cleanse your lymph system of toxins. And that is where Bellicon came in. I bought it after several tramps had their springs gave out and I have been in love with my Bellicon ever since. I bounce literally every day! I know it is helping. For anyone reading this I will list the other things we discovered below, dealing with cancer. But that is why I love my Bellcon and rely on it so much. It is part of what is keeping me alive. My cancer is expected to return to survivors within 2 years. I am coming up on the 2 year mark in January: Yea!!!!
Read this review on Facebook.


Diabetes is a chronic, lifelong disease that has become more widespread in the United States; Georgians are not exempt, with incidences of diabetes 30 percent higher than the national average. Southeast Georgia Health System is committed to increasing awareness and providing comprehensive diabetes education to our patients, their families and the community.
An important component in controlling diabetes is proper self-care. Fortunately, residents of Southeast Georgia who have diabetes have access to the Southeast Georgia Health System Outpatient Diabetes Education Program.
The diabetes education programs at the Southeast Georgia Health System Brunswick Campus and the Southeast Georgia Health System Camden Campus have been Recognized by the American Diabetes Association for providing Quality Self-Management Education* and Support.
Our diabetes education program provides outpatient diabetes self-management training in both group and individual appointments at the Brunswick and Camden campuses. A physician referral is required for participation. Most insurance companies cover diabetes education, except for copays and/or deductibles. Financial assistance may be available.
Although diabetes is a very serious disease, it can be kept in check with healthy eating, exercise and medication. The Health System's diabetes education program helps people with diabetes and their families learn how to cope with this serious disease and stay as healthy as possible.
Call for more information about our diabetes education classes at 912-466-1689 for the Brunswick Campus and 912-576-6488 for the Camden Campus.
Diabetes education classes set patients up for success. Read our featured article in the Winter 2017 issue of Healthy Partners!


September continues to be the month that keeps on giving. A lot of great titles arrived this week on Netflix UK. We take a look at a few of the highlights that landed this week.
Let's start with movies. In the 'oldie but you should always watch' department we have The Breakfast Club. In this John Hughes classic, a group of teens find themselves together in a Saturday detention that changes their entire perspective on teenage life.
Two other must-see classics are Being John Malkovich and Schindler's List. Both are cerebral watches that deserve a spot in your queue.
Another movie very worthy of your time is The Land of Steady Habits. Adapted from the book of the same name by Ted Thompson, Ben Mendelsohn (Bloodline) stars as a suburban financier suffering from terminal malaise. He leaves his job and his family to find a better life without much success. He's disliked by most people he knows, makes terrible choices, and has trouble communicating with his son. Edie Falco puts forth her usual first-rate performance as his ex-wife who is moving on with her life much to his dismay. This certainly isn't an uplifting film, but it's a great character driven study with superb performances from all involved. It's a very compelling watch.
In the series department, there are several binge-worthy additions. First up is American Horror Story Season 7. The seventh installment of Ryan Murphy's anthology series, this season has a political bent. There are politicians and meltdowns and clowns. Oh, my.
We also get a new season of BoJack Horseman. Last season was quite serious, but we get a bit of lightening up with BoJack landing a starring role in a new series. Perhaps this is the season the characters find a happier place.
We also get a new season of American Vandal. Always disgusting but too good to turn away from, this season sees a new school and a new mystery. Let's just say it involves something brown. Like last season, the show seems set on a juvenile concept, but ends up being a great true crime show.


Second graders from Harlan-Butlerville Primary School rang in the holidays with terrific concert on Thursday, Dec. 13. Take a look at photos from the event!
Mark your calendar for Harlan-Butlerville Primary School's second grade holiday concert on Thursday, Dec. 13.
The performance begins at 6:30 p.m. Students should arrive at 6:15 p.m.
Both concerts will be held in the Little Miami High School auditorium.
Ghoulish tic-tac-toe, creating your own spider web and even reaching into a witch's nose? Those were just some of the fun activities Harlan-Butlerville Primary students enjoyed during their Halloween celebration. Thank you to the PTO for sponsoring the event. Check out the photos!
First grade concert a success!
First graders from Harlan-Butlerville Primary School welcomed in warmer weather with a terrific spring music concert on May 9.


text:
Кетцалькоа́тль (;  — «пернатий змій») — бог ранкової зорі й культовий герой у релігіях багатьох народів Мезоамерики, зокрема мая та ацтеків. У народів мая Кетцалькоатля називали Кукульканом.

Історія міфу

Перші зображення Кетцалькоатля з'явилися впродовж VIII — V століть до н. е. в скульптурі ольмеків. Божество найчастіше зображували як пернатого змія з головою людини. Тоді з'явився міф про те, що він добув для людини зерна маїсу, перетворившись на мураху і викравши їх з підземного мурашника.

Упродовж I — VI століть культ Кетцалькоатля поширився на всю Центральну Америку. У міфології індіанців він перетворився на верховного бога, вважався творцем світу, людини та всіх живих істот. Крім того, Кетцалькоатля шанували як покровителя наук та жрецтва, а також винахідника календаря.

У дуалістичній міфології індіанців мая Кетцалькоатль був супротивником свого брата Тескатліпоки — бога ночі та війни.

Джерела

 Універсальний словник-енциклопедія / Гол. ред. ради академік НАН України М. Попович. — 4-те вид., виправл., доп. — Видавництво «ТЕКА». — 2006. — С. 598.
 Maya Gods and Goddesses
 Мифологическая энциклопедия. Ацтекский пантеон
 Кецалькоатль (Quetzalcoatl)

Боги ацтеків
Боги, які помирають і воскресають


text:
Ireland's oldest mail order Garden retailer.100% Irish Family Owned
Committed to Excellence.
We are first and foremost gardeners, with a passion for plants. It's this passion that drives us to seek out and find new and exciting varieties to offer to our friends and customers. For almost 40 years we have been growing and introducing new varieties of plants, bulbs and seed to the Irish public. We can justifiably claim to have introduced more new varieties to Irish gardeners in the last 40 years than any other garden supplier. It is this passion for new and old varieties of noteworthy merit that continues to drive us to this day.
In the early 1970's Thomas Quearney known to many as Mr Middleton started growing plants in his parent's back garden,by 1973 he had started trading and selling at markets. From the very start he kept detailed records and in our archive we have the first trader's certificate issued on 28th Aug 1973.
At the very beginning Thomas had a vision for a mail order supply company. The first mail order advertisement appeared in the national newspapers in 1977 offering 13 varieties of vegetable seeds and 6 varieties of flowers. It was the start of our seed business; the supplier was a small seed firm in Cambridge called Ian & Stuart. At the same time he was also trading with the world famous seed company Thompson & Morgan. Within 10 years Thomas had convinced T&M to appoint him as their sole Irish distributor, a partnership that continues to this day. Thompson & Morgan is now the No 1 seed supplier to Irish garden centres.
In 1976 the manager of the local Trustee Saving Bank was so impressed by the young entrepreneur that he agreed to provide a loan for garden machinery with the proviso his father acted as guarantor. The first machinery purchased was a Mantis tiller. The loan book shows monthly repayment of £7.74(old Irish punts) due on the 21st of each month. The tiller continued to work in our nursery every day for over 20 years and it was this love of Mantis and its enduring quality that lead us to be appointed as a distributor for Mantis tillers.
By 1979 the back garden and plots of rented land were no longer big enough and the first nursery was opened in Porterstown, some years later we moved to Oldtown, where we still have a presence. Specialising in growing perennials Thomas developed a range which he supplied to the major retailers of the day, Woolworths, Tesco, Roche's Stores, and Quinnsworth.
From the early days Thomas's parents and siblings provided the necessary labour to help expand the business, so it was natural that his brother Garret would join him as a partner in the business. A few years later in 1983 the first full time staff members joined, Alan Murray and Vera Mc Kenna . More than 30 years later , the original four today form the backbone of the great team that is now Mr Middleton.
Our early archive contains lots of interesting material, we know that on November 23rd 1977,
Thomas sold 10 boxes of Wallflowers in the Wholesale Fruit & Veg market, for which he received the vast sum of £4.50(old Irish punts) from which a commission of .45p was deducted.
It also shows the trading that was done with the great garden retailers of the day, Mackey's of Mary St . Rowans, of Capel st , Caulfield's of Dame St ,Drummonds of Usher Quay, Hackett's of Parliament St (later Capel st ).
Today Mr Middleton is the only remaining traditional seed shop in the city centre full old the old world smells of seeds, bulbs and bone meal.
Following our first national mail order campaign in 1986 we opened our South Ann St shop followed by the store on Mary St.In the mid 1990's the wholesale side of the business had grown to be the major supplier of bulbs, hardy nursery stock and roses to the multiple trade.
But our true love was in retail and mail order so Thomas and Garret made the bold step to sell the wholesale business as well as moving the South Ann street business to Mary St.
The reinvestment we made in the business would see the mail order business grow and the first Irish online garden shop open.
Today Mr Middleton is Ireland's leading specialist garden retailer. Our shop in Mary Street is a mecca for gardeners, selling seed varieties by the thousands and stocking in season over 2,000 varieties of flower bulbs from around the world as well as good garden tools and equipment.
Our 15,000sq ft. warehouse and office complex in Glasnevin dispatches orders every day to gardener's throughout Ireland.
We represent in Ireland many of the world's leading horticultural brands, among them Thompson & Morgan Seed (UK), Becker Underwood Nematodes (UK), Simple Pleasures Bulbs (U.S.) Wout Philippo Bulbs (Holland), Lubera (Switzerland), Bio Green (Germany), Agriframes (UK), Mantis Tiller (US).
We are still a 100% Irish family owned business committed to providing excellence every day to Irish gardeners. The everyday business continues to be run by our founding Directors Thomas and Garret Quearney.
Thomas is responsible for sourcing and developing new products while Garret now heads the team, as he has done for over 30 years that make it possible to deliver the Mr Middleton dream of creating great Irish gardens.
Our mission as it has been for almost 40 years is to help Irish gardeners create great gardens.


Description: This complete audio system includes everything you need to cover 2000+ listeners. System Includes: 2 x Technomad Berlin 15/H Install Loudspeaker, 2 x 50′ 12-Gauge Outdoor Speaker Cable, 1 x Technomad P-1 amplifier (2 x 500W), 1 x 6U Storage Case for Mixer and Amp, 2 x Wallmount, 1 x Technomad M1 6-channel mixer with 2 Mic, 1 x 1/8″ stereo font-mounted input for iPod™/Mp3 player and 4 rear stereo RCA inputs for line inputs, 1 x Switched Dynamic Microphone and Cable, All patch cords, assembly, and testing. Amp can drive up to 6 Berlin loudspeakers. Shipping Weight: 300 lbs.
Installation is easy – all you have to do is plug in the mixer and amplifier, attach the speaker cables, and turn on! You can easily connect an iPod/MP3 player, CD player or tape deck to the system, if desired. There are multiple rear mixer inputs, and a 1/8″ stereo input is provided on the front of the mixer so you can directly attach your music playback device with a standard 1/8″ cable. A handheld microphone is included. The loudspeakers can be bolted to the outside of a press box or other location as needed. Loudspeakers are fully weatherproof, IP56-rated.
Options include wireless mics, MP3 instant playback system, our NEW! super-powerful OSLO subwoofer, more [ click for info ].


text:
Spencer Group Arranges Charity Events in Support of Railway Children
Date 26th March 2015
EIGHT employees from The Spencer Group (Spencer) are gearing up to take on The Three Peaks Challenge to raise money for Railway Children.
The Spencer team will take on the challenge in June and is looking to raise more than £10,000 for the charity.
Standing at a combined height of more than 3,400m, the team will scale Snowden, Scafell Pike and Ben Nevis in 24hours, traveling to the foot of each climb by rail.
Richard Caley from Spencer, said: "This is a challenge for the eight of us befitting the size of the task facing Railway Children on a day-to-day basis. We spent some time thinking of ways in which we could make the challenge unique and the idea of travelling between each peak by rail was a popular suggestion. After all, we are an engineering group operating predominantly in the rail industry."
In addition to The Three Peaks Challenge, Spencer is holding a charity ball on May 29 at the KC Stadium – home of Hull City AFC.
The event will be attended by leading business people from across the region as well as a number of Spencer's partners and supply chain.
The event will feature a casino, magician and auction for a plethora of sporting and signed celebrity merchandise.
Attendees will also be entertained with music from The Ordinary Men.
Richard and his wife, Sarah, became parents to their first child, Felicity, in December last year and it was the realisation of the privileged world Felicity was born into that led him to choosing to support the work Railway Children does.
"Felicity has been born into a wide-reaching community of family and friends that will love her and support her, and she has access to baby and child support facilities such as baby signing, baby massage and toy libraries on her doorstep," he said.
"She will soon be receiving her first set of injections at the doctor's surgery; no doubt she'll be revisiting the same surgery many times in years to come and most likely other NHS services (but hopefully not too many) as she gets older.
"Not all children will receive the same love, care and opportunities as Felicity and the sad truth is that some will actually know only suffering and hardship. Railway Children is a fantastic charity doing work to try and prevent that and we are delighted to be able to support it."
Railway Children supports children in the UK, India and Africa, providing protection and opportunity for children with nowhere else to go and nobody to turn to. Their focus is to get to children who have run away or been forced from their homes as soon as possible before the grim reality of living on the streets takes hold and they become vulnerable to poverty, violence, abuse and neglect.
More than 100,000 children run away from home in the UK each year.
In 2013-14, Railway Children asked 216 local authorities how many times they had used emergency accommodation to help a young person under 16 who had gone missing from home or care.
Out of the 210 that replied, only 110 could tell the charity how often they had used emergency accommodation in this way in 2013-14. In 71 cases, the answer was never.
Visit http://uk.virginmoneygiving.com/team/DavidMcLoughlin1 to support Richard and the team by donating to Railway Children.
You can also keep up-to-date with all the latest news ahead of the charity ball, like the event's Facebook page at https://www.facebook.com/pages/Spencer-Charity-Ball and follow @SpencerBall2015 on Twitter.
To buy a ticket for the Charity Ball, please visit: http://www.spencercharityball.co.uk.


text:
package com.mm.engine.framework.control;

import com.mm.engine.framework.control.gm.Gm;
import com.mm.engine.framework.net.code.RetPacket;
import com.mm.engine.framework.control.annotation.*;
import com.mm.engine.framework.control.annotation.EventListener;
import com.mm.engine.framework.control.event.EventListenerHandler;
import com.mm.engine.framework.control.netEvent.NetEventListenerHandler;
import com.mm.engine.framework.control.request.RequestHandler;
import com.mm.engine.framework.control.event.EventData;
import com.mm.engine.framework.control.netEvent.NetEventData;
import com.mm.engine.framework.data.entity.session.Session;
import com.mm.engine.framework.security.exception.MMException;
import com.mm.engine.framework.server.ServerType;
import com.mm.engine.framework.tool.helper.ClassHelper;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TShortObjectHashMap;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.bytecode.MethodInfo;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.*;
import java.util.List;

/**
 * Created by Administrator on 2015/11/18.
 * ServiceHelper
 * 在系统启动的时候,找到所有的Service并用对应的Handler封装,
 * 然后传递给对应的管理器,分别为:
 * Request-RequestHandler-RequestService
 * EventListener-EventListenerHandler-EventService
 * NetEventListener-NetEventListenerHandler-NetEventService
 * Updatable-
 */
public final class ServiceHelper {
    private static TIntObjectHashMap<Class<?>> requestHandlerClassMap=new TIntObjectHashMap<>();
    private static TShortObjectHashMap<Set<Class<?>>> eventListenerHandlerClassMap=new TShortObjectHashMap<>();
    private static TIntObjectHashMap<Class<?>> netEventListenerHandlerClassMap=new TIntObjectHashMap<>();
    private static Map<Class<?>,List<Method>> updatableClassMap=new HashMap<>();

    /**
     * BeanHelp获取该Map对Service进行实例化,
     * 这样确保了同一个Service只实例化一次
     * */
    private static Map<Class<?>,Class<?>> serviceClassMap=new HashMap<>();
    private final static Map<Class<?>,Class<?>> serviceOriginClass = new HashMap<>();

    // 各个service的初始化方法和销毁方法,threeMap默认是根据键之排序的
    private static Map<Integer,Map<Class<?>,Method>> initMethodMap = new TreeMap<>();
    private static Map<Class<?>,Method> destroyMethodMap = new HashMap<>();
    private static Map<String,Method> gmMethod = new HashMap<>();

    static{
        try {
            //j2ee下需要设置:且后面跟的类视乎没有什么关系,有待研究
            ClassPool.getDefault().insertClassPath(new ClassClassPath(Service.class));

            Map<Class<?>,List<Method>> requestMap=new HashMap<>();
            Map<Class<?>,List<Method>> eventListenerMap=new HashMap<>();
            Map<Class<?>,List<Method>> netEventListenerMap=new HashMap<>();
            Map<Class<?>,List<Method>> updatableMap=new HashMap<>();
            List<Class<?>> serviceClasses= ClassHelper.getClassListByAnnotation(Service.class);
//            for(Class<?> serviceClass : serviceClasses){
//                ClassPool pool = ClassPool.getDefault();
//                CtClass oldClass =  pool.get(serviceClass.getName());
//                System.out.println(serviceClass.getName()+" before:"+serviceClass.getDeclaredMethods().length);
//                CtMethod r = oldClass.getDeclaredMethods()[0];
//                oldClass.removeMethod(r);
//                System.out.println(serviceClass.getName()+" after:"+serviceClass.getDeclaredMethods().length);
////                oldClass.addMethod(r);
////                System.out.println(serviceClass.getName()+" end:"+serviceClass.getDeclaredMethods().length);
////                CtClass cls = pool.makeClass(oldClass.getName()+"$Aaaaa",oldClass);
////
//                System.out.println(oldClass.toClass() == serviceClass);
//            }
            for(Class<?> serviceClass : serviceClasses){
                Service service = serviceClass.getAnnotation(Service.class);
                String init = service.init();
                int initPriority = service.initPriority();
                String destroy = service.destroy();
                Method[] methods=serviceClass.getMethods();
                for (Method method : methods){
                    // 判断是否存在Request
                    if(method.isAnnotationPresent(Request.class)){
                        addMethodToMap(requestMap,serviceClass,method);
                    }
                    //
                    if(!service.runOnEveryServer() && !ServerType.isMainServer()){
                        continue;
                    }
                    if(method.isAnnotationPresent(EventListener.class)){
                        addMethodToMap(eventListenerMap,serviceClass,method);
                    }
                    if(method.isAnnotationPresent(NetEventListener.class)){
                        addMethodToMap(netEventListenerMap,serviceClass,method);
                    }
                    if(method.isAnnotationPresent(Updatable.class)){
                        addMethodToMap(updatableMap,serviceClass,method);
                    }
                    // 判断是否是初始化方法和销毁方法
                    if(method.getName().equals(init)){
                        Map<Class<?>,Method> methodMap = initMethodMap.get(initPriority);
                        if(methodMap == null){
                            methodMap = new HashMap<>();
                            initMethodMap.put(initPriority,methodMap);
                        }
                        methodMap.put(serviceClass,method);
                    }
                    if(method.getName().equals(destroy)){
                        destroyMethodMap.put(serviceClass,method);
                    }
                    Gm gm = method.getAnnotation(Gm.class);
                    if(gm != null){
                        Method old = gmMethod.put(gm.id(),method);
                        if(old != null){
                            throw new MMException("gm id duplicate,id="+gm.id()+" at "+method.getDeclaringClass().getName()+"."+method.getName()
                                    +" and "+old.getDeclaringClass().getName()+"."+old.getName());
                        }
                    }
                }
            }

            /**
             * 获取每个Service被引用的情况,并生成新的Class
             *
             * 这一步生成需要修改BeanHelper中的对应的类和实例化对象
             * */
            for(Class<?> serviceClass : serviceClasses){
                // 对于request,用opcode导航
                List<Short> opcodeList=null;
                List<Short> eventList=null;
                List<Integer> netEventList=null;

                Class<?> newServiceClass=serviceClass;

                Service service = serviceClass.getAnnotation(Service.class);
                // TODO 这里用的isMainServer,可考虑修改
                if(!service.runOnEveryServer() && !ServerType.isMainServer()){
                    // 改写所有的public方法,使用远程调用
                    ClassPool pool = ClassPool.getDefault();
                    CtClass oldClass =  pool.get(serviceClass.getName());
                    CtClass cls = pool.makeClass(oldClass.getName()+"$Proxy",oldClass);

                    for(CtMethod ctMethod : oldClass.getDeclaredMethods()){
                        MethodInfo methodInfo = ctMethod.getMethodInfo();
                        if(methodInfo.getAccessFlags() == 1){ // public 的
                            // 重写该方法
                            StringBuilder sb = new StringBuilder(ctMethod.getReturnType().getName()+" "+ctMethod.getName()+"(" );
                            CtClass[] paramClasses = ctMethod.getParameterTypes();
                            int i=0;
                            StringBuilder paramsStr = new StringBuilder();
                            for(CtClass paramClass : paramClasses){
                                if(i > 0){
                                    sb.append(",");
                                    paramsStr.append(",");
                                }
                                sb.append(paramClass.getName()+" p"+i);
                                // 这个地方需要进行一步强制转换,基本类型不能编译成Object类型
                                paramsStr.append(praseBaseTypeStrToObjectTypeStr(paramClass.getName(),"p"+i));
                                i++;
                            }
                            sb.append(") {");
                            String paramStr = "null";
                            if(i >0){
                                sb.append("Object[] param = new Object[]{"+paramsStr+"};");
                                paramStr = "param";
                            }
                            // --------------这个地方要进行强制转换
                            sb.append("com.mm.engine.framework.control.netEvent.remote.RemoteCallService remoteCallService = (com.mm.engine.framework.control.netEvent.remote.RemoteCallService)com.mm.engine.framework.tool.helper.BeanHelper.getServiceBean(com.mm.engine.framework.control.netEvent.remote.RemoteCallService.class);");
                            String invokeStr = "remoteCallService.remoteCallMainServerSyn("+serviceClass.getName()+".class,\""+ctMethod.getName()+"\","+paramStr+");";
                            if(ctMethod.getReturnType().getName().toLowerCase().equals("void")){
                                sb.append(invokeStr);
                            }else{
                                sb.append("Object object = "+invokeStr);
                                sb.append("return "+parseBaseTypeStrToObjectTypeStr(ctMethod.getReturnType().getName()));
                            }
                            sb.append("}");
//                            System.out.println(sb.toString());
                            CtMethod method = CtMethod.make(sb.toString(), cls);
                            cls.addMethod(method);
                        }
                    }
                    newServiceClass = cls.toClass();
                }

                if(requestMap.containsKey(serviceClass)){
                    newServiceClass=generateRequestHandlerClass(newServiceClass,serviceClass);
                    opcodeList=new ArrayList<>();
                    List<Method> methodList=requestMap.get(serviceClass);
                    for(Method method :methodList){
                        Request request = method.getAnnotation(Request.class);
                        opcodeList.add(request.opcode());
                    }
                }
                if(eventListenerMap.containsKey(serviceClass)){
                    newServiceClass=generateEventListenerHandlerClass(newServiceClass,serviceClass);
                    eventList=new ArrayList<>();
                    List<Method> methodList=eventListenerMap.get(serviceClass);
                    for(Method method :methodList){
                        EventListener request = method.getAnnotation(EventListener.class);
                        eventList.add(request.event());
                    }
                }
                if(netEventListenerMap.containsKey(serviceClass)){
                    newServiceClass=generateNetEventListenerHandlerClass(newServiceClass,serviceClass);
                    netEventList=new ArrayList<>();
                    List<Method> methodList = netEventListenerMap.get((serviceClass));
                    for (Method method :methodList) {
                        NetEventListener netEventListener = method.getAnnotation(NetEventListener.class);
                        netEventList.add(netEventListener.netEvent());
                    }
                }
                if(updatableMap.containsKey(serviceClass)){
                    newServiceClass=generateUpdatableHandlerClass(newServiceClass,serviceClass);
                }
                serviceClassMap.put(serviceClass,newServiceClass);
                serviceOriginClass.put(newServiceClass,serviceClass);
                // request
                if(opcodeList!=null){
                    for(short opcode : opcodeList){
                        requestHandlerClassMap.put(opcode,serviceClass);
                    }
                }
                // event
                if(eventList!=null){
                    // 一个event可能对应多个类
                    for(short event : eventList){
                        if(eventListenerHandlerClassMap.containsKey(event)){
                            Set<Class<?>> classes=eventListenerHandlerClassMap.get(event);
                            classes.add(serviceClass);
                        }else{
                            Set<Class<?>> classes=new HashSet<>();
                            classes.add(serviceClass);
                            eventListenerHandlerClassMap.put(event,classes);
                        }
                    }
                }
                // netEvent
                if(netEventList!=null){
                    // 一个netevent可能对应多个类
                    for(int netEvent : netEventList){
                        netEventListenerHandlerClassMap.put(netEvent,serviceClass);
                    }
                }
                // update
                if(updatableMap.containsKey(serviceClass)){
                    updatableClassMap.put(serviceClass,updatableMap.get(serviceClass));
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("ServiceHelper init Exception");
        }

    }
    private static String praseBaseTypeStrToObjectTypeStr(String typeStr,String paramStr){
        if(typeStr.equals("byte")){
            return "new Byte("+paramStr+")";
        }else if(typeStr.equals("short")){
            return "new Short("+paramStr+")";
        }else if(typeStr.equals("long")){
            return "new Long("+paramStr+")";
        }else if(typeStr.equals("int")){
            return "new Integer("+paramStr+")";
        }else if(typeStr.equals("float")){
            return "new Float("+paramStr+")";
        }else if(typeStr.equals("double")){
            return "new Double("+paramStr+")";
        }else if(typeStr.equals("char")){
            return "new Character("+paramStr+")";
        }else if(typeStr.equals("boolean")){
            return "new Boolean("+paramStr+")";
        }
        return paramStr;
    }
    private static String parseBaseTypeStrToObjectTypeStr(String typeStr){
        if(typeStr.equals("byte")){
            return "((Byte)object).byteValue();";
        }else if(typeStr.equals("short")){
            return "((Short)object).shortValue();";//"Short";
        }else if(typeStr.equals("long")){
            return "((Long)object).longValue();";//"Long";
        }else if(typeStr.equals("int")){
            return "((Integer)object).intValue();";//"Integer";
        }else if(typeStr.equals("float")){
            return "((Float)object).floatValue();";//"Float";
        }else if(typeStr.equals("double")){
            return "((Double)object).doubleValue();";//"Double";
        }else if(typeStr.equals("char")){
            return "((Character)object).charValue();";//"Character";
        }else if(typeStr.equals("boolean")){
            return "((Boolean)object).booleanValue();";//"Boolean";
        }
        return "("+typeStr+")object";
    }

    //get set
    public static Map<Class,List<Method>> getMethodsByAnnotation(Class<? extends Annotation> cls){
        List<Class<?>> serviceClasses= ClassHelper.getClassListByAnnotation(Service.class);
        Map<Class,List<Method>> result = new HashMap<>();
        for(Class<?> serviceClass : serviceClasses) {
            Service service = serviceClass.getAnnotation(Service.class);
            Method[] methods = serviceClass.getMethods();
            for (Method method : methods) {
                Annotation annotation = method.getAnnotation(cls);
                if(annotation != null){
                    List<Method> list = result.get(serviceClass);
                    if(list == null){
                        list = new ArrayList<>();
                        result.put(serviceClass,list);
                    }
                    list.add(method);
                }
            }
        }
        return result;
    }
    public static TIntObjectHashMap<Class<?>> getRequestHandlerMap(){
        return requestHandlerClassMap;
    }
    public static TShortObjectHashMap<Set<Class<?>>> getEventListenerHandlerClassMap(){
        return eventListenerHandlerClassMap;
    }
    public static TIntObjectHashMap<Class<?>> getNetEventListenerHandlerClassMap(){
        return netEventListenerHandlerClassMap;
    }

    public static Map<Class<?>, List<Method>> getUpdatableClassMap() {
        return updatableClassMap;
    }

    public static Map<Class<?>,Class<?>> getServiceClassMap(){
        return serviceClassMap;
    }
    public static Class<?> getOriginServiceClass(Class<?> cls){
        return serviceOriginClass.get(cls);
    }
    public static Map<Integer,Map<Class<?>,Method>>  getInitMethodMap() {
        return initMethodMap;
    }

    public static Map<Class<?>, Method> getDestroyMethodMap() {
        return destroyMethodMap;
    }

    public static Map<String, Method> getGmMethod() {
        return gmMethod;
    }

    //
    private static void addMethodToMap(Map<Class<?>,List<Method>> map,Class<?> cls,Method method){
        if(map.containsKey(cls)){
            List<Method> list=map.get(cls);
            list.add(method);
        }else{
            List<Method> list=new ArrayList<>();
            list.add(method);
            map.put(cls,list);
        }
    }
    // 生成request的处理类
    private static Class generateRequestHandlerClass(Class clazz, Class<?> oriClass) throws Exception{
        Map<Short,String> opMethods = new TreeMap<Short,String>();
        Method[] methods = oriClass.getDeclaredMethods();
        for(Method method:methods){ //遍历所有方法,将其中标注了是包处理方法的方法名加入到opMethods中
            if(method.isAnnotationPresent(Request.class)){
                Request op = method.getAnnotation(Request.class);
                Class[] parameterTypes= method.getParameterTypes();
                //检查方法的合法性
                // 检查参数
                if(parameterTypes.length != 2){
                    throw new IllegalStateException("Method "+method.getName()+" Parameter Error");
                }
                if(parameterTypes[0] != Object.class || parameterTypes[1] != Session.class){
                    throw new IllegalStateException("Method "+method.getName()+" Parameter Error");
                }
                // 检查返回值
                if(method.getReturnType()!=RetPacket.class){
                    throw new IllegalStateException("Method "+method.getName()+" ReturnType Error");
                }
                opMethods.put(op.opcode(), method.getName());
            }
        }
        if(opMethods.size() > 0){
            ClassPool pool = ClassPool.getDefault();

            CtClass oldClass =  pool.get(clazz.getName());
//			log.info("oldClass: " + oldClass);
            CtClass ct = pool.makeClass(oldClass.getName()+"$Proxy", oldClass); //这里需要生成一个新类,并且继承自原来的类
            CtClass superCt = pool.get(RequestHandler.class.getName());  //需要实现RequestHandler接口
            ct.addInterface(superCt);
            //添加handler方法,在其中添上switch...case段
            StringBuilder sb = new StringBuilder("public com.mm.engine.framework.net.code.RetPacket handle(" +
                    "int opcode,Object clientData,com.mm.engine.framework.data.entity.session.Session session) throws Exception{");
            sb.append("com.mm.engine.framework.net.code.RetPacket rePacket=null;");
            sb.append("short opCode = opcode;");//$1.getOpcode();");
            sb.append("switch (opCode) {");
            Iterator<Map.Entry<Short,String>> ite = opMethods.entrySet().iterator();
            while(ite.hasNext()){
                Map.Entry<Short, String> entry = ite.next();
                sb.append("case ").append(entry.getKey()).append(":");
                sb.append("rePacket=").append(entry.getValue()).append("($2,$3);"); //注意,这里所有的方法都必须是protected或者是public的,否则此部生成会出错
                sb.append("break;");
                //opcodes.add(entry.getKey());
            }
            sb.append("}");
            sb.append("return rePacket;");
            sb.append("}");
            CtMethod method = CtMethod.make(sb.toString(), ct);
            ct.addMethod(method);

            return ct.toClass();
        }else{
            return clazz;
        }
    }
    // 生成event的处理类
    private static Class generateEventListenerHandlerClass(Class clazz , Class<?> oriClass) throws Exception{
        Map<Short,List<String>> opMethods = new TreeMap<Short,List<String>>();
        Method[] methods = oriClass.getDeclaredMethods();
//        Method[] methods = clazz.getMethods();
        for(Method method:methods){ //遍历所有方法,将其中标注了是包处理方法的方法名加入到opMethods中
            if(method.isAnnotationPresent(EventListener.class)){
                EventListener op = method.getAnnotation(EventListener.class);
                Class[] parameterTypes= method.getParameterTypes();
                //检查方法的合法性
                // 检查参数
                if(parameterTypes.length != 1){
                throw new IllegalStateException("Method "+method.getName()+" Parameter Error");
            }
            if(parameterTypes[0] != EventData.class){
                throw new IllegalStateException("Method "+method.getName()+" Parameter Error");
            }
            // 一个类中可能存在多个对该事件的监听
                if(opMethods.containsKey(op.event())){
                    opMethods.get(op.event()).add(method.getName());
                }else{
                    List<String> methodNames=new ArrayList<>();
                    methodNames.add(method.getName());
                    opMethods.put(op.event(), methodNames);
                }
            }
        }
        if(opMethods.size() > 0){
            ClassPool pool = ClassPool.getDefault();
            CtClass oldClass =  pool.get(clazz.getName());
            CtClass ct = pool.makeClass(oldClass.getName()+"$Proxy", oldClass); //这里需要生成一个新类,并且继承自原来的类
            CtClass superCt = pool.get(EventListenerHandler.class.getName());  //需要实现RequestHandler接口
            ct.addInterface(superCt);
            //添加handler方法,在其中添上switch...case段
            StringBuilder sb = new StringBuilder("public void handle(" +
                    "com.mm.engine.framework.control.event.EventData eventData) throws Exception{");
            sb.append("short event = $1.getEvent();");//$1.getOpcode();");
            sb.append("switch (event) {");
            Iterator<Map.Entry<Short,List<String>>> ite = opMethods.entrySet().iterator();
            while(ite.hasNext()){
                Map.Entry<Short, List<String>> entry = ite.next();
                sb.append("case ").append(entry.getKey()).append(":");
                for(String meName : entry.getValue()){
                    sb.append(meName).append("($1);"); //注意,这里所有的方法都必须是protected或者是public的,否则此部生成会出错
                }
                sb.append("break;");
                //opcodes.add(entry.getKey());
            }
            sb.append("}");
            sb.append("}");
            CtMethod method = CtMethod.make(sb.toString(), ct);
            ct.addMethod(method);
            return ct.toClass();
        }else{
            return clazz;
        }
    }
    private static Class generateNetEventListenerHandlerClass(Class clazz, Class<?> oriClass) throws Exception{
        Map<Integer,String> opMethods = new TreeMap<Integer,String>();
        Method[] methods = oriClass.getDeclaredMethods();

        for(Method method:methods){ //遍历所有方法,将其中标注了是包处理方法的方法名加入到opMethods中
            if(method.isAnnotationPresent(NetEventListener.class)){
                NetEventListener op = method.getAnnotation(NetEventListener.class);
                Class[] parameterTypes= method.getParameterTypes();
                //检查方法的合法性
                // 检查参数
                if(parameterTypes.length != 1){
                    throw new IllegalStateException("Method "+method.getName()+" Parameter Error");
                }
                if(parameterTypes[0] != NetEventData.class){
                    throw new IllegalStateException("Method "+method.getName()+" Parameter Error");
                }
                // 检查返回值
                if(method.getReturnType()!=NetEventData.class){
                    throw new IllegalStateException("Method "+method.getName()+" ReturnType Error");
                }
                opMethods.put(op.netEvent(), method.getName());
            }
        }
        if(opMethods.size() > 0){
            ClassPool pool = ClassPool.getDefault();
            CtClass oldClass =  pool.get(clazz.getName());
            CtClass ct = pool.makeClass(oldClass.getName()+"$Proxy", oldClass); //这里需要生成一个新类,并且继承自原来的类
            CtClass superCt = pool.get(NetEventListenerHandler.class.getName());  //需要实现RequestHandler接口
            ct.addInterface(superCt);
            //添加handler方法,在其中添上switch...case段
            StringBuilder sb = new StringBuilder("public com.mm.engine.framework.control.netEvent.NetEventData handle(" +
                    "com.mm.engine.framework.control.netEvent.NetEventData netEventData) throws Exception{");
            sb.append("com.mm.engine.framework.control.netEvent.NetEventData rePacket=null;");
            sb.append("int event = $1.getNetEvent();");//$1.getOpcode();");
            sb.append("switch (event) {");
            Iterator<Map.Entry<Integer,String>> ite = opMethods.entrySet().iterator();
            while(ite.hasNext()){
                Map.Entry<Integer, String> entry = ite.next();
                sb.append("case ").append(entry.getKey()).append(":");
                sb.append("rePacket=").append(entry.getValue()).append("($1);"); //注意,这里所有的方法都必须是protected或者是public的,否则此部生成会出错
                sb.append("break;");
            }
            sb.append("}");
            sb.append("return rePacket;");
            sb.append("}");
            CtMethod method = CtMethod.make(sb.toString(), ct);
            ct.addMethod(method);
            return ct.toClass();
        }else{
            return clazz;
        }
    }
    // 校验参数
    private static Class generateUpdatableHandlerClass(Class clazz, Class<?> oriClass) throws Exception{
        Method[] methods = oriClass.getDeclaredMethods();
        for(Method method:methods){ //遍历所有方法,将其中标注了是包处理方法的方法名加入到opMethods中
            if(method.isAnnotationPresent(Updatable.class)){
                Updatable op = method.getAnnotation(Updatable.class);
                Class[] parameterTypes= method.getParameterTypes();
                //检查方法的合法性
                // 检查参数
                if(parameterTypes.length != 1){
                    throw new IllegalStateException("Method "+method.getName()+" Parameter Error");
                }
                if(parameterTypes[0] != Integer.class && parameterTypes[0] != int.class ){
                    throw new IllegalStateException("Method "+method.getName()+" Parameter Error");
                }
                // 检查注解
                if(op.isAsynchronous() && op.cycle()==-1 && op.cronExpression().length()==0){
                    throw new IllegalStateException("Method "+method.getName()+" annotation Error,cycle can't be default while update is asynchronous");
                }
            }
        }
        return clazz;
    }
}

redpajama_set_name: RedPajamaGithub


Can one day honouring a parent be more important than another? Yes it can.
To mark Mother's Day, The Dad Website's Daniel Lewis reflects on his mum, whose love (and likeness) has carried across the generations.
Struggling for ideas on how to spoil your other half on Mother's Day? Well, here's a list curated by a half dozen mums. You can thank us later.