In general terms, the Romans coined the name 'Gaul' to describe the Celtic tribes of what is now central, northern and eastern France. The Gauls were divided from the Belgae to the north by the Marne and the Seine, and from the Aquitani to the south by the River Garonne. By the middle of the first century BC, the Helvii were a minor confederation that was located on the west bank of the Rhone, in the modern Lozère département of south-eastern France. They were neighboured across the Alps to the north by the Vellavi, to the east by the Allobroges, Segovellauni, and Caturiges, to the south along the banks of the Rhodanus (the modern River Rhine) by the Vocontii, to the south-west by the Volcae Arecomisci, and to the west by the Ruteni.
The Helvii were a polity rather than a tribe (and certainly not a sub-tribe, according to Julius Caesar). Also known as the Elui, their name is a little tricky to break down. The word *selwā means 'possessions' in conjectural proto-Celtic, and appears in at least two other tribal names - the Helvetii and the Helveconae. The 's' of 'selwa' would be pronounced as 'sh', and was reduced to an 'h'. It gives the sense that all three tribes were in some way known as the 'owners'. Given the similarity of the names for the Helvetii and Helveconae, they could well be branches of the same original tribe, despite the distance between them in the first century BC. The '-et' in Helvetii could be a diminutive, making them the 'little owners'. Although it would seem from this that the Helvii could once have been the dominant part of a greater confederation, they appear to have arrived at the Alps at least a generation earlier than the Helvetii.
The Helvii polity was based in the southern area of the modern Ardeche, with a principal settlement at Alba (modern Aps until 1904, and now known as Alba-la-Romaine). Following the Roman campaign of 123-121 BC they formed the transition between Roman-controlled territory and the rest of Gaul. Apparently highly accepting of such a position (in all but one known instance), they became Romanised in name and probably benefited greatly from Roman imports. Once their important border status was ended by the conquest of the rest of Gaul, they largely passed out of the historical record, but continued to inhabit a rich and fertile region.
The Allobroges come into direct conflict with Rome following the latter's defeat of the Salluvii. That tribe's king, Tuto-Motulus, flees northwards and seeks shelter with the Allobroges. They welcome him in, and when Rome demands that he is handed over, they refuse. Having declared war, Rome sends Quintus Fabius Maximus to attack them in 121 BC. He is the son of Quintus Fabius Maximus Aemilianus, consul of 145 BC, and is consul himself during this year. He campaigns in Gallia Transalpina (the modern Auvergne and Rhône-Alpes regions) with Gnaeus Domitius Ahenobarbus, fighting the Allobroges, Arverni, and Helvii. They are defeated and the consul is awarded the honour of a triumph which is famous for its spectacle, with the Arverni ruler, Bituitus, being displayed in his silver battle armour. The Ruteni, Segovellauni, Vocontii, and Volcae Arecomisci are subjugated at the same time.
Unlike many of their Gaulish counterparts, the Helvii seem especially to welcome Rome, forming an alliance with what most other Celts view as invaders. A leader of the polity, Caburus, is now granted Roman citizenship by Gaius Valerius Flaccus, governor of Gaul. This is an extraordinarily rare honour at this point in time, suggesting that he has rendered some unique and invaluable service to Rome, possibly during the city's civil wars of this period.
Magistrate and Roman citizen. Killed by the Gabali and Arverni?
The Sertorian War in Hispania causes the Celts of Mediterranean Gaul to be subjected to troop levies and forced requisitions in order to support the military efforts of Metellus Pius, Pompeius, and other Roman commanders against the rebels. However, some Celtic polities, including, remarkably, the Helvii, support Sertorius and they pay the price for their support after his assassination. The Helvii and Volcae Arecomici are forced to cede a portion of their territory to the Greek city state of Messalina. Caesar mentions this land forfeiture but does not provide any details of the Helvii actions against Rome.
Led by Caburus, the Helvii have formed an alliance with Rome. During the campaigns of Julius Caesar in Gaul, they supply auxiliaries to his forces. Caburus also supplies his sons, with Caius Valerius Donotaurus (Domnotaurus or Donnotarvos) being killed in action in 52 BC and Gaius Valerius Troucillas serving Julius Caesar as an aide-de-camp in a diplomatic capacity in 58 BC.
Son. 'Principle man of the state'. Killed in battle.
Brother. ADC on Caesar's staff in 58 BC.
While Caesar is tied down in Rome, the Gauls begin their revolt, resolving to die in freedom rather than be suppressed by the invaders. The Carnutes take the lead under Cotuatus and Conetodunus when they kill the Roman traders who have settled in Genabum. News of the event reaches the Arverni that morning, and Vercingetorix summons his people to arms. He sends Lucterius of the Cadurci into the territory of the Ruteni to gain their support, and marches in person to the Bituriges. Lucterius continues to the Gabali and Nitiobroges and wins their support, collecting together a large force ahead of an advance into the province of Narbonensis. Caesar gets there first and rallies the garrisons among the Ruteni and Volcae Arecomisci, and Lucterius is forced to retreat. From there Caesar circles through the territory of the generally pro-Roman Helvii (who again provide auxiliaries) to reach that of the Arverni, despite deep winter snows in the mountains.
The Gabali and the easternmost Arverni cantons are subsequently sent to fight the Helvii, and the Cadurci and Ruteni are told to lay waste the territories of the Volcae Arecomisci. The Helvii are defeated and their leaders slain, including Caius Valerius Donotaurus, the son of Caburus (and perhaps Caburus too, as he is not mentioned again in the historical record). The Allobroges manage to defend their frontiers successfully. Vercingetorix is eventually forced to withdraw in good order to Alesia, a major fort belonging to the Mandubii. Caesar begins a siege of the town, aiming on starving out the inhabitants.
Four relief forces amounting to a considerable number of men and horses are assembled in the territory of the Aeduii by the council of the Gaulish nobility. Among those demanded from the tribes of Gaul are eight thousand men each from the Helvii (despite the tribe's pro-Roman standing which has perhaps been terminated by the apparent death of its long-lived leader), Parisii, Pictones, and Turones. Together they attempt to relieve Vercingetorix at the siege of Alesia, but the combined relief force is soundly repulsed by Julius Caesar. Seeing that all is lost, Vercingetorix surrenders to Caesar. The garrison is taken prisoner, as are the survivors from the relief army. They are either sold into slavery or given as booty to Caesar's legionaries, apart from the Aeduii and Arverni warriors who are released and pardoned in order to secure the allegiance of these important and powerful tribes.
During the Roman civil wars of this decade, the Greek city state of Messalina elects to maintain its long-standing relationship with Pompeius even though it is isolated in this desire. The Celts of the Narbonensis continue to support Caesar in opposition. As a result, the Massalians are besieged and defeated by Caesar, and they lose their independence, and possibly also the Helvii land that they had formerly been granted.


text:
About CLASS
CLASS publications
Non-CLASS publications
Workers' Voices
CLASS in the news
Search Class
The Trade Union Bill Impact Assessment: Adding insult to injury
Jo Stevens MP
In addition to the debate in the House of Lords, which saw an embarrassing government defeat on the undemocratic party funding proposals in the Trade Union Bill of 327 votes against, to 234 in favour, the government released its long-awaited impact assessment of the bill.
For many of us the question remained - how could the Tories possibly justify their decision to target the largest, democratic, grassroots organisation in the country in the way they have done in the bill? For those of you who haven't yet read the mammoth 112 pages of the impact assessment - spoiler alert: it's not included.
In fact, those of us hoping to find answers to any of the substantial questions posed during scrutiny of the legislation were once again bitterly disappointed by the release of the report. It really is a shame that the Tories don't subject themselves to a fraction of the transparency that they are so keen to impose on unions.
And if the content was bad then the fact that such an important document of public concern was so silently released is even worse. If only David Cameron was as vocal of the serious impact of Tory legislation on the wider public as he is during his pre-prepared jokes at Prime Minister's Question Time.
The impact assessment on union finances is the first issue dealt with in the report and doesn't make for pleasant reading. It shows that unions will face costs in excess of £11.2 million and the financial burden doesn't end there. As well as this initial outlay, unions - and ultimately union members paying their subs - will be subjected to another £26 million over the five year period subsequent to the passing of the bill.
This is further proof - not that it was required - that the bill is a blatant attempt by the Tories to inflict yet more red tape on unions.
It also serves to hinder unions in the vital service they provide to members by diverting money away from providing support, advice and a much-needed lifeline in the workplace, to, what the report repeatedly explains away as, "familiarisation costs" "administrative costs" and other "new costs" which can all be attributed to Government-imposed bureaucracy.
This also assumes that the same government, who have shown their failure to grasp how unions operate time and time again during debates on the legislation that I have been involved in, have not missed anything this time. In fact, the TUC deems these figures to be too modest and expects the financial burden on unions to be significantly greater.
As if that wasn't bad enough, the report adds insult to injury.
Buried in the report lies the Tories' favourite disclaimer: "None of these changes are about banning strikes". Instead there is talk of the importance of unions having a "democratic mandate". Funny that the Tories have chosen to focus on this rather than their own democratic mandates as only 56 out of the 330 Tory MPs elected at the last General Election received the levels of support they deem necessary for industrial ballots.
If the onus was really on promoting democracy within the trade union movement then why are alternative methods of conducting union ballots not explored? Workplace or e-balloting were serious options raised by myself and colleagues in the House, as well as by representatives from the trade union movement and beyond, but were all repeatedly dismissed without consideration.
Those looking for recognition of the vital work played by unions will also be bitterly disappointed. In fact the best that the report does is acknowledge "Trade unions can play an important role in the workplace". Faint praise indeed. Perhaps the government should instead consult the Survation poll showing that 77% of the public view trade unions as "essential" in protecting workers rights, or, you know, the 6 million trade union members across the UK. Just a thought.
This, of course, is hardly surprising. During my stint on the bill committee, it soon became clear that first and foremost the Tories have a fundamental lack of understanding, or appreciation, when it comes to trade unions.
They do not see unions as a force for good, campaigning for better employment rights for those across the country. They do not see them as a vehicle for promoting equality and social change. They do not see them as providing working people with a much-needed collective voice. They see them, pure and simple, as a threat. A threat to the reign of a perpetual Tory Government - and how do you deal with something you feel threatened by? Cut off its resources and take away its voice, just as this bill hopes to do to the union movement.
The Tories can do their best but they have seriously underestimated the difficulty of silencing the collective voice and this is why we hope you'll continue to stand with us and voice your opposition to the bill.
This blog originally appeared on the TUG website and is cross posted here with permission.
Work areas: Economy and Industry. Tags: fair economy, politics, trade unions, workers rights.
Labour's Small Business Manifesto Assessed
Tackling Excessive Pay
© CLASS 2017 | About | Contact us | Privacy and cookies | Website by Social Spark

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: How to turn List results into variables? (PowerShell) I have what is probably a simple question.
My goal is to turn the results of the get-appvclientpackage cmdlet into a list from which I can take the product names and execute commands with each of the results as a different variable.
I have below my simple code:
    $installedpackages = get-appvclientpackage
    $displayedpackages =
    $installedpackages | Format-List -property Name
    Foreach ($package in $displayedpackages)

That is about as far as I get. I can get it to display the list as I require but I need the results of the list to be assigned to variables that I can use to execute with strings later on in my full script.
Been through switch statements and I can get around the same result but never able to get the results assigned to variables. Any tips would be awesome!

redpajama_set_name: RedPajamaStackExchange


text:
A.A. Trivia Quiz – May
Test your A.A. knowledge!
Which of these chapters was included in the first edition of the Big Book, but was later excluded in the subsequent editions?
a) "The Vicious Cycle"
b) "Fear Of Fear"
c) "Freedom From Bondage"
d) "The Unbeliever"
2. One of AA's biggest bursts of early publicity came in 1940, when a certain businessman and philanthropist gave a dinner for New York A-listers in order to publicize AA's mission. Who was the businessman?
a) John Hopkins
b) John D. Rockefeller Jr.
c) Julius Rosenwald
d) Henry Ford
3. Who was the third member of A.A.?
a) Martin R.
b) Bill D.
c) Dr. Bob
d) Henry P.
4. How many "Steps" did the early form of A.A. have in 1935?
a) 12, of course!
c) 10
5. Which actor played the title role of Bill Wilson in the 1989 Hallmark Hall of Fame film My Name Is Bill W.?
a) James Garner
b) James Woods
c) Tom Selleck
d) Michael Landon
Stumped? Answers here.
Like the quiz? Subscribe now to the East Bay Intergroup Newsletter.


Tosha Owens is on the "right" side of #1!
This entry was posted in Phil's Faves: Albums and tagged Are You Listening?, Billy Brandt and Sarana VerLin, Bobby Pennock, Buddha Pesto Manifesto, Champion, Circling the Moon: The Songs of Mike Stephens, Dave Carudo, Detroit 2 Nashville, Heavy Duty, Joe Peters, Katy Guillen and The Girls, MJ Bishop, Nick Urb, Nora Jane Struthers and The Party Line, Psychsploitation Today, Sarah Jane Scouten, The Jesse Xavier Band, The Prefab Messiahs, The Wrong Side of Right, Tosha Owens, Until the End of Days, When the Bloom Falls From the Rose. Bookmark the permalink.


These earrings feature 100% natural fossil coral stones accented with natural iron pyrite beads. Fine 14k gold filled construction and earwires or sterling silver. Easy, warm neutrals are at home anywhere you are.


text:
Buffalo African American Funeral and Obituary Collection
Archives & Special Collections: Buffalo African American Funeral and Obituary Collection
Title: Buffalo African American Funeral Program & Obituary Collection
Date Span: 1948-2007
Creator: Buffalo Genealogical Society of the African Diaspora (BGSAD)
Donor: Buffalo Genealogical Society of the African Diaspora (BGSAD)
Date of Acquisition: 2002, 2007
Extent: 5 reels of microfilm; physical collection located at the Frank E. Merriweather Public Library
Location: Monroe Fordham Regional History Center, Archives & Special Collections Department, E. H. Butler Library, SUNY Buffalo State
Processed: Processed and imaged 2007, Lynn Lombardo; Reprocessed 2017, Mat Crissey
Access: Collection is open for research.
See Archivist for information on reproducing materials from this collection, including photocopies, digital camera images, or digital scans, as well as copyright restrictions that may pertain to these materials.
[Description and dates], Box/folder/microfilm number, NAME OF COLLECTION, The Monroe Fordham Regional History Center, Archives & Special Collections Department, E. H. Butler Library, SUNY Buffalo State.
Collection Summary:
A collection of funeral service programs, occasionally with accompanying newspaper obituary. Programs include: photographs of the deceased with date of birth and death, a poem and/or Bible passage, names of the pall-bearers, a 'thank you' section, location of the funeral, an obituary, date and time of the service, and location of the interred.
Volume #2 – (2007) roll 3 of 3 contains Hall/Ralston family genealogy materials. This includes: Hall/Ralston family reunion, photographs, census information, descendants of William Rolston, Samuel Hall, Joseph Smith, William L. Smith, and Charles H. Williams.
Scope and Contents: funeral service programs; newspaper obituaries; photographs; and census information.
Arrangement: Names listed alphabetically (last name, first name.)
Inventory: Please see separate inventory .pdf for name listings.
Introduction to Volume I & II
Volume I Introduction:
The Buffalo Genealogical Society of the African Diaspora (BGSAD) was founded in Buffalo, NY in 1997 by Sonia L. Walker and Robert N. Davis, Jr. It was incorporated in the state of New York under New York Education Law in 1999.
The focus of the organization has been that of an educational entity, encouraging and promoting the use of genealogy/family history as a tool for understanding the socio-historical context of people of African descent in the U.S.A.
The purpose of the collection is to preserve the biographical and historical information that is found in printed funeral programs from the African-American community. The project evolved from a discussion about the photographic and biographical information that is generally found in the program that is distributed during funeral proceedings. The information holds great research potential for those involved in investigating and preserving family history and genealogical connections locally and nationwide.
Discussion with representatives from other genealogical organizations (from numerous ethnic groups and religious denominations) revealed that preserving individual and family history in this form is a tradition that is unique among American ethnic groups. We concluded that the evidence of this tradition should be preserved. The insights that were gained from assembling Volume 1 will guide us as we move forward. The project is open-ended with future plans being developed that include placing the original materials on permanent loan at a public institution and developing a web-based searchable index.
The main sources of material for Volume I of the project were individual contributions, with special thanks to Mr. Winfred Williams of Fast Press for the donation of his time and materials. Contributions were made by various members of the organization in the form of time and effort in the solicitation, sorting, packaging, review and storage of the materials. This also included donated materials from their own collections. Without the ongoing effort of the membership, the successful continuation of this project would not be possible.
-Robert Davis, Jr., 2002
Volume II Introduction:
The Buffalo Genealogical Society of the African Diaspora (BGSAD) is extremely pleased to expand its collaboration with the Buffalo and Erie County Public Library by submitting Volume 2 of its Buffalo African American Funeral Program Collection. The original materials for Volume I are already on permanent loan in the William A. Miles Center for African and African American Studies at the Frank E. Merriweather Jr. Branch of the library system. BGSAD was incorporated under New York State Education Law in 1999, and it focuses on promoting genealogical research methods. Rooted in African American tradition, printed funeral programs preserve biographical and historical information, provide insight on African American experiences, and serve as genealogical source material.
We are grateful to the Afro-American Historical Association of the Niagara Frontier for recognizing the value of this collection and for providing genealogical supplies and for microfilming volume l and volume 2. Special thanks to Dr. Monroe Fordham, for his guidance, and to Dr. Fordham and Mrs. Freddie Fordham for preparing an index for the collection. The main sources of material for Volume 2 of this project, completed in 2007, were individual contributions, with special thanks to Mrs. Ruth Brown, for the donation of materials. The microfilming was done by Lynn Lombardo working under Buffalo State College's Center for Regional History. As members of BGSAD we hope that this effort will assist the public in researching genealogy and family history.
In the human experience the only thing that is constant, is change. As an organization, BGSAD continues to provide assistance to persons with an interest in genealogy. Since the assembly of Volume 1 in 2002, we have lost two of our most devoted members with the deaths of Mrs. Brontie Mostiller and our co-founder, Robert N. Davis, Jr. We dedicate this volume to their memory.
-Sonia Walker, President, 2007
Downloadable Finding-Aid and Inventory
Buffalo African American Funeral Program & Obituary Collection Finding-Aid
List of Names & Inventory: Volume I (A-Z)
List of Names & Inventory: Volume II (A-Z)


Beijing, July 4 : China is all set to witness the number of its shopping centres reaching 4,000 by 2015, an official with the China Chain Store & Franchise Association (CCSFA) said Thursday.
The country's retail chain stores improve management efficiency, expand operation channels and integrate online and offline business models, Xinhua reported.
According to the statistics of the CCSFA, the country's official representative of retailing and franchise industry, there were 3,000 shopping centres across the country in 2012, with a gross floor area of 200 million square metres.
Macau, July 4 : Bollywood actress Parineeti Chopra says she would love to perform on stage with her star cousin Priyanka Chopra.
"I would love to perfome with her. She is one of the best dancers we have," Parineeti of "Ishaqzaade" fame told IANS.
The 24-year-old, who is here for the 14th International Indian Film Academy (IIFA) awards, says she grew up watching Priyanka and other celebrities attending award functions and is now thrilled to be part of the festivities.
Macau, July 4 : Bollywood actors Abhishek Bachchan and Shahid Kapoor left handprints in a special cement mould as a part of the 14th International Indian Film Academy (IIFA) awards and celebrations, which kick started here Thursday.
Abhishek, who will also perform at the awards function Saturday after a gap of few years, was looking forward to the function.
Beijing, July 3 : The purchasing managers' index (PMI) for China's non-manufacturing sector stood at 53.9 percent in June, down from 54.3 percent in May, according to official data released Wednesday.
A PMI reading above 50 percent indicates expansion, while a reading below 50 percent indicates contraction.
The statistics were jointly released by the National Bureau of Statistics and the China Federation of Logistics and Purchasing (CFLP), reported Xinhua.
The Industrial and Commercial Bank of China has emerged as the biggest bank in the world indicating that the financial centre in the global economy is shifting towards east.
In terms of the balance sheet strength, the Industrial and Commercial Bank of China emerged on the top of the list of global banks with $160.6 billion in tier one capital. The bank recorded an annual profit of $49.1bn in 2012. The new report by the Banker magazine also showed that there were four state-owned Chinese banks in the top ten.
The People's Bank of China, China's central bank, has indicated that the country might have to `fine tune' its monetary policy as the economy faces liquidity crunch.
The remarks indicate that the authorities in the country are more likely to loosen monetary policy to improve the liquidity position in the world's second largest economy. Following the monetary policy committee's second-quarter meeting in Beijing, the central bank indicated that the country must be ready for fine tuning its monetary policy.
Beijing, June 19 - US General Motors Co. is set to recall about 231,000 older SUVs over fire risks and has urged owners to park them outside garages until they are repaired, a media report said.
The Detroit-based automaker agreed to recall 193,000 2006-2007 Chevrolet Trailblazer, GMC Envoy, Buick Rainier, SAAB 9-7x, Isuzu Ascender and 2006 Chevrolet Trailblazer EXT and GMC Envoy XL in the US, reported Xinhua.
The recall also includes 3,546 in Canada, 4,876 in Mexico and 30,000 outside North America, the Detroit News said.
Beijing, June 18 : China's actual use of foreign capital in May stood at $9.26 billion, up 0.29 percent year on year, the commerce ministry said Tuesday.
This is the fourth straight monthly increase since February, when China reported a FDI recovery after declining for eight consecutive months since June of 2012, reported Xinhua.
Beijing, June 17 : China Monday announced that it has built the world's fastest supercomputer which is capable of performing 33.86 quadrillion operations per second, surpassing the US Titan supercomputer.
The Tianhe-2 has a peak performance speed of 54.9 quadrillion operations per second, according to the National University of Defence Technology, which built the computer, reported Xinhua.
Beijing, June 17 : Chinese banks bought more foreign currency from clients than they sold in May, although the surplus was less than that of previous months, indicating relieved pressure from capital inflows.
The forex surplus hit $17.2 billion in May, marking the ninth straight month of surplus in bank-to-client forex transactions, the State Administration of Foreign Exchange (SAFE) said.
The surplus was far less than those recorded in the first four months of the year, coming in at roughly half of the $34.3 billion surplus recorded in April, reported Xinhua.
China's fourth-largest steelmaker, Ansteel has indicated that it expects the price of iron ore to fall during the second half of 2013 due to lower demand for steel in the world's second largest economy.
Beijing, June 8 : Aircraft giant Airbus will deliver over 100 passenger planes to China this year, the company said Saturday.
The market share of Airbus in China's wide-bodied aircraft market has now reached more than 60 percent, with over 110 Airbus A330 planes in operation, Xinhua cited the company as saying.
Fabrice Bregier, Airbus president and CEO, attributed the company's achievements in China to a strategy of carrying out extensive and in-depth cooperation with the country's aviation industry.
Beijing, June 6 : President Xi Jinping promised to protect the lawful rights and interests of investors as hundreds of businessmen gathered in the western city of Chengdu Thursday to discuss China's economic prospects.
In a message to the 2013 Fortune Global Forum, Xi told businessmen that China is a safe haven for investment opportunities, reported Xinhua.
"The Chinese government will, as always, protect the lawful rights and interests of investors, strengthen the protection of intellectual property rights and provide quality service to foreign companies," Xi wrote in the letter.
Guangzhou, June 5 : Chinese Super League club Guangzhou R&F officially appointed former England manager Sven-Goran Eriksson as the club's new coach until the end of 2014.
The club was reported to ink a contract of more than 2 million euros, and a one or two years optional clause, reports Xinhua.
"Mr. Eriksson is one of the most famous coaches in the world, we believe with his ability and experience we could do better in Chinese Super league," Lu Yi, vice president of the Chinese club said here Tuesday.
Share markets in China and Hong Kong continued to fall on concerns that the world's second largest economy has only made a fragile recovery following contrasting manufacturing surveys and tightened monetary supply in the economy.
Beijing, June 3 : China will start a pilot reform of data collection relating to fixed asset investment in 2013, so as to make economic statistics more reliable, the China Business News reported Monday.
The first pilots will be conducted in Jincheng of Shanxi province, Xi'an of Shaanxi province, Wuxi of Jiangsu province and Qiandongnan of Guizhou province, said Ma Jiantang, director of the National Bureau of Statistics (NBS), without specifying when they will begin.
The NBS plans to better monitor the data source to reveal trustworthy figures that can not be manipulated by local governments, reported Xinhua.
Beijing, June 3 : At least 112 people were killed and 54 injured Monday when a major fire engulfed a slaughterhouse in China's Jilin province, said authorities.
The fire broke out around 6 a. m. in the slaughterhouse owned by the Jilin Baoyuanfeng Poultry Company in Mishazi township of Dehui city, about 100 km northeast of the provincial capital Changchun, reported Xinhua.
Over 300 workers were in the plant when the fire began, said survivors who added they heard a sudden bang and then saw dark smoke fill the premises.
About 100 workers managed to escape from the plant, the gate of which was locked when the fire broke out.
Beijing, June 3 : China's non-manufacturing sector shrank slightly in May, according to new data released Monday.
The purchasing managers index (PMI) for the non-manufacturing sector stood at 54.3 percent in April, down from 54.5 percent for the previous month, the National Bureau of Statistics said in a statement.
According to the latest figures released, China's manufacturing activity has accelerated during the month of May indicating that the world's second largest economy might be recording stable recovery.
Beijing, May 30 : In a country of 300 million smokers and where two trillion cigarettes are produced every year, "smoking cessation clinics" seemed to be a promising business. But the results such clinics have produced show how far off the mark such an effort was.
According to the latest figures, 600,000 people develop lung cancer every year in China, accounting for one-third of the world's total.


text:
Pragmatie (von gr. pragma, Sache) bezeichnet einen Typ von Schriften des Aristoteles. Die Pragmatien sind die nicht zur Veröffentlichung gedachten, auch esoterisch genannten Schriften, (im Gegensatz zu den exoterischen Schriften, die zur Veröffentlichung gedacht waren). Der weitaus größte Teil der überlieferten Schriften, das Corpus Aristotelicum, besteht aus Pragmatien.
Der Ausdruck stammt daher, dass Aristoteles die wissenschaftliche Thematisierung eines bestimmten Sachgebiets pragmateia nennt.

Überwiegend bestehen die Pragmatien nicht aus stilistisch ausgearbeitetem Text, sondern sind durch grammatikalisch unvollständige Sätze, Gedankensprünge und Dubletten gekennzeichnet. Aufgrund dieses Stils wurden sie teilweise als Vorlesungsmanuskripte bezeichnet. Es ist weitgehend umstritten, dass sie in irgendeiner Form Grundlage der Vorlesungen des Aristoteles in der Akademie bzw. später im Lykeion waren und in diesen Einrichtungen studiert worden sind. Neben dem Stil stellt auch der Inhalt an den Leser große Ansprüche, da Aristoteles beim Adressaten große Vorkenntnisse fremder Texte und Theorien voraussetzt, deren Urheber in vielen Fällen nicht genannt wird. Verweise auf die exoterischen Schriften zeigen, dass deren Kenntnis ebenfalls vorausgesetzt wird. Die Dubletten und ausgearbeitetere Textpassagen lassen darauf schließen, dass Aristoteles mindestens in einigen Fällen an eine Veröffentlichung gedacht hat.

Nach Eckart Schütrumpf können sich die von ihm untersuchten Pragmatien (u. a. die Politik) hinsichtlich ihrer stilistischen Ausformung mit den Meisterwerken der attischen Prosa des 4. Jahrhunderts messen lassen. Darum weist er die These zurück, bei den betreffenden Schriften handele es sich um Vorlesungsskripte. Stattdessen seien sie als literarische Dokumente für ein (fachkundiges) Lesepublikum abgefasst worden.

Literatur
 Ralf Lengen: Form und Funktion der aristotelischen Pragmatie, Stuttgart 2002, ISBN 3515077987 (Dissertation 2000, Universität Freiburg)
 Eckart Schütrumpf: Form und Stil aristotelischer Pragmatien. In: Philologus 133 (1989), 177–191.

Anmerkungen

Aristoteles

redpajama_set_name: RedPajamaWikipedia


In the twentieth century, landfills were the designated places to dispose of things that people no longer needed or wanted. However, rising human populations have increased both competition for space and concerns regarding pollution. While industrial and domestic waste present societal and environmental challenges, there are also important opportunities associated with the recovery of materials destined for non-use or landfills. Since the early 2000s, there has been a growing emphasis on the reduction, reuse, and recycling of waste as a preferable alternative to the sanitary landfills of the twentieth century. These practices destabilize ideas of what constitutes waste material, whilst creating a space through which to consider the diversion of material from places designated for waste. As such, researchers are increasingly focused on the productive potential of waste as a social, cultural and material resource (Pickren 2014; Reddy 2015, Reno 2014).
Whereas the waste sector has made substantial contributions to the direct measurement, mitigation, and recovery of waste, social science and humanities scholars are theoretically and methodologically well-suited for contextualizing the decisions people make to reduce, reuse, recycle, or discard material considered 'waste' within a web of socio-cultural, economic, and geopolitical factors.
The role of waste in the social construction of the places in which we live and work.
Manuscripts should be submitted online at www.mdpi.com by registering and logging in to this website. Once you are registered, click here to go to the submission form. Manuscripts can be submitted until the deadline. All papers will be peer-reviewed. Accepted papers will be published continuously in the journal (as soon as accepted) and will be listed together on the special issue website. Research articles, review articles as well as short communications are invited. For planned papers, a title and short abstract (about 100 words) can be sent to the Editorial Office for announcement on our website.
The manuscript submission date is September 1st, 2017.


Preparing and preserving left over meat was a recurrent task for the cook or housewife living in the 19th century. At this time very few people had refrigerators and so meat had to be cooked and eaten, soon after it had been purchased. Mincing machines like the one featured on this leaflet were introduced in the 1850s and were immediately very popular. Scraps and leftovers could be minced together and seasoned and made into pies to be eaten for the following day's lunch.


Sanctuary Moon was the first vegan-principled animal sanctuary I visited and photographed. And I just can't get enough of them! Rachel and Ryan are so passionate about animal rights, activism, and advocacy, and giving the residents the best care and dedication possible. Visiting was a life-changing experience.
Sanctuary Moon is a microsanctuary, settled on 3.5 acres in Lowell, Michigan. It is the only animal sanctuary in Kent County founded and run on vegan principles. The 30+ residents include chickens, goats, and ducks. They specialize in rescuing roosters, who are so often misunderstood, unwanted, and dumped.


text:
VALA Events 2013: Library Space Oddity
VALA Guest Speaker Event
Library Space Oddity…
A rare opportunity to hear from two of the leading lights in Australian library design when Mal Booth (UTS) and Patti Manolis (Geelong Regional Library) join forces for a special VALA event.
Using Design Thinking in Libraries – presented by Mal Booth
View the slideshow of the presentation
"Design Thinking isn't a panacea to all of life's problems, but it does help in the right circumstances and as it can be applied quite flexibly, it is a bit of fun and a productive way to approach some rather onerous challenges" – Mal Booth.
Various design challenges have presented themselves at the University of Technology, Sydney (UTS), Library in recent years. These have principally involved spaces, services and their organisation, and many have been successfully overcome with the use of Design Thinking (DT) Processes. Mal Booth will speak about how UTS started along the path of applying DT and how the UTS library staff have progressed through mentorships, partnerships and projects to successfully implementing DT themselves and even running their own workshops to share some of their in-house processes. He will illustrate his presentation with real examples of planning processes, in-house projects and mentoring.
Planning a Library From The Ground Up – presented by Patti Manolis
View the pdf of the presentation
"Public libraries are an essential ingredient in the recipe for community wellbeing" – Patti Manolis
The City of Greater Geelong recently announced funding for a new Geelong Library and Heritage Centre to be located in Geelong's Cultural Precinct. Patti Manolis will talk about the planning of this new exciting multistorey central library for the Geelong Regional Library Corporation Network. The iconic architecturally designed building will provide central library services for the region's network of libraries and stand as a key cultural and learning institution in the centre of the City.
About our Speakers
Mal Booth is part of the management team at UTS Library and responsible for Library operations, planning the Library of the Future (which will incorporate an automated Library Retrieval System) and providing strategic guidance to their RFID project. He was formerly Head of the Research Centre at the Australian War Memorial and responsible for its library, archive and the Memorial's web strategy, specifically with regard to the use of Web 2.0 initiatives. Since 2001 he has been an advocate for digital convergence in the delivery of web services and resources via the cultural institution's websites. From 2006 to 2008 he curated the Lawrence of Arabia & the Light Horse exhibition combining the physical exhibition and many curator-led tours with a dynamic online presence via a blog and digitised war diaries from the Australian Light Horse. In late 2008 he made the first curatorial visit to a war zone by one of the Memorial's librarian/archivists to identify, record and collect records of war from Australian forces before they withdrew from Iraq.
Patti Manolis is the Chief Executive Officer of the Geelong Regional Library Corporation, a role she has undertaken for 6 years. The Corporation provides library services to 4 Local Government areas from a growing network of 16 libraries and two mobile libraries. The organisation has undergone major transformation including significant cultural change as well as new library building developments and refurbishments. Patti's activities include membership of the Bill and Melinda Gates Foundation's International Network of Emerging Library Innovators, Cohort One comprising 18 members from around the world. She has been a working group member on a number of State Library of Victoria landmark research projects including Libraries Building Communities; Dollars, sense and public libraries; and currently for a project documenting the cultural benefits of public libraries. In 2003 Patti was awarded the State Library of Victoria's Margery C Ramsay Scholarship which funded a study tour of Libraries in Timor- Leste which led to the establishment of Libraries for Timor-Leste Inc which supports the development of libraries in the very new nation of Timor-Leste. Patti has worked in public libraries for over 30 years and has loved every minute of it. She believes strongly that they are an essential ingredient in the recipe for community wellbeing.
Follow the links below and register to attend – registration is free.
Not a VALA member?
Visitors are welcome at VALA meetings – but registration is essential!
Dulcie Hollyock Room
Ground Floor, Baillieu Library,
University of Melbourne.
(Public transport via train or tram.
On-street parking in surrounding area – have gold coins available.)
Wednesday 28 August 2013, 5:30 for 6:00 – 7:30pm
Complimentary drinks and nibbles on arrival; join us afterwards for pay-as-you-go dinner with VALA Committee and our Speakers at University House.
Dinner RSVP: Please RSVP by 5.00 p.m. Monday 26 August to: vala@vala.org.au or (03) 9844 2933, clearly indicating that you will be joining us for dinner.
For any enquiries contact VALA Secretariat via vala@vala.org.au or (03) 9844 2933


Calvin Walton, the artist, was born in Athens, Tennessee. His interest and talent in the arts seemed always to be present. As a young boy drawing and creating came second nature. His love of art grew and his talent flourished throughout his school years. Convinced that art was at his core, Calvin embarked on a journey to develop his own unique style.


It is outstandingly comfortable to wear English painters hat and English artist hat thanks to its new contents, which always manages to maintain the optimum temperature no matter whether it is warm or cold.
1 Store a beret in a cool place.
2 Choose a felt hat protection spray.
3 Spray it on a felt beret to against rain and stains.
4 Do not touch the top of a beret.


text:
Q: Detectar por javascript que mi navegador se muestra en movil Buenas, una función o método en javascript que detecte que mi web se muestre en web o en dispositivo móvil.

A: Mira este codigo es el que yo siempre utilizo para poder pobrarlo debes abrir la consola y darle a la opcion "toggle device toolbar" para que te lo reconosca como mobile de lo contrario de retornara null.

var mobile = {
  Android: function() {
    return navigator.userAgent.match(/Android/i);
  },
  BlackBerry: function() {
    return navigator.userAgent.match(/BlackBerry/i);
  },
  iOS: function() {
    return navigator.userAgent.match(/iPhone|iPad|iPod/i);
  },
  Opera: function() {
    return navigator.userAgent.match(/Opera Mini/i);
  },
  Windows: function() {
    return navigator.userAgent.match(/IEMobile/i);
  },
  any: function() {
    return (mobile.Android() || mobile.BlackBerry() || mobile.iOS() || mobile.Opera() || mobile.Windows());
  }
};

console.log(mobile.any())
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Mobile</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
 <script src='app.js'></script>
</body>
</html>

A: Mira este post amigo: https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser
Dice que podrias usar Para poder Verificar que sea un dispositivo mobile segun su sistema operativo:
Usando Regex
    window.mobileAndTabletcheck = function() {
  var check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;
};

A: Depende de a qué te refieras con "dispositivo móvil". Si lo que quieres es detectar dispositivos con resoluciones bajas puedes utilizar el método matchMedia para detectar si el dispositivo tiene una resolución menor que una que tú especifiques:

for (var res=2500; res>0; res-=200){
  console.log('Resolución menor de ' + res + ' px: ' +
    window.matchMedia('(max-width: ' + res + 'px)').matches);
}

Otra técnica es la de comprobar el nombre del navegador o agente utilizado para ver si corresponde con alguno de los que se utiliza en dispositivos móviles pero esto implica tener que mantener en tu código una lista completa y actualizada lo cual puede resultar muy complicado.


I made this birthday card for my daughter for her 19th.Oh my,yep I'm old enough to have a daughter that age lol. And don't worry I have another one creeping around the corner as well. Why is it that when you want to be happy for your child, you know turning 19 ,being excited for her.... but all you wanna do is cry cause that means your older ? lol. I am happy for her just sad ...cause I'm OLD.
Well I used a Magnolia stamp called Tilda with ice cream sundae( I think lol) I'm hoping it looks more cupcakeish. I colored my image to match papers from Lili of the Valley. I added some WOC flowers and ribbon and tada...I did have a cute charm that I was gonna add to the card and totally forgot ooops lol!
Awesome card love your colouring...I have a birthday around the corner..just kidding I do not love your work..thks for taking the time to share!!
Lovely card! Thanks for joining us at Tilda's Town this week.


A global, membership-based alliance of organizations involved in the testing, standardization and certification of advanced mobility systems and services.
To develop and grow an international portfolio of smart mobility testbeds that meet the highest quality implementation and operational standards.
IAMTS will carefully select the providers of membership services, define applicable registration and qualification processes and approvals, and define process for regular review and confirmation based on customer feedback and performance. Contact information of registered and approved service providers will be made available via a database to the members.
An important aspect of the membership model is to provide opportunities to Members to become a service provider as well as to provide incentives to corporate Members to utilize services through the Alliance. Below is an overview about the membership services that are contemplated for IAMTS. Get involved today to help prioritize, define and develop the qualification processes for these services.
Excerpt: Testing vehicles for SAE Automation Level 4 and 5 requires a new approach how the vehicles are being tested because the responsibility to control the vehicle is handed over from a human being to a machine. The key challenge is to replicate Operational Design Domains (ODD's) in physical testbeds (whether in closed or open test environments) that fit to the driving capabilities of the Automated Driving System (ADS) to be tested. In order to simulate a specific ODD in a virtual environment, it is important to capture data from the real world environment being simulated such as road or building information in sufficient precision.


Ummo is a planet that reputedly circles the star Iumma located some 14.6 light-years from Earth. Knowledge of this planet and the associated star emerged in 1965 through Spanish contactee Fernando Sesma, president of the Society of the Friends of Space, headquartered in Madrid. In 1967 Sesma let it be known that a spacecraft would appear near the city on the evening of June 1. Contact with the Ummites was quite different. Sesma had neither direct physical contact nor telepathic contact. Instead he was contacted via the mail or by telephone. He had received several lengthy documents in typescript that included descriptions of Ummo and insights into a variety of scientific, psychological, technological, and socio-political issues.
The messages from Ummo intersected with a series of UFO sightings that began on February 6, 1966. Several people saw the saucer near Alauche, Spain, and one, José Luis Jordan Peña, drew a sketch and reported it to the newspapers. The saucer was distinguished by a peculiar symbol. A second sighting occurred on June 1, 1967, at which time pictures were taken. One picture showed the same symbol Jordan had reported the previous year. Copies of the pictures were recovered by a Madrid newspaper photographer from an anonymous source. Adding to the mystery, a flyer signed with the name Henri Dagousset was circulated, suggesting that the 1967 UFO had left behind some small cylinders and asking anyone who found one to make contact through the general post office. One of these was sent anonymously to UFO author Marius Leuget. Inside the object was a piece of paper with the mysterious symbol.
In the days after the announcement of Sesma's contact with the Ummites others began to report intriguing but anonymous contacts with people who also claimed to be from Ummo. In the meantime the lengthy messages from the Ummites continued to appear. By 1983 the number had grown to some 6,700.
While written from a knowledgeable standpoint, the Ummo communications were always troubling because of their lack of a means of independently verifying that they were from Ummites. None of those who wrote and circulated the documents allowed any direct contact. In addition, none of the other people who claimed contact were ever located. Then, the U.S.-based Ground Saucer Watch examined the pictures of the Ummo symbol and determined that they were taken of a small object held close to the camera. The saucer appeared to be an eight-inch plate with the symbol painted on it in ink.
In spite of the finding concerning the photographs and the lack of independent verification of either the sightings or the documents, the latter have been published in both English and Spanish. The Ummo material has subsequently been integrated into the large body of flying saucer contactee material and several websites have been placed on the Internet, including one detailing the Ummite philosophy at http://perso.wanadoo.fr/ummo.textes-essentiels/anglais/a016.htm (as of December 1999).
Ribera, Antonio. Ufo Contact from Planet Ummo: The Incredible Truth. 2 vols. Tucson, Ariz.: UFO Books, n.d.
Sesma, Fernando. Otro Planeta Habitado, Ummo. Madrid, Spain: Editorial Grafica Espejo, 1967.
Vallee, Jaques. Revelations: Alien Contact and Human Deception. New York: Ballantine Books, 1991.
"Ummo Hoax." Encyclopedia of Occultism and Parapsychology. . Encyclopedia.com. 20 Apr. 2019 <https://www.encyclopedia.com>.


text:
package org.apache.druid.client;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.google.common.collect.Maps;
import com.google.common.net.HostAndPort;
import org.apache.druid.concurrent.LifecycleLock;
import org.apache.druid.discovery.DataNodeService;
import org.apache.druid.discovery.DiscoveryDruidNode;
import org.apache.druid.discovery.DruidNodeDiscovery;
import org.apache.druid.discovery.DruidNodeDiscoveryProvider;
import org.apache.druid.java.util.common.IAE;
import org.apache.druid.java.util.common.ISE;
import org.apache.druid.java.util.common.Pair;
import org.apache.druid.java.util.common.RE;
import org.apache.druid.java.util.common.concurrent.ScheduledExecutors;
import org.apache.druid.java.util.common.lifecycle.LifecycleStart;
import org.apache.druid.java.util.common.lifecycle.LifecycleStop;
import org.apache.druid.java.util.emitter.EmittingLogger;
import org.apache.druid.java.util.http.client.HttpClient;
import org.apache.druid.server.coordination.ChangeRequestHttpSyncer;
import org.apache.druid.server.coordination.ChangeRequestsSnapshot;
import org.apache.druid.server.coordination.DataSegmentChangeRequest;
import org.apache.druid.server.coordination.DruidServerMetadata;
import org.apache.druid.server.coordination.SegmentChangeRequestDrop;
import org.apache.druid.server.coordination.SegmentChangeRequestLoad;
import org.apache.druid.timeline.DataSegment;
import org.apache.druid.timeline.SegmentId;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * This class uses internal-discovery i.e. {@link DruidNodeDiscoveryProvider} to discover various queryable nodes in the
 * cluster such as historicals and realtime peon processes.
 *
 * For each queryable server, it uses HTTP GET /druid-internal/v1/segments (see docs for {@link
 * org.apache.druid.server.http.SegmentListerResource#getSegments}), to keep sync'd state of segments served by those
 * servers.
 */
public class HttpServerInventoryView implements ServerInventoryView, FilteredServerInventoryView
{
  public static final TypeReference<ChangeRequestsSnapshot<DataSegmentChangeRequest>> SEGMENT_LIST_RESP_TYPE_REF =
      new TypeReference<ChangeRequestsSnapshot<DataSegmentChangeRequest>>() {};

  private final EmittingLogger log = new EmittingLogger(HttpServerInventoryView.class);
  private final DruidNodeDiscoveryProvider druidNodeDiscoveryProvider;

  private final LifecycleLock lifecycleLock = new LifecycleLock();

  private final ConcurrentMap<ServerRemovedCallback, Executor> serverCallbacks = new ConcurrentHashMap<>();
  private final ConcurrentMap<SegmentCallback, Executor> segmentCallbacks = new ConcurrentHashMap<>();

  private final ConcurrentMap<SegmentCallback, Predicate<Pair<DruidServerMetadata, DataSegment>>> segmentPredicates =
      new ConcurrentHashMap<>();

  /**
   * Users of this instance can register filters for what segments should be stored and reported to registered
   * listeners. For example, A Broker node can be configured to keep state for segments of specific DataSource
   * by using this feature. In that way, Different Broker nodes can be used for dealing with Queries of Different
   * DataSources and not maintaining any segment information of other DataSources in memory.
   */
  private final Predicate<Pair<DruidServerMetadata, DataSegment>> defaultFilter;
  private volatile Predicate<Pair<DruidServerMetadata, DataSegment>> finalPredicate;

  // For each queryable server, a name -> DruidServerHolder entry is kept
  private final ConcurrentHashMap<String, DruidServerHolder> servers = new ConcurrentHashMap<>();

  private final String execNamePrefix;
  private volatile ScheduledExecutorService executor;

  private final HttpClient httpClient;
  private final ObjectMapper smileMapper;
  private final HttpServerInventoryViewConfig config;

  public HttpServerInventoryView(
      final ObjectMapper smileMapper,
      final HttpClient httpClient,
      final DruidNodeDiscoveryProvider druidNodeDiscoveryProvider,
      final Predicate<Pair<DruidServerMetadata, DataSegment>> defaultFilter,
      final HttpServerInventoryViewConfig config,
      final String execNamePrefix
  )
  {
    this.httpClient = httpClient;
    this.smileMapper = smileMapper;
    this.druidNodeDiscoveryProvider = druidNodeDiscoveryProvider;
    this.defaultFilter = defaultFilter;
    this.finalPredicate = defaultFilter;
    this.config = config;
    this.execNamePrefix = execNamePrefix;
  }

  @LifecycleStart
  public void start()
  {
    synchronized (lifecycleLock) {
      if (!lifecycleLock.canStart()) {
        throw new ISE("can't start.");
      }

      log.info("Starting %s.", execNamePrefix);

      try {
        executor = ScheduledExecutors.fixed(
            config.getNumThreads(),
            execNamePrefix + "-%s"
        );

        DruidNodeDiscovery druidNodeDiscovery = druidNodeDiscoveryProvider.getForService(DataNodeService.DISCOVERY_SERVICE_KEY);
        druidNodeDiscovery.registerListener(
            new DruidNodeDiscovery.Listener()
            {
              private final AtomicBoolean initialized = new AtomicBoolean(false);

              @Override
              public void nodesAdded(Collection<DiscoveryDruidNode> nodes)
              {
                nodes.forEach(node -> serverAdded(toDruidServer(node)));
              }

              @Override
              public void nodesRemoved(Collection<DiscoveryDruidNode> nodes)
              {
                nodes.forEach(node -> serverRemoved(toDruidServer(node)));
              }

              @Override
              public void nodeViewInitialized()
              {
                if (!initialized.getAndSet(true)) {
                  executor.execute(HttpServerInventoryView.this::serverInventoryInitialized);
                }
              }

              private DruidServer toDruidServer(DiscoveryDruidNode node)
              {

                return new DruidServer(
                    node.getDruidNode().getHostAndPortToUse(),
                    node.getDruidNode().getHostAndPort(),
                    node.getDruidNode().getHostAndTlsPort(),
                    ((DataNodeService) node.getServices().get(DataNodeService.DISCOVERY_SERVICE_KEY)).getMaxSize(),
                    ((DataNodeService) node.getServices().get(DataNodeService.DISCOVERY_SERVICE_KEY)).getType(),
                    ((DataNodeService) node.getServices().get(DataNodeService.DISCOVERY_SERVICE_KEY)).getTier(),
                    ((DataNodeService) node.getServices().get(DataNodeService.DISCOVERY_SERVICE_KEY)).getPriority()
                );
              }
            }
        );

        scheduleSyncMonitoring();

        lifecycleLock.started();
      }
      finally {
        lifecycleLock.exitStart();
      }

      log.info("Started %s.", execNamePrefix);
    }
  }

  @LifecycleStop
  public void stop()
  {
    synchronized (lifecycleLock) {
      if (!lifecycleLock.canStop()) {
        throw new ISE("can't stop.");
      }

      log.info("Stopping %s.", execNamePrefix);

      if (executor != null) {
        executor.shutdownNow();
      }

      log.info("Stopped %s.", execNamePrefix);
    }
  }

  @Override
  public void registerSegmentCallback(
      Executor exec,
      SegmentCallback callback,
      Predicate<Pair<DruidServerMetadata, DataSegment>> filter
  )
  {
    if (lifecycleLock.isStarted()) {
      throw new ISE("Lifecycle has already started.");
    }

    SegmentCallback filteringSegmentCallback = new FilteringSegmentCallback(callback, filter);
    segmentCallbacks.put(filteringSegmentCallback, exec);
    segmentPredicates.put(filteringSegmentCallback, filter);

    finalPredicate = Predicates.or(
        defaultFilter,
        Predicates.or(segmentPredicates.values())
    );
  }

  @Override
  public void registerServerRemovedCallback(Executor exec, ServerRemovedCallback callback)
  {
    if (lifecycleLock.isStarted()) {
      throw new ISE("Lifecycle has already started.");
    }

    serverCallbacks.put(callback, exec);
  }

  @Override
  public void registerSegmentCallback(Executor exec, SegmentCallback callback)
  {
    if (lifecycleLock.isStarted()) {
      throw new ISE("Lifecycle has already started.");
    }

    segmentCallbacks.put(callback, exec);
  }

  @Override
  public DruidServer getInventoryValue(String containerKey)
  {
    DruidServerHolder holder = servers.get(containerKey);
    if (holder != null) {
      return holder.druidServer;
    }
    return null;
  }

  @Override
  public Collection<DruidServer> getInventory()
  {
    // Returning a lazy collection, because currently getInventory() is always used for one-time iteration. It's OK for
    // storing in a field and repetitive iteration as well, because the lambda is very cheap - just a final field
    // access.
    return Collections2.transform(servers.values(), serverHolder -> serverHolder.druidServer);
  }

  private void runSegmentCallbacks(
      final Function<SegmentCallback, CallbackAction> fn
  )
  {
    for (final Map.Entry<SegmentCallback, Executor> entry : segmentCallbacks.entrySet()) {
      entry.getValue().execute(
          new Runnable()
          {
            @Override
            public void run()
            {
              if (CallbackAction.UNREGISTER == fn.apply(entry.getKey())) {
                segmentCallbacks.remove(entry.getKey());
                if (segmentPredicates.remove(entry.getKey()) != null) {
                  finalPredicate = Predicates.or(
                      defaultFilter,
                      Predicates.or(segmentPredicates.values())
                  );
                }
              }
            }
          }
      );
    }
  }

  private void runServerCallbacks(final DruidServer server)
  {
    for (final Map.Entry<ServerRemovedCallback, Executor> entry : serverCallbacks.entrySet()) {
      entry.getValue().execute(
          new Runnable()
          {
            @Override
            public void run()
            {
              if (CallbackAction.UNREGISTER == entry.getKey().serverRemoved(server)) {
                serverCallbacks.remove(entry.getKey());
              }
            }
          }
      );
    }
  }

  //best effort wait for first segment listing fetch from all servers and then call
  //segmentViewInitialized on all registered segment callbacks.
  private void serverInventoryInitialized()
  {
    long start = System.currentTimeMillis();
    long serverSyncWaitTimeout = config.getServerTimeout() + 2 * ChangeRequestHttpSyncer.HTTP_TIMEOUT_EXTRA_MS;

    List<DruidServerHolder> uninitializedServers = new ArrayList<>();
    for (DruidServerHolder server : servers.values()) {
      if (!server.isSyncedSuccessfullyAtleastOnce()) {
        uninitializedServers.add(server);
      }
    }

    while (!uninitializedServers.isEmpty() && ((System.currentTimeMillis() - start) < serverSyncWaitTimeout)) {
      try {
        Thread.sleep(5000);
      }
      catch (InterruptedException ex) {
        throw new RE(ex, "Interrupted while waiting for queryable server initial successful sync.");
      }

      log.info("Checking whether all servers have been synced at least once yet....");
      Iterator<DruidServerHolder> iter = uninitializedServers.iterator();
      while (iter.hasNext()) {
        if (iter.next().isSyncedSuccessfullyAtleastOnce()) {
          iter.remove();
        }
      }
    }

    if (uninitializedServers.isEmpty()) {
      log.info("All servers have been synced successfully at least once.");
    } else {
      for (DruidServerHolder server : uninitializedServers) {
        log.warn(
            "Server[%s] might not yet be synced successfully. We will continue to retry that in the background.",
            server.druidServer.getName()
        );
      }
    }

    log.info("Calling SegmentCallback.segmentViewInitialized() for all callbacks.");

    runSegmentCallbacks(
        new Function<SegmentCallback, CallbackAction>()
        {
          @Override
          public CallbackAction apply(SegmentCallback input)
          {
            return input.segmentViewInitialized();
          }
        }
    );
  }

  private void serverAdded(DruidServer server)
  {
    synchronized (servers) {
      DruidServerHolder holder = servers.get(server.getName());
      if (holder == null) {
        log.info("Server[%s] appeared.", server.getName());
        holder = new DruidServerHolder(server);
        servers.put(server.getName(), holder);
        holder.start();
      } else {
        log.info("Server[%s] already exists.", server.getName());
      }
    }
  }

  private void serverRemoved(DruidServer server)
  {
    synchronized (servers) {
      DruidServerHolder holder = servers.remove(server.getName());
      if (holder != null) {
        log.info("Server[%s] disappeared.", server.getName());
        holder.stop();
        runServerCallbacks(holder.druidServer);
      } else {
        log.info("Server[%s] did not exist. Removal notification ignored.", server.getName());
      }
    }
  }

  /**
   * This method returns the debugging information exposed by {@link HttpServerInventoryViewResource} and meant
   * for that use only. It must not be used for any other purpose.
   */
  public Map<String, Object> getDebugInfo()
  {
    Preconditions.checkArgument(lifecycleLock.awaitStarted(1, TimeUnit.MILLISECONDS));

    Map<String, Object> result = Maps.newHashMapWithExpectedSize(servers.size());
    for (Map.Entry<String, DruidServerHolder> e : servers.entrySet()) {
      DruidServerHolder serverHolder = e.getValue();
      result.put(
          e.getKey(),
          serverHolder.syncer.getDebugInfo()
      );
    }
    return result;
  }

  private void scheduleSyncMonitoring()
  {
    executor.scheduleAtFixedRate(
        () -> {
          log.debug("Running the Sync Monitoring.");

          try {
            for (Map.Entry<String, DruidServerHolder> e : servers.entrySet()) {
              DruidServerHolder serverHolder = e.getValue();
              if (!serverHolder.syncer.isOK()) {
                synchronized (servers) {
                  // check again that server is still there and only then reset.
                  if (servers.containsKey(e.getKey())) {
                    log.makeAlert(
                        "Server[%s] is not syncing properly. Current state is [%s]. Resetting it.",
                        serverHolder.druidServer.getName(),
                        serverHolder.syncer.getDebugInfo()
                    ).emit();
                    serverRemoved(serverHolder.druidServer);
                    serverAdded(new DruidServer(
                        serverHolder.druidServer.getName(),
                        serverHolder.druidServer.getHostAndPort(),
                        serverHolder.druidServer.getHostAndTlsPort(),
                        serverHolder.druidServer.getMaxSize(),
                        serverHolder.druidServer.getType(),
                        serverHolder.druidServer.getTier(),
                        serverHolder.druidServer.getPriority()
                    ));
                  }
                }
              }
            }
          }
          catch (Exception ex) {
            if (ex instanceof InterruptedException) {
              Thread.currentThread().interrupt();
            } else {
              log.makeAlert(ex, "Exception in sync monitoring.").emit();
            }
          }
        },
        1,
        5,
        TimeUnit.MINUTES
    );
  }

  @Override
  public boolean isStarted()
  {
    return lifecycleLock.awaitStarted(1, TimeUnit.MILLISECONDS);
  }

  @Override
  public boolean isSegmentLoadedByServer(String serverKey, DataSegment segment)
  {
    DruidServerHolder holder = servers.get(serverKey);
    return holder != null && holder.druidServer.getSegment(segment.getId()) != null;
  }

  private class DruidServerHolder
  {
    private final DruidServer druidServer;

    private final ChangeRequestHttpSyncer<DataSegmentChangeRequest> syncer;

    DruidServerHolder(DruidServer druidServer)
    {
      this.druidServer = druidServer;

      try {
        HostAndPort hostAndPort = HostAndPort.fromString(druidServer.getHost());
        this.syncer = new ChangeRequestHttpSyncer<>(
            smileMapper,
            httpClient,
            executor,
            new URL(druidServer.getScheme(), hostAndPort.getHostText(), hostAndPort.getPort(), "/"),
            "/druid-internal/v1/segments",
            SEGMENT_LIST_RESP_TYPE_REF,
            config.getServerTimeout(),
            config.getServerUnstabilityTimeout(),
            createSyncListener()
        );
      }
      catch (MalformedURLException ex) {
        throw new IAE(ex, "Failed to construct server URL.");
      }
    }

    void start()
    {
      syncer.start();
    }

    void stop()
    {
      syncer.stop();
    }

    boolean isSyncedSuccessfullyAtleastOnce()
    {
      try {
        return syncer.awaitInitialization(1, TimeUnit.MILLISECONDS);
      }
      catch (InterruptedException ex) {
        throw new RE(
            ex,
            "Interrupted while waiting for queryable server[%s] initial successful sync.",
            druidServer.getName()
        );
      }
    }

    private ChangeRequestHttpSyncer.Listener<DataSegmentChangeRequest> createSyncListener()
    {
      return new ChangeRequestHttpSyncer.Listener<DataSegmentChangeRequest>()
      {
        @Override
        public void fullSync(List<DataSegmentChangeRequest> changes)
        {
          Map<SegmentId, DataSegment> toRemove = Maps.newHashMapWithExpectedSize(druidServer.getTotalSegments());
          druidServer.iterateAllSegments().forEach(segment -> toRemove.put(segment.getId(), segment));

          for (DataSegmentChangeRequest request : changes) {
            if (request instanceof SegmentChangeRequestLoad) {
              DataSegment segment = ((SegmentChangeRequestLoad) request).getSegment();
              toRemove.remove(segment.getId());
              addSegment(segment);
            } else {
              log.error(
                  "Server[%s] gave a non-load dataSegmentChangeRequest[%s]., Ignored.",
                  druidServer.getName(),
                  request
              );
            }
          }

          for (DataSegment segmentToRemove : toRemove.values()) {
            removeSegment(segmentToRemove);
          }
        }

        @Override
        public void deltaSync(List<DataSegmentChangeRequest> changes)
        {
          for (DataSegmentChangeRequest request : changes) {
            if (request instanceof SegmentChangeRequestLoad) {
              addSegment(((SegmentChangeRequestLoad) request).getSegment());
            } else if (request instanceof SegmentChangeRequestDrop) {
              removeSegment(((SegmentChangeRequestDrop) request).getSegment());
            } else {
              log.error(
                  "Server[%s] gave a non load/drop dataSegmentChangeRequest[%s], Ignored.",
                  druidServer.getName(),
                  request
              );
            }
          }
        }
      };
    }

    private void addSegment(DataSegment segment)
    {
      if (finalPredicate.apply(Pair.of(druidServer.getMetadata(), segment))) {
        if (druidServer.getSegment(segment.getId()) == null) {
          DataSegment theSegment = DataSegmentInterner.intern(segment);
          druidServer.addDataSegment(theSegment);
          runSegmentCallbacks(
              new Function<SegmentCallback, CallbackAction>()
              {
                @Override
                public CallbackAction apply(SegmentCallback input)
                {
                  return input.segmentAdded(druidServer.getMetadata(), theSegment);
                }
              }
          );
        } else {
          log.warn(
              "Not adding or running callbacks for existing segment[%s] on server[%s]",
              segment.getId(),
              druidServer.getName()
          );
        }
      }
    }

    private void removeSegment(final DataSegment segment)
    {
      if (druidServer.removeDataSegment(segment.getId()) != null) {
        runSegmentCallbacks(
            new Function<SegmentCallback, CallbackAction>()
            {
              @Override
              public CallbackAction apply(SegmentCallback input)
              {
                return input.segmentRemoved(druidServer.getMetadata(), segment);
              }
            }
        );
      } else {
        log.warn(
            "Not running cleanup or callbacks for non-existing segment[%s] on server[%s]",
            segment.getId(),
            druidServer.getName()
        );
      }
    }
  }
}

redpajama_set_name: RedPajamaGithub


text:
Q: GCP - Python create IoT device PermissionDenied I am trying to create IoT devices on the Google Cloud through a Python script.
I have set up the project, IoT registry and authenticated my GCloud and linked the GOOGLE_APPLICATION_CREDENTIALS to the json from the corresponding service account.
Why I use the command line to create an account, e.g.
gcloud iot devices create dev01 --project=... --region=... --registry=... ,
it works.
However, my Python script (run through command prompt) does not seem to yield the same results. I used https://cloud.google.com/iot/docs/samples/device-manager-samples#iot-core-create-rs256-python for the iot_v1 reference.
    # Generate Key
    key = rsa.generate_private_key(backend=default_backend(), public_exponent=65537, key_size=2048)
    # Get Public
    public_key = key.public_key().public_bytes(serialization.Encoding.OpenSSH, serialization.PublicFormat.OpenSSH)
    # Get Private
    pem = key.private_bytes(encoding=serialization.Encoding.PEM,
                            format=serialization.PrivateFormat.TraditionalOpenSSL,
                            encryption_algorithm=serialization.NoEncryption())
    # Decode to UTF-8
    private_key_str = pem.decode('utf-8')
    public_key_str = public_key.decode('utf-8')
    # Write keys
    with open('Key Pairs/'+deviceName+'_private.pem', 'wb') as file:
        file.write(pem)
    with open('Key Pairs/' + deviceName + '_public.pem', 'wb') as file:
        file.write(public_key)

    # Create Device
    client = iot_v1.DeviceManagerClient()
    parent = client.registry_path(PROJECTID, REGION, REGISTRY)
    deviceTemplate = {
        'id': deviceName,
        "credentials": [
            {
                "public_key": {
                    "format": iot_v1.PublicKeyFormat.RSA_X509_PEM,
                    "key": public_key_str,
                }
            }
        ]
    }
    client.create_device(request={'parent': parent, 'device': deviceTemplate})

The error traceback is
File "commissioning.py", line 46, in <module>
    client.create_device(request={'parent': parent, 'device': deviceTemplate})
  File "C:\Users\Niels\AppData\Local\Programs\Python\Python38\lib\site-packages\google\cloud\iot_v1\services\device_manager\client.py", line 728, in create_device
    response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,)
  File "C:\Users\Niels\AppData\Local\Programs\Python\Python38\lib\site-packages\google\api_core\gapic_v1\method.py", line 145, in __call__
    return wrapped_func(*args, **kwargs)
  File "C:\Users\Niels\AppData\Local\Programs\Python\Python38\lib\site-packages\google\api_core\grpc_helpers.py", line 59, in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc), exc)
  File "<string>", line 3, in raise_from
google.api_core.exceptions.PermissionDenied: 403 The caller does not have permission

I guess it is either a problem the way I use iot_v1 or with the permissions of Python. Any help/tips would be much appreciated!

A: Make sure that the service account being used to create the client has at least the roles/cloudiot.provisioner Role assigned (if you keep getting the permission errors try adding the roles/cloudiot.admin role to the service account, as it should grant full control of all IoT devices, find more information about all the available permissions here.)
Once you are sure that the service account has the correct permissions you can take advantage of the the credentials parameter offered by the iot_v1.DeviceManagerClient() class to make sure you point to the service account key file as explained on the Authentication section of the docs.


These changes don't appear on the surface to be general cutbacks, particularly with more and later evening journeys on some routes, more the result of worsening traffic conditions, or am I missing something?
No I don't think you are - there don't appear to be any cutbacks, and the incremental improvements to evening journeys and the weekend night 12 are welcome.
The new 7 sees an improved service between Exeter, Newton Abbot and Totnes with a basically hourly frequency during Monday-Saturday daytimes. The new 7A though - oh dear, oh dear, oh dear. Just two MF early morning departures from Torquay at 06.15 and 07.05, and three evening journeys back from Exeter at 17.50, 18.50 and 19.50. On Saturdays, just one departure from Torquay at 08.05 and one from Exeter at 18.50. And the 7A journeys operate via Newton Abbot and Rydon, so take 20 minutes longer. Useless, completely useless.
The new 92 appears to be self-contained, and operates to a basic two-hourly frequency which is probably appropriate for the traffic on offer. There are decent 6-minute same-stop connections with the 7 northbound at Totnes, coming back its not quite so good with mainly 23-minute waits and the need to cross the road.
So not quite 24-hour service as there is a gap between the last night journeys and the start of the daytime service, especially on Sundays. The journey time from Brixham to Newton Abbot is scheduled at 58 minutes each way, so the half-hourly frequency can (just) be maintained with four buses.
There are also later last buses on other nights, with a new 23.48 Brixham - Torquay Depot (Monday-Saturday) and 00.18 Newton Abbot - Torquay Harbour (every night) - these appear to be previous dead-runs made live.
On route 22 the last bus to and from Dawlish Warren is now one hour later each day - the 19.17 South Devon College - St Marychurch journeys is extended to Dawlish Warren, and there is a new 21.10 Dawlish Warren-Torquay Harbourside journey.
Route 23 now operates a one-way loop via new housing in White Rock during the off-peak period on Mondays-Fridays (10.00-15.00) and on Saturdays until 19.00. The evening and Sunday service remains interworked with the 22 as at present. Frequencies are unchanged.
The new 35A/35C operate to the same basic frequencies as the 32 and 34 that they replace (20 minutes MS daytimes, 30 minutes evenings & Sundays), the main advantage is that the routes now operate as full circulars at all times (the early morning, evening & Sunday 32 journeys currently turn back at Torbay Hospital and do not reach The Willows). The schoolday-only 32C journeys between St Marychurch and Torquay Grammar Schools are transferred to this registration but are otherwise unchanged, save that the morning journey now terminates at the Grammar School and does not operate through to The Willows (surely 22C would be a better number for this service?).
The 88/88A run to new timetables but at the same frequencies as now, except that the evening/Sunday 88A is being dropped - a 77A variant of the new 77 will replace the 88A at these times. Unfortunately dropping the Buckland extension means the direct connection between Buckfastleigh/Ashburton and Newton Abbot rail station is lost.
Gold is largely unchanged, but there is a new MS journey from Torquay to Plymouth at 19.20, this plugs the previously lengthy gap in departures from Torquay (18.10 to 20.40). There is also a new 21.10 Plymouth - Torquay journey operated by the same bus, and on Friday and Saturday nights there is now a 00.00 departure from Plymouth to Ivybridge, presumably operated by Plymouth Depot. The 23.40 Totnes-Torquay no longer operates (presumably the bus returns light to Torquay Depot), the last Torquay-bound service is the 22.30 Plymouth-Torquay which departs Totnes at 23.23. On Sundays there are two extra journeys; the first departure from Plymouth to Torquay is now one hour earlier at 08.05, and there is an additional 18.05 Torquay-Plymouth plugging a two-hour gap.
So overall not a bad picture and some incremental improvements, but sadly the Torquay-Exeter link is now all but dead.
91 (Dartmouth Park & Ride) commences on Saturday 23rd March.
122 (Babbacombe Downs - Paignton open-top) commences on Saturday 13th April (the day before the Torbay network changes) and usually operates until the last Sunday in October.
Thank you for making the effort to list all that. Overall, not too bad at all and some gaps plugged, which is usually the sign of a well-run operator imo. As you say, it's sad that Stagecoach have virtually pulled the plug on the direct link between Torquay and Exeter, but there's only so much an operator can do. It reminds me a bit of the decline and death of Green Line in London and surrounding area: in the end, traffic congestion strangles surface public transport if there is an alternative mode, and sometimes even when there isn't!
It's been a few years now since I paid regular visits to Exeter, also to Kingkerswell and Newton Abbot, and I had hoped the Kingkerswell By-Pass might have an alleviating effect for more than two hours, but from what I read it's as bad as ever. I'll be revisiting old haunts during the Devon General centenary celebrations if my luck holds.
I hope you can get down for the celebrations, and you get to see the old haunts. The new by-pass has certainly made a difference to Kingskerswell, it's so quiet through there now compared to the traffic queues that used to clog it up. The 12s breeze through now.
I'm planning to be at the rally at Newton Abbot on 4th August so we might bump into each other there.
If it's a nice day I might wear my Bow Garage centenary teeshirt, which has never had an outing, so you'll recognise me!
Plymouth CityBus's latest Annual Report and Financial Statement (to 30th June 2018) makes reference to nine further ADL Enviro400 City that are on order for delivery in "Spring 2019". They follow on from the seventeen that were delivered two years ago for the 21/21A "Spark" service. Apparently they are for the circular 50/51 routes that link the City Centre and Derriford Hospital via St Budeaux and Estover.
I would have preferred the E400-Citys for another route. I so liked the Yellow Flash E400s on route 50 that these were one of my incentives to visit Plymouth last year.
Hmmm - having given this a bit of thought I am now inclined to distrust the comment that says the new buses are for the 50/51. Plymouth Citybus's Annual Report simply says "These buses will be introduced on the core route that links the City Centre to the Hospital. A route with strong passenger growth, in the growth area of the city." which could mean the 42-group.
Also the 50/51 has a PVR of ten which would make ordering nine buses for it a bit odd.
- 20/20B (City Centre-Plympton): new Sunday timetable, all journeys will operate as route 20 and route 20B will be withdrawn. On Mondays to Saturdays the 20 will follow a revised routeing in Plympton - no changes to the Monday-Saturday timetable, or to route 20A.
- 21/21A (Barne Barton-City Centre-Chaddlewood/St Maurice): temporary timetable withdrawn and previous timetable reinstated following the completion of roadworks.
- PR3 (Derriford Hospital-George Junction Park & Ride): new timetable with frequency increased to every 15 minutes and later evening departures. Extended from Derriford Hospital to Derriford Roundabout, then in a one-way loop via Tavistock Road, William Prance Road and Brest Road back to Derriford Roundabout.
Sunday 7th April also EDIT: Saturday 6th April sees the commencement of Plymouth CityBus's new venture, Ocean City Sights. This is a HOHO (hop-on-hop-off) bus tour and operates on a circular route taking in the City Centre, The Barbican, The Hoe/Seafront and Royal William Yard. Buses run hourly, with additional journeys during Plymouth School Holiday periods. Special fares apply on this service, although "OCS Plus" tickets are available which allow travel on all other Plymouth CityBus services on the day of travel, and can be purchased on any Plymouth CityBus service within Plymouth CityBus zones 1 & 2. At least one of the ex-Go-Ahead London General ADL Enviro400s (LX06 EZD - former E29) has been converted to part-open-top and painted in a special blue-based livery for this new venture.
Target Travel's Facebook page confirms that it will once again be operating the "Summer Special" 54 service between the City Centre and Jennycliff Bay/Bovisand Beach.
The service will operate from Saturday 25th May until Sunday 2nd June, then Saturdays and Sundays from 8th June to Sunday 14th July, then daily from Saturday 20th July until Sunday 1st September. The first bus departs Royal Parade (stop A11) at 10.00 and the last bus back from Bovisand is at 18.30. The service, which is supported by Plymouth City Council runs hourly with one bus and driver, there is a break in service at Bovisand between 13.25 and 14.30.
Also from Sunday 26th May there will be timetable changes (mostly minor) to a number of Plymouth CityBus routes. Cornwall route 75 (Torpoint Ferry-Liskeard) will be rerouted via Widegates. From the same date Dartline (Dealtop Ltd) has registered East Devon route 20 (Seaton-Taunton) which suggests they are taking over the contract from Stagecoach.
I have also seen a post on another forum which suggests that Stagecoach is planning improvements to its Plymouth-Tavistock route from 1st June, with an earlier first bus from Tavistock and additional evening journeys including a midnight departure from Plymouth.
Stagecoach has announced a number of timetable and service changes, mostly in the Exeter/East Devon and the North Devon areas. These will come into effect from Sunday 26th May.
1 (Plymouth-Tavistock): earlier first bus from Tavistock at 05.20 Mondays-Saturdays. Additional Monday-Saturday late evening journeys introduced - 21.00 & 23.00 from Tavistock, 22.00 & 24.00 from Plymouth, giving an improved hourly evening service service with the last buses one hour later than at present in both directions.
2 (Newton Abbot-Exeter): earlier first journey into Exeter and minor timing changes at other times to improve reliability.
4/4A/4B (Exeter-Honiton/Axminster): new timetable with improved Monday-Saturday daytime frequency between Exeter and Cranbrook - every 20 minutes. On Sundays three journeys will continue beyond Cranbrook to and from Honiton; these will continue to and from Sidmouth as route 9 and will replace Sunday-only route 56B.
5/5A/5B/5C (Exeter-Crediton-Okehampton/Barnstaple/Chulmleigh): Most journeys rerouted via West Garth Road in Cowley. Revised timetable to improve reliability.
6/6A (Exeter-Okehampton-Bude/Launceston): New timetable, with most route 6 journeys rerouted via Dunsford Hill, Pathfinder Village and Tedburn St Mary's. One Monday-Saturday afternoon journey in each direction will continue to be operate via the A30, these journeys will be renumbered X6. The 18.00 departure from Bude will be advanced to 17.45 to maintain train connections at Exeter St David's.
9/9A (Exeter-Sidmouth-Honiton/Lyme Regis): minor timetable changes to improve reliability. New Sunday service between Honiton and Sidmouth (3 journeys) replacing seasonal Sunday service 56B.
20 (Seaton-Taunton): Devon County Council contract transferred to Dartline.
55/155 (Exeter-Tiverton-Barnstaple including 55A/55B/55C): New timetable to improve reliability. Some early morning and late night journeys withdrawn.
56/56A (Exeter St David's Station-Exeter Airport-Exmouth): Retimed morning 56A journey from Exmouth to improve reliability. New Sunday timetable with later evening journeys - all Sunday journeys will operate between St David's Station and Exeter Airport, Sunday-only route 56B is withdrawn and replaced by new Sunday journeys on routes 4 and 9.
57 (Exeter-Exmouth & Brixington): new timetable to improve reliability. New N57 night service on Friday and Saturday nights, every 30 minutes with last bus from Exeter at 04.05.
58 (Budleigh Salterton-Exeter): morning peak journeys towards Exeter will depart earlier to improve punctuality.
98/98A (Exmouth local service): New timetable to improve reliability.
157/357 (Exmouth-Budleigh Salterton-Sidmouth): new timetables to improve reliability.
Hop 222 (Teignmouth-Dawlish Warren): NEW ROUTE: open-top Summer service to supplement route 22, operating to an hourly daytime frequency (gap in service for driver's break between 13.00-14.00).
A (Exeter City service: Alphington-Thornpark Rise): Revised timetable to improve reliability. Monday-Saturday daytime frequency reduced from every 10 to 12 minutes and additional running time added.
B (Exeter City Service: Pinhoe-Exminster): Withdrawn between Exeter (Union Road) and Pinhoe, see new route L. One journey per hour extended to Dawlish and renumbered 2B (this extension may be funded by Section 106 developer contributions).
E/F1/F2 (Exeter City services: Exwick-Beacon Heath/Pinhoe): new timetables to improve reliability, with the Monday-Saturday daytime frequency on each of routes E and F1/F2 revised to every 15 minutes. With the introduction of new route L to and from Pinhoe (see below) route F2 will terminate at Whipton (Summerway) and will not continue to Pinhoe.
G (Exeter City service: Exeter Quay-Hamelin Gardens): Exeter City Council contract transferred to Country Bus.
L (Exeter City service: Pinhoe-Crossmead) NEW ROUTE, replacing part of route B. Monday-Saturday daytime service will operate every 15 minutes between Pinhoe and the City Centre, continuing half-hourly to Crossmead via St Thomas, Cowick Street and Dunsford Hill. Evening and Sunday service will operate between Pinhoe and City Centre only. Morning and afternoon peak journeys will be extended from Pinhoe to EDF Energy.
11A/11C (Barnstaple Town service: Bus Station & Whiddon Valley circular): Revised timetable. All evening and Sunday journeys will operate clockwise as route 11C.
15A/15C (Appledore-Bideford & East-the-Water circular): withdrawn between Bideford Quay and Appledore, see route 21A below for a replacement service between Bideford and Appledore. This service will be amended to operate between Bideford Quay and East-the-Water only (apart from a couple of positioning journeys from and to Barnstaple), and will become a supported service operated under contract to Devon County Council.
19 (Barnstaple Town service: Roundswell-District Hospital): earlier first journey Monday-Friday from Roundswell at 06.18.
21/21A (Ilfracombe/Georgeham-Barnstaple-Bideford-Westward Ho!/Appledore): The journeys which operate between Ilfracombe and Bideford Quay will be extended to and from Westward Ho!. The journeys which operate between Georgeham/West Meadow Road and Westward Ho! will be renumbered 21A and rerouted to Appledore, replacing The Bideford-Appledore section of route 15. It is currently proposed that the evening and Sunday journeys that currently operate around East-the-Water as service 21A will operate instead directly via Barnstaple Street, but Devon County Council may provide additional funding to retain a service around East-the-Water at these times. The Summer Sunday service between Barnstaple and Croyde Bay will recommence from this date and operate until 15th September (numbered 21).
The new timetable will be structured so that at most times buses will operate as 21 Ilfracombe-Westward Ho! and 21A Georgeham/West Meadow Road-Appledore, each about every 30 minutes with a combined 15-minute frequency between Braunton, Barnstaple, Bideford and Northam. The evening and Sunday service will operate every 30 minutes, alternately as 21 Ilfracombe-Westward Ho! and 21A Ilfracombe-Appledore, whilst the Summer Sunday service between Barnstaple and Croyde Bay will operate (confusingly!) as 21.
N21 (Braunton-Bideford): the experimental night service trialled at the end of last year will be reintroduced on Friday and Saturday nights. By popular request the service will be extended to and from Ilfracombe.
There are also timetable changes for routes 5B, 75, 85, 155 and 372.


text:
Euro Cargo Rail es un operador ferroviario de transporte de mercancías en Francia formado en 2005 como filial de English, Welsh and Scottish Railway (EWS).

Historia
Euro Cargo Rail fue fundada en febrero de 2005, en abril de 2005 EWS International recibió el certificado de seguridad que le permitía realizar operaciones con trenes de mercancías en Francia; empezando a operar desde entonces con trenes bajo la marca ECR.

La compañía se convirtió en filial de Deutsche Bahn en 2007 cuando su matriz EWS fue adquirida por la empresa alemana. En 2008 fue la segunda compañía por transporte ferroviario de mercancías en Francia tras SNCF con un 5,3% del mercado.

En 2010 el porcentaje de mercado de la compañía se estimaba en un 8%.

En octubre de 2010 Euro Cargo Rail formó una empresa conjunta con el puerto de La Rochelle, llamadaOFP La Rochelle.

Flota
Las operaciones iniciales de ECR fueron llevadas a cabo con cuatro locomotoras diésel Vossloh G1206 alquiladas, el mantenimiento de las locomotoras fue llevado a cabo en la nave Dollands Moor de EWS en el Reino Unido, por lo que la locomotora recibió el número de clasificación TOPS, 'Clase 21'.

De 2007 a 2009 la compañía también adquirió varias locomotoras Vossloh G1000 BB, y alquiló brevemente tres locomotoras TRAXX F140 AC de MRCE en 2007; que fueron devueltas tras su alquiler en 2008.

La compañía comenzó a alquilar unas diez locomotoras Vossloh G2000, y cinco locomotoras Vossloh Euro 4000 (1668mm de ancho) en 2008-9 de Angel Trains Cargo.

En 2008 dos locomotoras TRAXX F140 MS que operaban con la librea de ECR fueron usadas para la homologación de tipo en Francia y Bélgica; la certificación fue obtenida en julio de 2009. Las dos locomotoras formaban parte de un pedido de veinte unidades entregadas en 2009/10. 45 unidades más fueron ordenadas en 2009 para ser repartidas entre DB Schenker (25 unidades) y ECR (20 unidades), y entregadas de 2010 en adelante.

Las locomotoras EMD Series 66 fueron transferidas de EWS a ECR; en noviembre de 2007 cincuenta locomotoras habían sido transferidas, también a finales de 2007 la compañía comenzó a recibir entregas de una orden de sesenta unidades de locomotoras EMD Series 66, numeradas como 'Class 77' desde la 77001 a la 77060.

Desde 2010 la compañía comenzó a alquilar locomotoras eléctricas Alstom Prima (subtipos BB 27000, y BB 37000 de voltaje doble y triple) de Akiem. La compañía también comenzó a contratar locomotoras de maniobras SNCF Y8000 de Akiem en el mismo año.

Véase también
Europorte, SNCF Fret, VFLI : operadores ferroviarios de carga en Francia

Notas

Referencias

Enlaces externos

 Página web de la compañía

Operadores ferroviarios de Francia
Operadores ferroviarios de mercancías


Since Groningen is one of the youngest cities in the Netherlands, the city has a wide variation in shops varying from luxury brands such as Hugo Boss and Tommy Hilfiger till the typical Dutch well-known low budget store Zeeman. Shopping addicts can definitely spend their money on everything shiny and glamorous, while food addicts can fill their tummy in one of the many dining cafes. Who says a student needs to live on dry bread and water in order to follow the latest trends? We will provide you with a quick tour through the shopping area of Groningen.
The Herestraat in Groningen is the longest shopping street in the city, and houses many well-known Dutch and international stores. Fashion addicts can shop here for shoes (Invito), clothes (Zara, Mango, Vero Moda and many more) or music (Free Record Shop). When taking a break from shopping you can grab a coffee at the small but cosy Coffee United. Really hungry? You can always grab a Big Mac at Mac Donalds.
However, the Herestraat is not the only shopping street in Groningen. Do you fancy a bit more original clothing, some creative furniture or organic food? It is definitely worth to visit the many small sub-streets surrounding the city centre. You will discover more original and less standard shops that are definitely worth a visit! The Folkingstraat is often said to be the cosiest street of Groningen, and houses many stores specialised in art, interior design and lifestyle. Do you want your room to look less like an Ikea showroom? When you're looking for paintings, dinnerware (Lily & Rose) or antiques; here you will have choice in many special treasures. When you want to treat yourself with healthy and organic food you can visit Puur! Natural Food.
Another hidden treasure in the city centre is music store Plato. Music lovers will find this heaven. From rock, indie, hip hop, soul or jazz, every music genre can be found. The store also characterises itself by the many attractive bargains that can be found throughout the store on a prominent spot.
Tired from all the shopping and you still need to do your groceries for the rest of the week? Groningen offers a variety of grocery stores in the city centre and the surrounding neighbourhoods. Supermarkets offering standard prices are for example Albert Heijn, Super de Boer and Jumbo.
Temporarily on a budget? You will find cheap groceries at the discount stores Aldi and Lidl. Albert Heijn can be found everywhere in and surrounding the city centre. Discount store Aldi can even be found in the middle of the centre, located right next to warehouse V&D. A Lidl store can be found in for example the neighbourhoods Paddepoel and Helpman. If you want to know where the nearest supermarket is, simply check the map of your area or neighbourhood on Google Maps.
Have the ambition to become as stylish as Paris Hilton? It won't be hard when visiting Groningen's shopping area!