text:
I went to the same school as Julian Assange, but we learned different lessons
by Vinay Gupta • December 18, 2011 • Everything Else • 12 Comments
I want to talk a little about techno-political theories of change, and outline where the paths of Julian Assange and I diverged.
Although I don't talk about it very much, I was a cypherpunk in the 1990s. I contributed a little to a software project to protect human rights workers in China. I collaborated with some individuals on a software project to build a Kiva-like microfinance engine on top of e-gold, and narrowly avoided getting entangled in a lot of legal badness when the project exploded. I'm going to return to that story in a minute, but let's turn back to Julian Assange.
The more secretive or unjust an organization is, the more leaks induce fear and paranoia in its leadership and planning coterie. This must result in minimization of efficient internal communications mechanisms (an increase in cognitive "secrecy tax") and consequent system-wide cognitive decline resulting in decreased ability to hold onto power as the environment demands adaptation.
Hence in a world where leaking is easy, secretive or unjust systems are nonlinearly hit relative to open, just systems. Since unjust systems, by their nature induce opponents, and in many places barely have the upper hand, leaking leaves them exquisitely vulnerable to those who seek to replace them with more open forms of governance.
Julian Assange, late 2006
Now there are two things you can infer from this, if you read between the lines.
Some of the "leaked" material will actually be obtained by computer intrusion (hacking/cracking) and passed off as being leaked by insiders
Assange's model is fundamentally economic and logistical: it's about transaction costs in a Coase/Benkler style.
WikiLeaks is acting as a marketplace for illicit information, literally a clearing house. This model, with its unconscious capitalist/economics language bias, is the key reason to doubt the long-term effectiveness of this strategy.
Here's why: the "daylight" model of increasing the transaction costs for conspiracies against the people, in a manner which extends good journalistic practice for the digital age has a simple countermeasure: make security cheaper. By pushing up demand for secure communications, the price of supply goes down. Ah, you say, but leaks circumvent security: actually, no. Digitally tagging files by doing things like rearranging whitespace and swapping words around helps track documents so you know which person leaked. Similar approaches can be taken for images and video. Security isn't just about stopping people from listening, it's the whole spectrum of information assurance techniques.
All we're doing is breeding better conspiracies.
There's also good reason to believe that Assange simply picked the wrong target. There are a vast number of commercial conspiracies – cartels and industrial espionage being two really useful examples, plus omnipresent government corruption over civil contracting matters. Hitting these networks hard might actually have achieved a lot of popular support for wikileaks in the popular press, and the politically powerful middle class support base which actually decides elections might have come along for the ride. But doing stuff that makes it less likely for the western democracies to win wars makes everybody in those democracies uneasy, consciously or not, and leaves wikileaks politically and more importantly emotionally exposed. People just don't like it. And it's not just because Julian Assange is a zealot.
Now let's consider the "nightside" model, in which we think of wikileaks as simply being a publishing front for computer crackers to launder stolen documents as more-legitimate leaks. By creating a single exchange point, they've created a point of regulation. Pushing down the cost of publishing a cracked document, and providing filtering to take out (say) the names of innocents involved in a situation also creates a new political bottleneck, which (of course) the authorities have chocked down on as hard as possible. The other argument is that wikileaks primary threat is not the governments of the west, but vastly more unscrupulous agencies (Mossad, the Chinese) who might find their own uses for an allegedly journalistic endeavour.
Economics thinking leads one astray when dealing with matters of political power.
"Political power grows out of the barrel of a gun." – Mao Tse-tung
I was writing software to run cryptographic financial markets in the late part of the last millennium. I'd worked extensively with the e-gold guys, and started to do some real analysis on how to do something very, very interesting. I was thinking about low-cost financial instruments for sustainable development, and rapidly discovered that there was a very, very real risk that my work was going to wind up empowering mafias.
I got The Fear. I was an illegal immigrant writing software to build secure, anonymous, untraceable financial instruments on top of a dodgy digital currency run out of a south sea island banking system, and (worse) Florida. I slapped some sense into myself, and left the project behind, and cryptography with it. It just didn't feel safe because I was already running one risk (being an illegal immigrant trying to find status to stay in the US) and I was breaking The Rules (1. only ever break one law at a time. 2. never break the law with somebody you don't trust. 3. never break the law with somebody protected from the consequences. 4. don't get caught. 5. never break the law with somebody dumber than you are. 6. cons con cons (aka "you cannot cheat an honest man."), 7. never steal anything worth less than two years salary. 8. don't do it for the thrill.)
These are the things you learn growing up on a Scottish housing estate in the 1980s.
So I quit crypto. Not being able to go to The State for help, if the situation I'd been in escalated to Men With Guns, left me with a clear understanding: I needed the State's protection to be a full human being. Now, let me say that again: I needed the State's protection to be a full human being.
This is the start of my divergence from the classical cyperpunk's anti-State crypto-anarchist market capitalist stance. I realized that I needed them to protect me from the Mafia, because I saw just the very shady outline of the Mafia two or three handshakes out from where I was, in a position where I couldn't get help without getting deported. If they'd gone from three handshakes away to one handshake away, I'd have had to make a decision: ask for help and lose my country, or go it alone and risk losing my life or worse.
It's not until you get a sense of those situations yourself that your ethics become clear. But I realized that I needed the State.
Years later, I realized the State needed me. I did a biometrics technology package, aimed at situations like Iraq, which embodied many of the fundamental core cypherpunk principles (anonymity, cryptographic assurances of judicial process, cryptographic implementation of personal privacy) in a proposed biometric ID card standard. I was working for the Office of the Secretary of Defense, with oversight from the National Security Agency. I worked in the public domain, you can see the CheapID proposal here, and I considered myself to be doing good. The Pentagon have always supported the hexayurt project, they've always treated the concepts of appropriate technology with respect, and while none of that washes away the evil done, I've never seen the fanged end of the beast.
But I know it is there, and I tread carefully.
Recently I invented the Riot Snorkel in direct response to the abuse of pepper spray and cs gas for suppressing peaceful protest in America. In the long run, that might be a pretty harsh anti-State action, and I'm aware of the risk it's going to get people hurt in the long run by depriving police of an effective first move in quashing protests. I took a calculated risk, and invested some of my political capital to draw a line in the sand: "you should not be doing this, and I'm standing up." That's a political step I made to frame a wider project: getting some of this radical political stuff implemented as the only realistic way of governing ourselves on the planet, given the failure of mainstream democracies to protect the environment, help the poor, or even stay at peace in times where no legitimate reason for war exist.
Understand: follow my engineering advice, and pepper spray and cs gas stop working. I didn't put that out there without thinking through the risks at a political and personal level pretty carefully. I did it to protect democracy, in my own way, in my own time.
So this is where Assange and I part ways. He used an economic analysis, and came up with a way of making conspiracy expensive. I used a military use-of-force analysis, and came to the conclusion that I needed the State's protection, and in fact we all do. As a result, I'm guardedly loyal to the State, and I want the best State possible. I'm absolutely enthusiastic about the A Thousand Nations approach of building some new countries with new governance arrangements and seeing what works ("a Cambrian explosion in governance!" as they say) but, in the here and now, we need Better States.
So here's the model I use, parallel to Assange's transaction costs model.
Inside of government there's a range of political and personal character, ranging from saintly to outright diabolical in a very literal "evil" sense.
The good end of government tend to believe in things like open data, open government, rule of law, human rights and similar. It's people a lot like you and me, but inside the State.
By identifying the progressive incumbents, the best of the people seated at the Big Tables, and supporting them, we can produce better government.
The critical periods are long-term conflicts about what to do on the biggest scale: wars, environment, civil rights etc. in which established factions form and fight for the framing of the problem of a given position.
The critical actors are senior bureaucrats, not elected officials. Elected officials of any substantial power are all agents of satan by virtue of constantly having to lie to people and the media "or the other, even worse guy, will win." This is corruption.
Civil society – that's you and me – can meaningfully contribute by effective support and cooperation to differentially empower progressive incumbents. We help the critical actors (senior bureaucrats) win critical conflicts during critical periods as a way of expressing our political power.
Mostly what they need are good ideas and proof that doing the right thing will work. Civil society can produce these, possibly using Wikipedia-type Free approaches.
I wrote about this approach at considerable length in The Big Deal, a series of long blog posts analysing how civil society could push forwards a new settlement with government in critical areas to try and create a better world. I believe in this approach.
Now, here's why I'm laying this approach out. Next year, I'm going after #Occupy. The current political culture inside of #Occupy is dangerously shallow. If we get large scale economic breakage, and Occupy goes from being 2,000 people in New York to being 200,000 people, if it becomes the army of the dispossessed, the Tyranny of Structurelessness is going to be an immense bane, as a lot of angry, frightened people get together in a non-democratic environment and attempt to figure out where to apply their political weight to get solutions. There's a name for that: it's called a mob. We can, and must, do better than first-past-the-post voting every four years for leaders pre-selected by political power elites and corporate-controlled media. But we must also do better than small groups of people waving their hands at each other at emotive appeals.
Two core virtues: voting, and written discourse. They go together: you can't vote on a speech, or an improvised dialogue, because somebody may have made a mistake and now you're voting on their mistake, not their intention. We need clear, written platforms, and political accountability for diverting from them. We'd all prefer CHANGE Obama to MORE OF THE SAME Obama, but there's little framework for holding him to his own high standards.
As I outlined in The Big Deal and When? we just can't sustain political change on the basis of an inaccurate world model.
Fighting, even winning, the war against narrow self interest is not the same thing as creating viable global solutions for the narrows that the human race finds itself in.
Support progressive incumbents.
Solve problems, don't just yell at people.
Be ready to take responsibility, because The State does a lot of work for us, and it's going bankrupt in many places.
Frontal assault is always going to get you bitten in the face. But we can change the world, as previous generations have, by skillful politics and picking both our horses and our battles with care.
As I said at the beginning, I went to the same school as Julian Assange, but we learned different lessons.
We can't do this alone, and a counter-conspiracy is just another gang. It's up to us to find a better, more inclusive, more whole way to address our global problems.
Because until the proposed settlement works for everybody with a veto, particularly a veto-by-violence, stuck we remain.
So that's my game plan for next year. Thankless as the task might be, society as-a-whole is going to need a more politically sophisticated Occupy to take up the slack left by a limp press and a corrupt government. The outrage of the people needs to be both realistic and constructive, because if we tear down much more, there's going to be nothing left. We don't suffer from too much governance, we suffer from too little: no effective climate regulation, no effective nanobio risk regulation.
Imagine a bridge built from the more reasonable end of Occupy, right through to the strategy rooms of Whitehall and Washington DC. That's my vision of 2012: get everybody around the same table, make them all say sorry to each other, and then get on with figuring out how to fix the world.
12 Responses to I went to the same school as Julian Assange, but we learned different lessons
Arne Babenhauserheid
Would you allow me to mirror your article into Freenet? There are quite a few people in there who would benefit from getting rid of economic thinking when trying to solve political problems.
Eric Ingram
"We don't suffer from too much governance, we suffer from too little"
How could giving more power to an easily corruptible, unaccountable, violent body of people (government), be a good thing?
Have you seen what's happening in states with powerful and corrupt governments? Egypt?
I'm with Julian on this one.
A ridiculous comment indeed. But I agree that they target the wrong people.
Focusing on corrupt business and political deals in the bamboo networks of china and SEA asia would yield both more public support, and benefit more people.
Ryan Dickherber
"I needed the State's protection to be a full human being."
Do you really need the state's protection, or do you just need protection in some form or another? I don't see why it is necessary that your protection come from some organization that forces you to pay for their services. Your argument that you need the state's protection could just as well be used to argue in favor of the criminal organizations you are so afraid of. If you were forced to pay for the mafia's services, would you need them too? I don't think so. There's no reason why your protection couldn't come from an organization that you chose to work with voluntarily.
There is another difference between you and Jullian Assage. Assage is courageous and has changed the world forever.
You live in fear, and you can sense it in every sentence.
Warren Draper
With regard to the 'corruption' you mention – which seems like an almost inevitable occurrence in both state and corporate bodies – I think it's worth looking at those mechanisms inherent in hierarchical structures which encourage this to happen. Once we understand the process we can design self-regulating feedback systems which are able to protect human institutions – be they state run, private or anarchist – from becoming yet another form of oppression.
I think that Bob O'Shea's 'Empire of the Rising Scum' – http://bobshea.net/empire_of_the_rising_scum.html – has some very important lessons regarding this. (And it wouldn't hurt to take Celine's laws to heart either… https://en.wikipedia.org/wiki/Celine%27s_laws 😉 ).
Some of the comments here are purely ideological. Right now we have anarchy in full swing in Iraq, evidence that a lack of state control is usually worse than a dictatorship.
Hobbes (remember him?) was right. Everything being equal, the people require *safety* before all other concerns, and you're about to see what that looks like as the ravages of deregulated (yes, ungoverned) free markets come to their unavoidable conclusion: social collapse.
Vinay is right: we need the state, just not in the condition it is now.
SkorpionUK
Ahhhh THANK YOU for Point 5, it's something I've been trying to get people to understand for years.
Re: Eric and Jack above: please don't confuse "governance" and "government".
Don't break the law with somebody dumber than you?!
Hahahahahh
Pingback: Writing About Horizontal Structure Becomes "Structureless" When We Write About It | Portland Occupier
Pingback: Vinay Gupta's Science & Engineering in the Public Interest « Appropriate Solutions


text:
Q: Identify anonymous class instance in JAVA I am thinking of a framework which accepts weak references. Having weak reference to an anonymous class instance does not make sense, so I want to warn the user at runtime by an assertion failure.
So, is there a way to identify that the particular class instance is of some anonymous class?

A: This should work:
myObj.getClass().isAnonymousClass();

redpajama_set_name: RedPajamaStackExchange


Lock in a great price for Amara Singapore – rated 8 by recent guests!
The staff was awesome. The location was perfect. The hotel is near shopping, food, and the MRT.
Hotel is located centrally and the neighborhood is surrounded by various restaurants, cafes and bars. Easy to access to public transportation stops. There's 24-hour opening supermarket across the street.
This was a class act hotel. It is near most attractions and close to subway. Taxi service que in front of hotel. The staff was very friendly and the brunch was fantastic with loads of options. Highly recommended!
Hotel Amara has a fantastic swimming pool. In fact, I chose the hotel based on its convenient location and the swimming pool - I was not disappointed. Their bar on the ground floor also offers a great experience. I would highly recommend this hotel for anyone travelling to Singapore.
Club lounge was on the same floor as our room on level 17. Children could enter except between 6 and 8pm. Cakes were lovely. We had pretty birds made from towels and rose petals scattered on our bed for our anniversary.
The breakfast selection was great. The daily cleaning of the rooms are really professionally done. The location is one of the hotel's best advantages.
Amara Singapore This rating is a reflection of how the property compares to the industry standard when it comes to price, facilities and services available. It's based on a self-evaluation by the property. Use this rating to help choose your stay!
A 2-minute walk from Tanjong Pagar MRT Station, Amara Singapore features a Balinese-style pool and spa. A fitness center is available. The hotel features multiple dining options and free Wi-Fi access. Union Pay is accepted here.
Amara Hotel's modern, air-conditioned rooms are equipped with flat-screen cable TVs with international and Chinese channels. Mini-bar and tea/coffee making facilities are provided. A safety deposit box and hairdryer is included. Bathroom comes with a dental kit, slippers and toiletries.
Guests of the hotel receive free parking privileges. A business center takes care of guests' communication needs, while sightseeing arrangements can be made at the tour desk. Friendly staff are fluent in Chinese and English.
Cafe Oriental and Silkroad serve local cuisine and traditional Chinese favorites while Japanese and Korean dishes can be sampled at Shun Ka Shuu Tou and Hyangtogol respectively. Bar-Roque Grill is a modern rotisserie and bar featuring a French-inspired menu. A fine selection of wines can be enjoyed at Alphabet Bar, while an afternoon high tea session can be enjoyed at Tea Room.
When would you like to stay at Amara Singapore?
This spacious and modern rooms come with free Wi-Fi access, a flat-screen TV, personal safe and complimentary mini-bar daily. The private bathrooms feature a bathtub and separate shower area.
Please note that bed configuration will be subject to availability upon arrival.
These modern rooms are designed by Hirsch Bedner, offering express check-in and check-out services and upgraded amenities. Rooms open up to views of the city. They come with either 1 king-sized bed or 2 single-sized beds and 32-inch LCD cable TVs. Wired high-speed Internet access is complimentary. In-room safes can accommodate laptops. Other conveniences include mini-bars, coffee/tea makers, and complimentary bottled water.
Spacious bathrooms feature shower/tub combination, as well as hair dryers, designer toiletries, bathrobes, and slippers.
Note that guests below the age of 12 years old are not permitted into the Club Lounge from 18:00 to 20:00.
Spacious and modern rooms come with free WiFi access, a flat-screen TV, personal safe and chargeable mini-bar. The private bathrooms feature a bathtub and separate shower area.
Offering city views, these modern rooms include 2 single beds or 1 double bed. They feature a 32-inch LCD cable TVs. Access to wired high-speed Internet is complimentary. In-room safes can accommodate laptops. Other conveniences include mini-bars, coffee/tea makers, and complimentary bottled water. Spacious bathrooms feature shower/tub combination, hair dryers, designer toiletries, bathrobes, and slippers.
Please note that the third person sleeps on a roll-away bed.
This air-conditioned family suite features exclusive access to the Club Lounge. It consists of a living room and a separate master bedroom with an extensive pillow menu. Amenities include a 32-inch flat-screen TV, a personal safe, coffee/tea making facilities, complimentary mini-bar and bottled drinking water. The private bathroom has a bathtub, separate shower area and Roberto Cavalli toiletries.
Spacious and well-appointed, this two-bedroom apartment can accommodate up to 6 guests. It features a living room, 2 bedrooms and a kitchen. Amenities include a flat-screen TV, a personal safe and mini-bar. Private bathroom offers shower facility and free toiletries.
Room features two interconnecting rooms with a King-sized bed and 2 single beds, as well as two bathrooms. Amenities include flat-screen TV, personal safe and mini-bar.
This one-bedroom apartment features a living room, a separate bedroom and a kitchen.
This twin/double room features air conditioning, bathrobe and seating area.
House Rules Amara Singapore takes special requests – add in the next step!
Amara Singapore accepts these cards and reserves the right to temporarily hold an amount prior to arrival.
Please inform Amara Singapore of your expected arrival time in advance. You can use the Special Requests box when booking, or contact the property directly using the contact details in your confirmation.
Very poorly maintained building. Our aircon went from not working, to working and dripping water out of all the vents. No international outlets, no USB.
The people and service was great!
Poor access to the pool and lack of changing facilities due to the temporary reconstruction work (Mar 2019).
It wasnt as clean as I would like it to be.
Our fridge didn't work for the first 2 days. Would prefer real milk instead of creamer. Hair dryer not available in bathroom but room service let me borrow one.
swimming pool under renovate thus its such a hassle to go swim.!
Quality and variety of food in the club lounge was very different from our stay last year - not as good. Dishes of food were often not topped up during the evening drinks' session and usually there was only one member of staff on duty so service was occasionally slow. The variety was definitely less and there was a lack of fresh salad vegetables to accompany the canapes (which had been available last year). It was also difficult to access the pool area and it was a long walk/climb to a toilet when needed. There didn't seem to be any work going on in the new area and an indication of the timings would have been appreciated.
?? Don't know. Happy with it.
I expected a hotel of this stature to at least put a little more effort into giving alternative options on getting from the airport to the hotel.


Song lyrics by Dalriada. Check-out these awesome song lyrics by the artist, learn every word of your favourite song and sing it like Dalriada. Get one of the 7 lyrics and watch the video by artist Dalriada.


text:
Villanueva de Tapia és un poble de la província de Màlaga (Andalusia), que pertany a la comarca de la Comarca Nororiental de Málaga.

Història
Restes de construccions romanes i àrabs demostren que el municipi va acollir a ambdues civilitzacions, però aquests jaciments, molt dispersos, no aporten suficients dades com per a estructurar mínimament un fil conductor de la història de Villanueva de Tapia, les primeres dades de la qual documentats apareixen en el  i fan referència a uns plets entre les localitats d'Iznájar (Còrdova) i Archidona, que, aprofitant segurament la confusió derivada dels repartiments haguts després de la conquesta cristiana, ambdues reclamaven les terres de l'actual Villanueva de Tapia. De l'estira-i-arronsa entre un municipi i l'altre, aviat es va encunyar el nom d'Entredicho per a referir-se a la zona que va generar el conflicte d'interessos entre Archidona i Iznájar, denominació que apareix en un document del  que es conserva en l'Arxiu Municipal d'Iznájar. Com que a la disputa no se li veia la fi, va ser necessària la intervenció de la Reial Hisenda, els consellers de la qual van decidir que El Entredicho quedés integrat en el Patrimoni Reial (20 de juny de 1602).

La falta de liquiditat de la Corona va propiciar que Felip III decidís vendre almenys una part de les terres menys rendibles, i entre aquestes terres d'escassa rendibilitat per a la Corona es trobaven les de l'Entredicho. El terreny va ser comprat per un membre del Suprem Consell de Castella i mecenes de Cervantes, Pedro de Tàpia, sota el palau de la qual va començar a configurar-se, en el , el poble que avui es coneix com a Villanueva de Tapia.

Referències

Municipis de la Comarca Nororiental de Málaga

redpajama_set_name: RedPajamaWikipedia


We continuously update our range with new products and designs check out our Inspiration page for tips on how you can combine our different posters into a stylish gallery wall and how to..
similar Domain Names p is hosted by, unified Layer. Earlier, Kupongkoder owners included, tippo Mohammad Ali Pasha : organization in 2013 as well as : tmap6O-norid : organization in 2012. Hetzner Online GmbH, iP address, server Technologies, nginx, backend server. Norway 15 840 p domain is owned by imad mdibah and its registration expires in 3 months.
Our paperboard must be sourced from responsibly managed forests that we know are replenished and where all important values are preserved. Our packaging preserves the shelf life of food minimising the need for food wastage. Our packaging providers partnership with WWF - UK, has raised consumer awareness about the importance of responsible forest management and the benefits of choosing renewable wood or paper-based materials. Reviews, adult content 0, suspicious activity or malware 0, spam or abuse 0, other. Throughout our manufacturing, transport and carbon management programme, we aim to minimise our carbon emissions. Our packaging is predominantly made from a renewable raw material: paper board, which is also produced mainly using renewable energy. Kompany Kids Child Development Centers serve children from 6 weeks to Pre-K. Spara pengar, använd gratis kupongkoder rabattkoder från. Alla koder för rabatter, erbjudanden, rea och kampanjer. Spar penger, bruk gratis Kupongkoder Rabattkoder fra. Alle koder for Rabatter, Tilbud, Salg og Kampanjer til nettbutikker finner du.


For those seeking to break into pop-culture relevance, podcasting represents an inexpensive way to circumvent the traditional media gatekeepers. However, while there are exceptions, finding fame through podcasting has proved a challenge for most.
While podcasts have been around for a decade, they are still considered an emerging medium. Less than half of Americans (45 percent) know the term "podcasting" (a marriage of "broadcasting" and "pod" as in "iPod"), according to a 2012 study by Edison Research.
That same study found that just 29 percent of Americans had ever downloaded a podcast. That figure was 11 percent in 2006.
Carolla, 49, isn't like most podcasters. Many people recording podcasts in their bedrooms or garages are trying to make a name for themselves. With mainstream recognition already attained, Carolla launched his podcast in February 2009, days after the cancellation of his syndicated radio show. Within weeks of going live, "The Adam Carolla Podcast" (as it was then titled) rocketed up the list of Apple's iTunes Store listings.
While Carolla is less known than his old partner Kimmel, he had the right audience for a successful podcast, said Robert Thompson, director of the Newhouse School's Bleier Center for Television & Popular Culture.
"He had name recognition among a demographic that listens to podcasts," Thompson said.
The biggest consumers of podcasts are young people who generally speaking are used to consuming media through their handheld devices, Thompson said.
He said Carolla has done well in emerging media. His television series "The Man Show" made him a star on basic cable before most people had heard of Comedy Central.
"He seems to always be one medium ahead of the orthodoxy," Thompson said.
Thompson and Harrison agree that podcasting is a good fit for comedy.
In an interview with the Chicago Sun-Times, Carolla recently compared podcasting to doing standup comedy.
Carolla typically opens his podcast, which is usually around 90 minutes and can be downloaded for free, with a riff about something in the news. If it's a live taping, he's likely to spotlight something that happened on the way into town.
That level of unscripted, underproduced comedy would be a trap for many performers. But for Carolla, whether it's radio, television, audio books or podcasting, he seems to be in his element without a net.
"What made him good in this realm is he's uniquely Adam Carolla," Harrison said.


text:
Download Room
Downloadable - hi res
Adam, Joseph
Adelmann, Dale
Adoramus Vocal Ensemble, Mark Burrows, director
Anderson, Jason
Apollo Chorus of Chicago/Stephen Alltop
Arcus, David
Bach Choir of Pittsburgh
Ball, David O.
Bara, Daniel
Bates, Robert
Bay Brass
Bellotti, Edoardo
Blanc, Frederick
Bode, Robert
Boston Brass
Brown, Kyler
Buonemani, James
Butler, J. Melvin
Butler, Lynn Edwards
Cathedral Choral Society (Washington, DC)
Chapman, Keith
Chenault, Elizabeth
Chenault, Ray
Chicago a cappella
Choir of Abbey School, Tewkesbury
Choir of All Saints Episcopal Church, Beverly Hills
Choir of Christ Church (Rochester, NY)
Choir of Christ Church Cathedral, Indianapolis
Choir of Church of the Incarnation, Dallas
Choir of First Congregational Church, Los Angeles
Choir of First United Methodist Church, Lubbock, Texas
Choir of Grace Cathedral, San Francisco
Choir of St James Episcopal (Los Angeles)
Choir of St. John's Cathedral, Denver
Choir of St. John's Church, Lafayette Square (DC)
Choir of St. Mark's Cathedral, Minneapolis
Choir of St. Mark's Cathedral, Seattle
Choir of St. Paul's Episcopal Church, Indianapolis
Choir of St. Paul's Parish, K Street, Washington, DC
Choir of St. Thomas Church, NYC
Choir of the Basilica of the National Shrine
Choir of the Church of the Incarnation - Dallas
Choir of the Crystal Cathedral
Choir of the Riverside Church, NYC
Choir of the Tower of London Chapel
Choir of Trinity Church, Boston
Choir of Trinity Church, Wall St. (NYC)
Choir of Trinity College, Cambridge, England/Richard Marlow
Choir of Washington National Cathedral
Choirs of St Philips Cathedral, Atlanta
Choral Arts NW
Choral Project, The /Daniel Hughes
Choral Scholars of King's College, Cambridge England
Ciofini, Fabio
Clark, Andrew
Clark, Robert
Cleveland, Douglas
Compline Choir
Concord Brass Ensemble
Conte, Peter Richard
Conzius, Erik
Copley Singers
Craighead, David
Crawford, Penelope
Crozier, Catharine
Dahl, David
Dale Warland Singers
Davidsson, Hans
Davidsson, Ulrika
Decker, Pamela
Dettra, Scott
DiFiore, David
Dimmock, Jonathan
Douglass, Fenner
Dumler, Donald
Durufle, Marie-Madeleine Chevalier
Durufle, Maurice
East Carolina University Chamber Singers
Eschbach, Jesse
Fairfax Choral Society and Orchestra/Douglas Mears
Fenstermaker, John
Ferre, Susan
Fishburn, David
Fishell, Janette
Fuller, David
Georgia State University Singers
Goode, David
Grogan, Robert
Hallock, Peter
Hancock, Gerre
Hancock, Judith
Hansen, Edward
Harvard Choruses
Harvard University Choir
Heller, David
Higgs, David
Hill, David
Holloway, James D.
Multi-disc sets!
3 CD sets
7 CD collections
10 CD collections
Double CD albums
The Organ Loft
Organ Plus!
Civic Organs
Theatre Organ
Premiere recordings (new works)
Grammys and Award winners
You are here: Home > Featured Organs > Gothenburg, Sweden: The North German Baroque Organ
The scientific reconstruction of a large North German Baroque city organ from around 1700 was the aim of a unique organ research project which started in 1989 and ended with the inauguration of the organ in August 2000. Arp Schnitger (1648–1719), the most famous organ builder of his time, dominated the organ-building craft in <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />North Germany during the latter part of the 17th century and at the beginning of the 18th century, making Schnitger's instruments the logical models to be studied for the new organ. The new organ has 54 stops on four manuals and pedal, and was built in the organ research workshop at Göteborg University, where all organ research activities have merged into the Göteborg Organ Art Center (GOArt). The project was carried out in collaboration with Chalmers University of Technology, and financed by government research subsidies, funds from various research foundations, and first and foremost from the Bank of Sweden Tercentenary Foundation as well as Svenska Handelsbanken.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
The organ case is a reconstruction of Schnitger's organ in the Lübeck Cathedral (1699), which was a true city organ, and with dimensions complementary to the Örgryte New Church. This type of organ was based on the typical North German "Werk" concept: Hauptwerk, Rückpositiv, Pedal towers on either side and a Brüstpositiv directly over the keyboards. The Oberpositiv, not visible in the façade, is placed behind and a little higher than the Hauptwerk.
Reconstruction of the organ façade was made possible with the help of old photographs of the Schnitger organ in the Lübeck Cathedral, drawings of the church, and dimensions of the organ from various archives. With the aid of photogrammetry and geometrical calculations, the original proportions of the façade could be defined. The Örgryte organ's pipe shades are also modeled after the Schnitger organ in the Lübeck Cathedral. Archival research by Dr. Kerala Snyder, New Haven, USA, confirmed that Schnitger's façade was made by the well-known wood-cutter, Joachim Budde, during a period of several years in the 1690s.
The pipework was modeled after the Schnitger organ in the St. Jacobi Church, Hamburg, where most of the original pipes were saved from destruction during the Second World War. This instrument contains the highest number of preserved pipes of any Schnitger organ, including 14 reed stops.The windchests also use the organ in the St. Jacobi Church, Hamburg, as a prototype. The organs in the St. Cosmae Church, Stade, and the Aa-kerk, Groningen, were also important references. Even though the organ was changed in certain respects during renovations and reconstruction, it was an obvious choice as the prototype for our organ. It was possible to thoroughly study the pipework thanks to the kind hospitality of the St. Jacobi congregation, its organist, Rudolf Kelber, and particularly Jürgen Ahrend, who restored the instrument at the beginning of the 1990s.
The Hamburg instrument contains pipes built by more than three generations of organ builders: the Scherer family, Gottfried Fritzsche, and Arp Schnitger. Schnitger re-used some of the older organ's best pipework for his new organ. The pipework of these organ builders differs from one another in several respects, which meant that their three different manufacturing methods had to be reconstructed for the creation of the new organ. The Scherers and their predecessors used nearly pure lead and possibly cast with a method different than that which both Fritzsche and Schnitger used for their alloys, which included tin. The metal sheets containing high levels of lead were hammered, while those alloyed with tin were planed and scraped. Through these investigations and further studies of existing old pipes, it became clear that the 17th-century organ-pipe metal in the northern part of Germany was cast on sand. Unfortunately, the sand casting technique was not described in any historical documents other than a few brief or vague descriptions, and within the frame of the project it was necessary to re-discover how this was done.
The twelve bellows were built according to the preserved bellows in the Grote Kerk, Zwolle (The Netherlands). Other parts were based on analyses of measurements from various Schnitger organs in Germany (Stade, St. Cosmae Church, Neuenfelde, and Pellworm).Because a complete Schnitger wind system has not been preserved, parts of wind systems preserved in various organs and related information on the dimensions of older systems taken from church congregation archives were used as a starting point for the reconstruction work. It was decided to build a flexible system with extra ducts and valves, making it possible to test three known wind systems of larger Schnitger organs: Hamburg, Magdeburg, and Zwolle.
Schnitger's console from the organ in the Lübeck Cathedral is preserved at the St. Annen Museum in Lübeck. In order to facilitate the construction of our console, the museum loaned Schnitger's model to Göteborg during a major part of 1997. All the details of the Lübeck console were meticulously documented in the workshop. The new North German organ console has four manuals, while the preserved Schnitger console has only three. To construct a four-manual console based on Lübeck, the organ built by Frans Caspar Schnitger (Arp Schnitger's son) in Zwolle, The Netherlands, was used as another reference, and a picture of the old Hamburg console was also consulted. All of the details in the Lübeck design and materials were followed, with one exception: extra keys, so-called sub-semitones, were added.
In order to come closer to the sound of the Baroque era, it was necessary to reconstruct the methods of this ancient organ-building handcraft. This reconstruction was possible through the combination of extensive research on pipe material, acoustics, and airflow dynamics done at Chalmers, and through experimentation and development of handcraft techniques in the organ workshop, rediscovering forgotten methods, and making them available for future organ projects. All of the research results and their practical application are documented in an extensive publication.
Three organ builders were responsible for the building of the instrument: Henk van Eeken, The Netherlands (head draftsman), Mats Arvidsson, Sweden (construction of the organ [excluding the organ pipes]), and Munetaka Yokota, Japan/USA (research and production and voicing of the organ pipes). Near the end of the project, organ builder Reinalt Klein, Germany, coordinated the work in the organ research workshop and assisted with the pre-intonation of the organ. Christiane and Harald Sandler, Germany, designed the wood carvings, made drafts, and managed the wood carving group. Together with organ builders, wood carvers, apprentices, and journeymen, they made a team which included 12 nationalities. Bertil Estling was administrator during the later part of the project. Harald Vogel, Germany, was the external advisor, while Hans Davidsson, Sweden, directed the project and the research. The organ is built of oak that was donated, cut, and prepared by organ builder Oskar Metzler, Oetwil, Switzerland.
The Örgryte New Church, designed by architect Adrian Petersson and built in a neo-Gothic style in 1888–1890, was renovated in 1996–1997 to meet the requirements of the organ project, and its interior was also restored. On the northside balcony stands a three-manual organ built in 1871 by Father Henry Willis. Although the new Baroque organ's architecture is markedly different from the rest of the church's interior, the new balcony was built in the style of the 17th century. On both sides of the organ, side balconies extend along the walls of the nave— musicians' balconies for instrumentalists and singers.
The organ is tuned in meantone with pure thirds, a tuning that Schnitger probably used in most of his instruments, and that was definitely used in the organ at St. Jacobi. In this tuning, which was normal throughout Europe during the 17th century, eight major and minor keys sound especially good because of the pure major thirds. Chromatic passages are especially effective, because there are two different half steps: the smaller, chromatic step (like f to f sharp) and the larger, diatonic one (like f sharp to g). Having pure thirds in the most-often-used keys comes with a price: the so-called "wolf" between g sharp and e flat is closer to a dissonant diminished sixth than a fifth. The circle of fifths is not closed, and the use of more distant keys is therefore limited.
In order to play in more distant keys during the 16th and 17th centuries, organs and stringed keyboard instruments had sub-semitones with split sharps. The Göteborg organ has two split sharps per octave on the upper three manuals (d sharp/e flat and g sharp/a flat). These often appear in the organ repertoire from that time, and in many cases make it possible to use the organ to accompany voices and other instruments in more distant keys. In the Rückpositiv there are three sub-semitones per octave (d sharp/e flat and g sharp/a flat and a sharp/b flat), using the St. Jacobi organ during Matthias Weckman's time as a model. The Göteborg organ is the only organ on which the whole North European Renaissance and Baroque organ repertoire can be performed in quarter-comma meantone.
It is a special experience in Örgryte to hear the blending of the large plenum sound and the many reed voices with so many pure intervals. The reconstructed North German organ in Göteborg is the largest existing meantone-tuned organ, and presents a unique opportunity to perform the music of the 17th century, the golden age of North European organ music.
Paul Peeters & Harald Vogel
Specifications of the North German Organ
Göteborg University, Göteborg, Sweden
The name after each stop indicates the style of the original builder that the stop is made after. Abbreviations:
Scherer and his school: Sch
Fritzsche: Fri
Schnitger: AS
Other: described individually
The name with bold letters indicates that most of the pipes are made in that style.
Rück Positiv (CDE-c3)
1. Principal 8 fuß (AS, Tin)
2. Quintadena 8 fuß (Sch?/Fr/AS)
3. Gedact 8 fuß (Sch)
4. Octav 4 fuß (Fr/AS)
5. Blockfloit 4 fuß (Sch)
6. Octav 2 fuß (Fr)
7. Quer Floit 2 fuß (Fr)
8. Sieffloit 1 1/2 fuß (Fr)
9. Sexquialt 2 fach (Fr)
10. Scharff 6.7.8. fach (Fr)
11. Dulcian 16 fuß (AS)
12. Bahrpfeiff 8 fuß (Bass/Tenor AS, other based on F. C. Schnitger)
Werck (CDEFGA-c3)
1. Principal 16 fuß (AS, Tin)
2. Quintaden 16 fuß (Fr/AS)
3. Octav 8 fuß (Sch/AS)
4. Spitzfloit 8 fuß (AS)
6. Super Octav 2 fuß (AS)
7. Rauschpfeiff 2 fach (Sch/AS)
8. Mixtur 6.7.8. fach (Fr)
9. Trommet16 fuß (Fr/AS)
Ober Positiv (CDEFGA-c3)
1. Principal 8 fuß (AS)
2. Hollfloit 8 fuß (AS, Oak)
3. Rohrfloit 8 fuß (AS)
5. Octav 4 fuß (Sch/Fr?)
6. Nassat 3 fuß (AS)
7. Gemshorn 2 fuß (Sch)
9. Scharff 6 fach (Fr)
10. Cimbel 3 fach (Fr)
11. Trommet 8 fuß (AS)
12. Vox Humana 8 fuß (AS)
13. Zincke 8 fuß (based on Appingedam); from f°
Brust Positiv (CDEFGA-c3)
1. Principal 8 fuß (Fr, Oak)
2. Octav 4 fuß (Sch?/Fr?))
3. Hollfloit 4 fuß (AS)
4. Waltfloit 2 fuß (AS)
5. Sexquialter 2 fach (Fr)
6. Scharff 4.5.6. fach (AS)
7. Dulcian 8 fuß (AS)
8. Trechter Regal8 fuß (AS)
Pedal (CD-d1)
2. SubBass 16 fuß (AS)
3. Octav 8 fuß (AS)
5. Rauschpfeiffe 3fach (AS)
6. Mixtur 6.7.8.fach (Fr)
7. Posaunen 32 fuß (AS); from F
8. Posaunen 16 fuß (AS)
9. Dulcian 16 fuß (AS)
11. Trommet 4 fuß (AS, Tin)
12. Cornet 2 fuß (AS, Tin)
Couplers: OP/W, BP/W
Cimbelstern
Sperrventiele: W, RP, OP, BP, Ped.
Hauptsperrventiel
Tremulant, Tremulant RP, Tremulant Pedal
Bellows: 12 of 4' x 8'
1/4 syntonic comma meantone
Sub-semitones in all Werks: eb/d#, g#/ab, eb1/d#1, g#1/ab1, eb2/d#2
In RP, add: bb/a#, bb1/a#1, g#2/ab2
In Pedal: eb/d#, g#/ab
3 interchangeable wind systems
Franz Tunder Organ Works/Ruiter-Feenstra (2 CDs!)
Our Price: $19.98 - includes Free Shipping!
Buxtehude organ works, v.1: Buxtehude and the Mean-Tone Organ/Davidsson (2 CDs!)
Buxtehude organ works, v.2: The Bach Perspective/Davidsson (2 CDs!)
Organ Works of Franz Tunder North German Baroque organ Örgryte nya kyrka, Göteborg, Sweden Pamela Ruiter-Feenstra, organist Franz Tunder was a brilliant composer of North German organ music two generations before Bach. Predecessor and father-in-law to Dieterich Buxtehude at St. Mary's Church in Lübeck, Germany, he presided over the large North German organ in a room of monumental scale. This is the first American recording of the new North German Organ, part of a research project in Göteborg, Sweden, that is changing organ building practices around the world. Detailed description of the organ and complete registrations are included in the booklet text. The first of three volumes (7 CDs total) of the complete organ works of Buxtehude; Volume One focuses on Buxtehude's best known works, and their relationship to mean-tone tuning temperament.
Drawn by reports of the acclaimed organist of the Mariankirche in Lübeck, Dieterich Buxtehude, the 20-year old J. S. Bach traveled almost 300 miles to hear Buxtehude's music first hand. On the second in our three-volume set of the complete organ works of Buxtehude, Hans Davidsson plays the ground-breaking repertoire that was known to Bach and his circle, and which may have influenced his musical compositions and performance.
Jan Pieterszoon Sweelinck: Master of the Dutch Renaissance/Dimmock (2 CDs!)
Buxtehude organ works, v.3: Buxtehude and the Schnitger Organ (3 CDs!)/Davidsson
Complete Works of Weckman/Hans Davidsson (3 CDs!)
Known as the "Orpheus of Amsterdam," Jan Pieterszoon Sweelinck was the greatest single influence on the succeeding generation of north European organists and composers, including H. Scheidemann, J. Praetorius II, M. Schildt, and both Samuel and Gottfried Scheidt.
Jonathan Dimmock brings these influential works to life on three landmark mean-tone organs in Holland and Sweden. Buxtehude's visit with Arp Schnitger in Hamburg in 1687 began an association that lasted for many years and resulted in the building of the four-manual organ at the Cathedral in Lùbeck, as well as modifications to the organ at Saint Marien. Hans Davidsson explores the encounter between Buxtehude and Schnitger using the four-manual organ in Gothenburg, Sweden in this final volume of the complete works of Buxtehude.
Georg Böhm: Complete Organ Works (3 CDs)
Buxtehude Organ Works - Complete (7 CDs!)/Davidsson
The first recording of Georg Böhm's (Boehm, Bohm) complete organ works performed on a large, four-manual organ, similar to the Schnitger organs in Hamburg that inspired his stylistically diverse compositions. Later Boehm became mentor to the young J.S. Bach in Luneburg.
This product includes a free YouTube hosted video by the Davidsson Organ and Dance Collaborative. For details on this video and its role in the performance of this CD collection, see the article in the on-line PDF booklet.
Recent research shows that Buxtehude had only mean-tone organs at his disposal during his life. Although there are many good recordings on well-tempered organs (including some antiques), performing these works on mean-tone instruments requires both a radical re-assessment of traditional performance ideas and a large and extraordinary organ. Hans Davidsson is the ideal performer for this task, and he plays the huge "North German Baroque Organ" of Gothenburg, Sweden. The complete organ works are recorded here in three volumes totaling 7 compact discs.
Copyright © 2013 Loft Recordings, LLC. All Rights Reserved.

redpajama_set_name: RedPajamaCommonCrawl


For as long as I can remember, I have been a shoe addict. I think I inherited my addiction from my mom. Growing up, she had an amazing shoe collection. No matter the occasion, my mother had the perfect shoe for it. Following in her footsteps (pun intended), I have been working on my shoe collection, but when you have wide feet, finding the perfect shoe requires a lot more work and a lot of patience.
My mother describes my feet as Barney Rubble feet (I am dating myself, but hey oh well...lol). They are short and wide, but here is the kicker, I have a narrow heel. So when I go shoe shopping, I would have to be mindful if I size up to accommodate the width of my foot, and that my heel does not come out of the shoe. Epic struggle. There has been so many shoes that I have passed on because the fit was just not right. Now here comes Shoes of Prey to change everything. I don't have to forgo wearing certain styles just because they don't fit. I can make my own shoes that work for my needs.
Shoes of Prey is a one stop shop for shoes. As soon as you go on to the site, they ask for your size, their shoes start at a size 2 and go up to a 15. Just the fact that their size range is that vast is impressive, but then you add the option of narrow, wide, and extra wide?!?!? I was extremely giddy. So when the brand reached out, asking me if I want to customized a pair of shoes for myself, I said absolutely.
Would you wait up to two weeks for the shoe of your dreams? I did!!! Soo worth it.
So then what oh what should I get....there are so many on their site that you can search for hours. To aid in my search I looked for those shoes that came in wide width. I was looking at all the great choices like the Bay (flat), the Austin (ankle strap pump), and the Ludlow (sneaker). I went with the Jasmin which is a heeled mule. I've been obsessed with heels and slides, so getting Jasmin was a no brainer.
I wanted to battle test these and see how comfortable they were. When I buy new shoes, I first give a try at home just to see how well it fits. If that goes well, I do a short term test, and wear these while I doing something low key for a couple of hours. I was wearing these for a while and I did not want to take them off. No matter how low or high a shoe is, after standing around for a while, my feet start to ache. Not in these shoes. Great cushioning, and the fit was perfect. Now I know there is a perfect shoe out there that is stylish and comfortable. I love my mules so much, that I am already looking into customizing another pair of shoes. Definitely check out Shoes of Prey, there is something for everyone. Added bonus if you use my code STYLEOVERSIZE, you can get a free inscription!!!
My shoes look amazing, fit great, and I can easily dress them up or down. Since it was casual day out, I wore this super comfy jumpsuit and was able to keep my hands free with my cool quilted fanny pack. I topped out my look with my favorite rose gold accessories. If you had a chance to customize your own shoe, what would you choose? Heels or flats? Prints or Solid Colors? Sound off in the comments!!!
The first blogger I ever met was Sandra from La Pecosa Preciosa. We bonded over our love for the same Forever 21+ sweater. Over the course of our friendship, we have found out that we have so much of the same clothes. We affectionately nicknamed each other Twinny and the rest is history. Despite having so many items in common, there are times where she inspires me to try something new. Last week she posted herself in an Ashley Stewart polka dot dress. I loved her outfit so much, I thought I would do a remix. Most remix outfits are fairly similar, but I wanted to do a Puff Daddy remix- instead of wearing a dress, I went with a polka dot jumpsuit.
This lovely polka dot jumpsuit is from Eloquii and it is just the cutest. I love that it is wide leg crop so it's flattering on any one. Jumpsuits can be tricky for my fellow vertically challenged ladies, but with a cropped one, all you need to do is throw on a pair of heels to elongate your silhouette. Besides the length of your jumpsuit, another major decision factor is the room in the hips and thighs. Since this is a wide leg version, despite the fact it does not stretch, I went with a 16. Since I am never without a jacket, I always toughen up my polka dots with a moto jacket. There are a lot of cute moto's out this season in ton of colors, so definitely give one a try. Polka dots and pink go hand in hand, so pink pumps and clutch ended out my look. I really enjoyed working on this post and I definitely will do this again. If you see an outfit that you want me to remix email me at styleoversize@gmail.com and I will make it happen!


text:
We must be properly connected to our Source of Power in order for there to be light.
Meditation Thought: "You are the light of the world." (Matthew 5:14)
The lamp cannot burn and give light without a power source – whether it is oil, electricity, battery. So, too, we must be properly connected to our Source of Power in order for there to be light. Without it, our purpose is never fulfilled. We may be an ornament without it – but never become the comfort, the guide, the help that we should be to the world. The more Power we allow to flow through us, the more light we shed – and the more helpful we will be.
Author kdorwayPosted on May 22, 2022 Categories Abundant Living, Encourage, Faith, Obedience, Purpose, Serve, SpiritFilledLiving, wisdomTags Matthew 5:14
Previous Previous post: Woodworking
Next Next post: Paths of Discovery
Finding Help January 22, 2023
Faith Over Fear January 18, 2023
Perspective for Unity January 16, 2023
Flooded with Sunlight January 12, 2023
Love in the Silence January 4, 2023


And National Agricultural biotechnology Research Center of Ethiopia also launched various tissue culture programs in crops like enset, sweet potato, grape etc.
14) The scientific name of enset (false banana) is enset ventricosum.
Enset is the only non-profit Domain Registrar in the .
In the bivariate analysis, women from enset staple diet category, compared to maize staple diet, had better Hgb status and reduced odds of anaemia.
The anatomy of ovule ontogeny of banana, plantain and enset (Musaceae).
Enset is used a staple food source by more than 15 million Ethiopians.
42 [micro]mol/L) was significantly higher than those who reported enset [(0.
degree in 1980 and the doctoral degree in 1983, all from the ENSET (Institute of Technical Sciences), University of Tunis, Tunisia.
2) INANOTECH (Institute of Nanomaterials and Nanotechnology), MASclR (Moroccan Advanced Science, Innovation and Research Foundation), ENSET, Av.
Diseases of banana, Abaca and Enset, CABI publishing, Wallingford, UK.
Isolation and physico-chemical properties of enset starch.
The basic food of the area is enset, or false banana.


Vaseline serves a variety of purposes and there is never a shortage of beauty and household tasks that you can perform using this product.
Vaseline is an inexpensive product and is found at most drugstores and supermarkets. Here are some good ways to use Vaseline for everyday use.
look and feel smooth. If you want scented Vaseline, you can add a few drops of jojoba oil, coconut oil or lavender oil to it so that your skin smells great too.


text:
Photo via NRATV Youtube Video Screenshot
Candace Owens Slams Biden with Accusations of Racist Past
By G. McConway on April 29, 2019
Candace Owens is truly making her mark in the political world.
Owens absolutely shredded presidential candidate Joe Biden for spewing racist rhetoric when he himself may be actually hiding his own racist behavior in the past.
Covering Up Their Own Actions
According to Owens, Democrats are using sleight-of-hand in this election cycle.
In essence, they are accusing Donald Trump and Republicans of conduct they are actually doing or have done in the past.
Owens used Biden's defense of segregation in the 1970s.
"It was Joe Biden that advocated for segregation in the 1970s," Owens stated.
She continued, "It was something that black people wanted.
"That it was best that we remain apart in society."
Biden was also behind the Crime Bill in 1994 that has been widely credited with the mass incarceration of black males in the 1990s.
The presidential candidate has also, now and in years past, pointed to Robert Byrd as his mentor.
Byrd was the founder of a Ku Klux Klan chapter in West Virginia.
The late Senator Byrd once penned a letter to his fellow Democrat Theodore Bilbo in 1944 stating:
"I shall never fight in the armed forces with a negro by my side.
"Rather I should die a thousand times, and see Old Glory trampled in the dirt never to rise again, than to see this beloved land of ours become degraded by race mongrels, a throwback to the blackest specimen from the wilds."
Byrd only repented his blatant racism when society deemed it no longer acceptable to be openly racist.
Blaming the NRA
Another point made by Owens is the unending assault on the NRA by Democrats.
When there is a mass shooting, the NRA gets blamed, even though no member of the NRA has ever actually been involved in a mass shooting.
The real problems, as Senator Cruz (R-TX) had stated earlier, are the laws and the people doing the shooting.
If Chicago, which has some of the strictest gun laws in the country, is among the leaders in the country in gun violence, how can more gun laws make a difference?
The real problem today is the fact that laws on the books are not even enforced.
Criminals slip through the cracks because administrators are too lazy to do paperwork.
Every liberal city in this country is violence-ridden and an absolute disgrace.
Philadelphia, Baltimore, Chicago, Detroit… all cities that were once considered the price of the nation are now sanctuary cities and blood is shed on the streets virtually every night.
The more this young lady talks, the more support she receives from conservative Americans.
If she keeps it up, she may not be the first female president, but she surely may become president one day.
You can see her full speech below…
We depend on our readers to help us get the word out. So, if you agree with this article, please like and share the article on your favorite social media outlet.


text:
    <meta http-equiv="Content-Type" content="text/html; charset=Windows-1252" />
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5" />
    <title>SQLSchemaTool.CompareTables Method (String, XmlDocument, XmlDocument, XmlDocument, XmlDiff)</title>
    <xml>
    </xml>
    <link rel="stylesheet" type="text/css" href="MSDN.css" />

            SQL Schema Tool Help

SQLSchemaTool.CompareTables Method (String, XmlDocument, XmlDocument, XmlDocument, XmlDiff)

 Compares SQL table schemas from two distinct XML schema files. These files are generated by the SerializeDB method.

public static void CompareTables(
   string _serverDB,
   XmlDocument xmlSourceDoc,
   XmlDocument xmlDestinationDoc,
   XmlDocument xmlDiffDoc,
   XmlDiff xmlDiff
);

Parameters

          _serverDB

          xmlSourceDoc

The XmlDataDocument, the source XML to compare with the destination XML.

          xmlDestinationDoc

The XmlDataDocument, the destination/target XML to compare with the source XML.

          xmlDiffDoc

The XML Diffgram document to update.

          xmlDiff

The XmlDiff Object used from the GotDotNet XmlDiff class. Performs the XML node compare.

See Also

        SQLSchemaTool Class | Lewis.SST Namespace | SQLSchemaTool.CompareTables Overload List

      <object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e" viewastext="true" style="display: none;">
        <param name="Keyword" value="CompareTables method">
        </param>
        <param name="Keyword" value="CompareTables method, SQLSchemaTool class">
        </param>
        <param name="Keyword" value="SQLSchemaTool.CompareTables method">
        </param>
      </object>

Generated from assembly SST [1.0.2793.35291]

redpajama_set_name: RedPajamaGithub


I have passed the three-year mark with the official diagnosis of rheumatoid arthritis. I am better in some ways. I can work the disease better. I am worse in some ways. The damn thing just won't go away.
I remember when I realized that I only see my rheumatologist at best every six weeks and at worst every three months. I realized that I was on my own most of the time. I was on my own to manage my rheumatoid arthritis, two cancers, my home, my life. And if I didn't take charge, no one would. At 72, I had better get busy.
I did think about it. One choice was to withdraw into myself. My rheumatologist said many do. I also had the choice of focusing on the here and now and managing my situation.
Historically, when I have been in a bad place I have felt sorry for myself a bit. I call it whining. A little is okay. It is just something a person sometimes needs to go through. Eventually, I get my bearings. I see what I have to do next. I do it. I keep going. This works for me.
I have a good doctor. My rheumatologist is the best. She has me on Orencia. My rheumatologist says if this doesn't work we will move on to the next thing. We work together wading through the quagmire of RA. She is a good companion. I have plenty of issues.
I spent many sleepless nights enduring all the crap that RA gives you. My doctor ordered a sedative. I am expected to take it nightly and I sleep. Problem solved.
My copay for Orencia is hefty each month. I found help in paying a good part of my co-pay. I sought this help out. Help is there somewhere. It is sometimes hard to find but you have to look for it. Sometimes really hard.
I found a palliative care nurse. Again I was looking for someone to help coordinate the specialists, drugs and symptoms that I have. She meets for an hour. She is not expensive. I can see her as often as I need. She is a port in the storm.
I can manage better than I used to because I understand that there will be flare days, fatigue days, down days, etc. So I am not impatient with myself. I adjust my schedule. I can use the concept of pacing myself. I can go with the flow.
I have a plan. When I have a flare, I have additional medication for pain and for inflammation that I take on schedule. I feel safe. I feel safe because I have a plan for those times and I have the tools I need to get through them. It is a time I need to take good care of myself. The flare will pass and times will always be better.
I am committed to my community. I am on the board of Cancer Support Now. It gives me purpose and focus for a cause I believe in.
I have routine. A nice part of that routine is making dinner for my son. We eat together and do dishes together. It is a welcome part of the day. Routine is healthy, and it should mean things to look forward to each day.
Managing rheumatoid arthritis is not easy. We could say that we didn't ask for it. We didn't. We still have it. It is part of our life and we need to manage it. What is the alternative?


The quality and comfort of your office chair affects your health and productivity. With so many options, though, picking the right one for you isn't easy. This graphic from Office Chairs Unlimited can help.
Most of the pointers are ones we've noted before in our guide to ergonomically optimizing your workspace: Arm rests should keep your elbows bent 90 degrees, seat height and back rest height should be adjustable, etc. The graphic lays it all out visually so you can see what you need to look for in an office chair at a glance (or even print this out and take with you when chair shopping).
A good guideline is while seated to have three- or four-fingers width distance between the back of your knees and the front edge of the seat.
Seats that are too long for you could make you sit forward, straining your legs and back. Seats that are too close to your knees, on the other hand, can cause circulation problems, Lifehacker reader nacoran notes.


text:
Martha Redbone: Bone Hill - The Concert
As an avid theater goer and also a music fan, "Martha Redbone: Bone Hill - The Concert" felt like a cross between a play reading and folk concert. Bone Hill tells the story of Martha Redbone's family going back four generations in the Black Mountains of Harlan County, Kentucky. It tells the story of a undeniably American family with music that is also very American. In telling this family story we, the audience, also get a history lesson. An expanded telling of a history that we might think we already know. The history of the Trail of Tears and coal mining in Appalachia. This combination of family and American history is wonderfully facilitated by a fusion of genres of music, from traditional Cherokee chants and lullabies, to blues and Rock and Roll.
The evening switched back and forth between these songs and spoken narration and scenes. The musicans on the stage took on the roles of members from Martha Redbone's family and the people of Harlan country. It is hard to decide which was more intriguing, the music or the spoken story that accompanied it. In many ways it is hard to separate the two. I do know that I would love to have an album of Bone Hill the concert so that I could hear the songs again. I would also love to see this story expanded past its current telling. It is entirely engrossing in its current form but also has potential to evolve into a more theatrical piece.
Bone Hill - The Concert tells the story of a family, it tells a story of love, and it tells a story of a connection to the land of a particular place. It does this with a blend of different genres of American music. And in the end what you get is a uniquely American creation.
This performance was part of Ordway's World Music and Dance series. There are six more performances by different artists left in this series this year. More information can be found on the Ordway's website.
Thank you to the Ordway for inviting me to this production.


text:
A kötésrend – ahogyan a fogalmat Linus Pauling bevezette – a kötések és a lazítókötések közötti különbségként van definiálva.

A kötésszám maga a két atom közötti elektronpárok (kötések) számát fejezi ki. Például a kétatomos N≡N nitrogénmolekulában a kötésszám 3, míg a H−C≡C−H (acetilén) esetén a két szénatom között a kötésszám 3, a C−H kötés esetén pedig 1. A kötésszám a kötés erősségéről ad információt. Az izoelektronos (vagyis azonos elektronszámmal rendelkező) részecskék kötésszáma megegyezik.

Rezonanciával vagy hagyományostól eltérő kötéssel bíró molekuláknak a kötésszáma nem feltétlenül egész szám. Jó példa erre a benzolmolekulában található szénatomok közötti kötés, mivel a 6 szénatomon delokalizált molekulapályákon 6 π-elektron helyezkedik el, így ez egy fél π-kötést jelent. A σ-kötésekkel együtt tehát a kötésszám 1,5. Ugyanakkor bonyolultabb helyzetekben például 1,1-es kötésszám is előfordulhat, ami a kötés erősségét jelzi az 1-es kötésrendű kötés esetéhez képest.

Kötésrend a molekulapálya-elméletben
A molekulapálya-elméletben a kötésrendet a lenti egyenlet szerint, a kötő- és lazítóelektronok különbségének feleként számítják ki. A kötésrend a kötés erősségének is fokmérője, és kiterjedten használják a vegyértékkötés-elméletben is.

Általánosságban véve minél nagyobb a kötésrend, a kötés annál erősebb. A 0,5 értékű kötésrend stabilis lehet, amint azt a  (kötéshossz 106 pm, kötési energia 269 kJ/mol) és a  (kötéshossz 108 pm, kötési energia 251 kJ/mol) stabilitása mutatja.

Egyéb definíciók
A kötésrend fogalmát használják a molekuláris dinamikában és a kötésrend-potenciálban is. A kötésrend nagysága a kötéshossz mértékével függ össze. Linus Pauling 1947-es eredménye szerint a kötésrend kísérletileg az alábbi összefüggéssel adható meg:

ahol  az egyszeres kötés hossza,  a kísérletileg mért kötéshossz,  a kötésben részt vevő atomoktól függő állandó. Szén–szén kötések esetén Pauling  értékére 0,353 Å-öt javasolt az eredeti egyenletben:

A kötésrend fenti definíciója némileg alkalomszerű, és csak kétatomos molekulákra alkalmazható egyszerűen. A Hückel-féle molekulapálya-elmélet egy másik megközelítést kínál a kötésrend megállapítására, amely a molekulapályák együtthatóin alapul. Mivel az elmélet felosztja a kötéseket egy szigma- és egy pi-keretrendszerre, a Hückel-definíció csak az egy síkon fekvő, delokalizált π-kötéssel rendelkező molekulákra alkalmazható. Ha 1-es kötésrendet feltételezünk a szigma-komponensnek, akkor a benzol kötésrendjére 1,67-es összesített (σ + π) értéket kapunk a gyakran említett 1,5-tel szemben. Ez némi félreérthetőséget jelez a kötésrend definícióját illetően. A standard, kvantummechanikai alapokon nyugvó definícióról hosszú viták folytak. 2017-ben publikáltak egy átfogó módszert a kötésrend kiszámolására kvantumkémiai kalkulációk alapján.

Jegyzetek

Fordítás

Kémiai kötések


SINGAPORE — In my last conversation with the late Letty Jimenez Magsanoc, legendary Inquirer editor in chief from 1991 to 2015, I asked about social media algorithms driving what news we see.
Close to midnight after the December 2014 anniversary party, LJM sat by the large round table at the newsroom's center, having just put the paper to bed.
She sipped her red wine and smiled.
No computer will ever replace a journalist with 30 years' experience, she replied succinctly.
Her parting wisdom continues to inspire me as I ponder how radically technology has transformed newspapers, which we now read from smartphones.
News competes on social media feeds with selfies and cat videos. Fake news influences elections. We demand information instantly, complete with raw video.
But, most crucially, revenue streams have shrunk dramatically, diverted to social media platforms and search engines.
Should news be free? Should the newsboy be paid more than the newspaper?
Quality journalism is critical to fighting fake news, emphasized the landmark 176-page "Committee Report on Deliberate Online Falsehoods" submitted to Singapore's parliament.
Yet broadsheets around the world have cut staff, even the venerable UK The Guardian, New York Daily News and Singapore Straits Times.
Must we thus analyze fake news as a financial anomaly?
The default model relies on privately-owned newspapers upholding public interest. We presume readers will pay for the most accurate, incisive content, and market forces compensate for the individual owner's biases.
Amazon founder Jeff Bezos was inspired to acquire the 140-year-old The Washington Post in 2013 and make it data-driven and social media savvy. Alibaba founder Jack Ma had similar aspirations, buying the 115-year-old South China Morning Post in 2016.
But the Singapore report argues that fake news can threaten national security. Is real news thus a public good, to be funded like highways and police?
Governments cannot operate newspapers, which need independence, but could fund independent bodies.
Or we could treat newspapers as charities, subscribing or crowdfunding out of patriotism. The Guardian was supported by the Scott Trust, founded in 1936.
If journalism is a public good, nonsubscriber citizens are free riders. If paywalls are a losing battle, is it time for more drastic funding models?
Could we make news free by making it legal for newspapers to aggregate andanalyze reader data? Could we pay for newspapers by selling to retailers and politicians the counterintuitive details of which stories people read to the end, or sell targeted paid content for very specific demographics?
If zero-cost exchange-traded funds lend shares to self-fund, should zero-cost newspapers lend information?
The point is, is it time to explicitly put a price tag on journalism and ask each one of us to pay up, whichever form it takes?
Is fake news analyzed not in terms of free speech, but along the lines of pollution? Should citizens chip in for monitoring now, to avoid bearing massive cleanup costs later?
Despite LJM's passing, the Inquirer newsroom remains an inspiring place. Whenever I can, I tell young editorial assistants and aspiring cub reporters they will be the LJMs of the future. But they should ideally pursue their critical work without having to worry about saving for a house or having health insurance.
be stretched thinner each year to subsidize the cost of truth in the digital marketplace of ideas.
Perhaps it is time we each paid our fair share for the upkeep of democracy.
authoritatively by the Singapore report. She testified on how anonymous parties can buy a million likes on social media for $18. We should be proud of her contribution.


text:
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gerrit.server.mail.send;

import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.gerrit.entities.Patch.PATCHSET_LEVEL;
import static java.util.stream.Collectors.toList;

import com.google.common.base.Strings;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.FilenameComparator;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.Comment;
import com.google.gerrit.entities.HumanComment;
import com.google.gerrit.entities.NotifyConfig.NotifyType;
import com.google.gerrit.entities.Patch;
import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.RobotComment;
import com.google.gerrit.entities.SubmitRequirement;
import com.google.gerrit.entities.SubmitRequirementResult;
import com.google.gerrit.exceptions.EmailException;
import com.google.gerrit.exceptions.NoSuchEntityException;
import com.google.gerrit.exceptions.StorageException;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.mail.MailHeader;
import com.google.gerrit.mail.MailProcessingUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.mail.receive.Protocol;
import com.google.gerrit.server.patch.PatchFile;
import com.google.gerrit.server.patch.filediff.FileDiffOutput;
import com.google.gerrit.server.util.LabelVote;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import java.io.IOException;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.apache.james.mime4j.dom.field.FieldName;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;

/** Send comments, after the author of them hit used Publish Comments in the UI. */
public class CommentSender extends ReplyToChangeSender {

  private static final FluentLogger logger = FluentLogger.forEnclosingClass();

  public interface Factory {

    CommentSender create(
        Project.NameKey project,
        Change.Id changeId,
        ObjectId preUpdateMetaId,
        Map<SubmitRequirement, SubmitRequirementResult> postUpdateSubmitRequirementResults);
  }

  private class FileCommentGroup {

    public String filename;
    public int patchSetId;
    public PatchFile fileData;
    public List<Comment> comments = new ArrayList<>();

    /** Returns a web link to a comment for a change. */
    @Nullable
    public String getCommentLink(String uuid) {
      return args.urlFormatter.get().getInlineCommentView(change, uuid).orElse(null);
    }

    /** Returns a web link to the comment tab view of a change. */
    @Nullable
    public String getCommentsTabLink() {
      return args.urlFormatter.get().getCommentsTabView(change).orElse(null);
    }

    /** Returns a web link to the findings tab view of a change. */
    @Nullable
    public String getFindingsTabLink() {
      return args.urlFormatter.get().getFindingsTabView(change).orElse(null);
    }

    /**
     * Returns a title for the group, i.e. "Commit Message", "Merge List", or "File [[filename]]".
     */
    public String getTitle() {
      if (Patch.COMMIT_MSG.equals(filename)) {
        return "Commit Message";
      } else if (Patch.MERGE_LIST.equals(filename)) {
        return "Merge List";
      } else if (Patch.PATCHSET_LEVEL.equals(filename)) {
        return "Patchset";
      } else {
        return "File " + filename;
      }
    }
  }

  private List<? extends Comment> inlineComments = Collections.emptyList();
  @Nullable private String patchSetComment;
  private ImmutableList<LabelVote> labels = ImmutableList.of();
  private final CommentsUtil commentsUtil;
  private final boolean incomingEmailEnabled;
  private final String replyToAddress;
  private final Supplier<Map<SubmitRequirement, SubmitRequirementResult>>
      preUpdateSubmitRequirementResultsSupplier;
  private final Map<SubmitRequirement, SubmitRequirementResult> postUpdateSubmitRequirementResults;

  @Inject
  public CommentSender(
      EmailArguments args,
      CommentsUtil commentsUtil,
      @GerritServerConfig Config cfg,
      @Assisted Project.NameKey project,
      @Assisted Change.Id changeId,
      @Assisted ObjectId preUpdateMetaId,
      @Assisted
          Map<SubmitRequirement, SubmitRequirementResult> postUpdateSubmitRequirementResults) {
    super(args, "comment", newChangeData(args, project, changeId));
    this.commentsUtil = commentsUtil;
    this.incomingEmailEnabled =
        cfg.getEnum("receiveemail", null, "protocol", Protocol.NONE).ordinal()
            > Protocol.NONE.ordinal();
    this.replyToAddress = cfg.getString("sendemail", null, "replyToAddress");
    this.preUpdateSubmitRequirementResultsSupplier =
        Suppliers.memoize(
            () ->
                // Triggers an (expensive) evaluation of the submit requirements. This is OK since
                // all callers sent this email asynchronously, see EmailReviewComments.
                newChangeData(args, project, changeId, preUpdateMetaId)
                    .submitRequirementsIncludingLegacy());
    this.postUpdateSubmitRequirementResults = postUpdateSubmitRequirementResults;
  }

  public void setComments(List<? extends Comment> comments) {
    inlineComments = comments;
  }

  public void setPatchSetComment(@Nullable String comment) {
    this.patchSetComment = comment;
  }

  public void setLabels(ImmutableList<LabelVote> labels) {
    this.labels = labels;
  }

  @Override
  protected void init() throws EmailException {
    super.init();

    if (notify.handling().compareTo(NotifyHandling.OWNER_REVIEWERS) >= 0) {
      ccAllApprovals();
    }
    if (notify.handling().compareTo(NotifyHandling.ALL) >= 0) {
      bccStarredBy();
      includeWatchers(NotifyType.ALL_COMMENTS, !change.isWorkInProgress() && !change.isPrivate());
    }

    // Add header that enables identifying comments on parsed email.
    // Grouping is currently done by timestamp.
    setHeader(MailHeader.COMMENT_DATE.fieldName(), timestamp);

    if (incomingEmailEnabled) {
      if (replyToAddress == null) {
        // Remove Reply-To and use outbound SMTP (default) instead.
        removeHeader(FieldName.REPLY_TO);
      } else {
        setHeader(FieldName.REPLY_TO, replyToAddress);
      }
    }
  }

  @Override
  public void formatChange() throws EmailException {
    appendText(textTemplate("Comment"));
    if (useHtml()) {
      appendHtml(soyHtmlTemplate("CommentHtml"));
    }
  }

  @Override
  public void formatFooter() throws EmailException {
    appendText(textTemplate("CommentFooter"));
    if (useHtml()) {
      appendHtml(soyHtmlTemplate("CommentFooterHtml"));
    }
  }

  /**
   * Returns a list of FileCommentGroup objects representing the inline comments grouped by the
   * file.
   */
  private List<CommentSender.FileCommentGroup> getGroupedInlineComments(Repository repo) {
    List<CommentSender.FileCommentGroup> groups = new ArrayList<>();

    // Loop over the comments and collect them into groups based on the file
    // location of the comment.
    FileCommentGroup currentGroup = null;
    for (Comment c : inlineComments) {
      // If it's a new group:
      if (currentGroup == null
          || !c.key.filename.equals(currentGroup.filename)
          || c.key.patchSetId != currentGroup.patchSetId) {
        currentGroup = new FileCommentGroup();
        currentGroup.filename = c.key.filename;
        currentGroup.patchSetId = c.key.patchSetId;
        // Get the modified files:
        Map<String, FileDiffOutput> modifiedFiles = listModifiedFiles(c.key.patchSetId);

        groups.add(currentGroup);
        if (modifiedFiles != null && !modifiedFiles.isEmpty()) {
          try {
            currentGroup.fileData = new PatchFile(repo, modifiedFiles, c.key.filename);
          } catch (IOException e) {
            logger.atWarning().withCause(e).log(
                "Cannot load %s from %s in %s",
                c.key.filename,
                modifiedFiles.values().iterator().next().newCommitId().name(),
                projectState.getName());
            currentGroup.fileData = null;
          }
        }
      }

      if (currentGroup.filename.equals(PATCHSET_LEVEL) || currentGroup.fileData != null) {
        currentGroup.comments.add(c);
      }
    }

    groups.sort(Comparator.comparing(g -> g.filename, FilenameComparator.INSTANCE));
    return groups;
  }

  /** Get the set of accounts whose comments have been replied to in this email. */
  private HashSet<Account.Id> getReplyAccounts() {
    HashSet<Account.Id> replyAccounts = new HashSet<>();
    // Track visited parent UUIDs to avoid cycles.
    HashSet<String> visitedUuids = new HashSet<>();

    for (Comment comment : inlineComments) {
      visitedUuids.add(comment.key.uuid);
      // Traverse the parent relation to the top of the comment thread.
      Comment current = comment;
      while (current.parentUuid != null && !visitedUuids.contains(current.parentUuid)) {
        Optional<HumanComment> optParent = getParent(current);
        if (!optParent.isPresent()) {
          // There is a parent UUID, but it cannot be loaded, break from the comment thread.
          break;
        }

        HumanComment parent = optParent.get();
        replyAccounts.add(parent.author.getId());
        visitedUuids.add(current.parentUuid);
        current = parent;
      }
    }
    return replyAccounts;
  }

  private String getCommentLinePrefix(Comment comment) {
    int lineNbr = comment.range == null ? comment.lineNbr : comment.range.startLine;
    StringBuilder sb = new StringBuilder();
    sb.append("PS").append(comment.key.patchSetId);
    if (lineNbr != 0) {
      sb.append(", Line ").append(lineNbr);
    }
    sb.append(": ");
    return sb.toString();
  }

  /**
   * Returns the lines of file content in fileData that are encompassed by range on the given side.
   */
  private List<String> getLinesByRange(Comment.Range range, PatchFile fileData, short side) {
    List<String> lines = new ArrayList<>();

    for (int n = range.startLine; n <= range.endLine; n++) {
      String s = getLine(fileData, side, n);
      if (n == range.startLine && n == range.endLine && range.startChar < range.endChar) {
        s = s.substring(Math.min(range.startChar, s.length()), Math.min(range.endChar, s.length()));
      } else if (n == range.startLine) {
        s = s.substring(Math.min(range.startChar, s.length()));
      } else if (n == range.endLine) {
        s = s.substring(0, Math.min(range.endChar, s.length()));
      }
      lines.add(s);
    }
    return lines;
  }

  /**
   * Get the parent comment of a given comment.
   *
   * @param child the comment with a potential parent comment.
   * @return an optional comment that will be present if the given comment has a parent, and is
   *     empty if it does not.
   */
  private Optional<HumanComment> getParent(Comment child) {
    if (child.parentUuid == null) {
      return Optional.empty();
    }
    Comment.Key key = new Comment.Key(child.parentUuid, child.key.filename, child.key.patchSetId);
    try {
      return commentsUtil.getPublishedHumanComment(changeData.notes(), key);
    } catch (StorageException e) {
      logger.atWarning().log("Could not find the parent of this comment: %s", child);
      return Optional.empty();
    }
  }

  /**
   * Retrieve the file lines referred to by a comment.
   *
   * @param comment The comment that refers to some file contents. The comment may be a line comment
   *     or a ranged comment.
   * @param fileData The file on which the comment appears.
   * @return file contents referred to by the comment. If the comment is a line comment, the result
   *     will be a list of one string. Otherwise it will be a list of one or more strings.
   */
  private List<String> getLinesOfComment(Comment comment, PatchFile fileData) {
    List<String> lines = new ArrayList<>();
    if (comment.lineNbr == 0) {
      // file level comment has no line
      return lines;
    }
    if (comment.range == null) {
      lines.add(getLine(fileData, comment.side, comment.lineNbr));
    } else {
      lines.addAll(getLinesByRange(comment.range, fileData, comment.side));
    }
    return lines;
  }

  /**
   * Returns a shortened version of the given comment's message. Will be shortened to 100 characters
   * or the first line, or following the last period within the first 100 characters, whichever is
   * shorter. If the message is shortened, an ellipsis is appended.
   */
  protected static String getShortenedCommentMessage(String message) {
    int threshold = 100;
    String fullMessage = message.trim();
    String msg = fullMessage;

    if (msg.length() > threshold) {
      msg = msg.substring(0, threshold);
    }

    int lf = msg.indexOf('\n');
    int period = msg.lastIndexOf('.');

    if (lf > 0) {
      // Truncate if a line feed appears within the threshold.
      msg = msg.substring(0, lf);

    } else if (period > 0) {
      // Otherwise truncate if there is a period within the threshold.
      msg = msg.substring(0, period + 1);
    }

    // Append an ellipsis if the message has been truncated.
    if (!msg.equals(fullMessage)) {
      msg += " […]";
    }

    return msg;
  }

  protected static String getShortenedCommentMessage(Comment comment) {
    return getShortenedCommentMessage(comment.message);
  }

  /**
   * Returns grouped inline comment data mapped to data structures that are suitable for passing
   * into Soy.
   */
  private List<Map<String, Object>> getCommentGroupsTemplateData(Repository repo) {
    List<Map<String, Object>> commentGroups = new ArrayList<>();

    for (CommentSender.FileCommentGroup group : getGroupedInlineComments(repo)) {
      Map<String, Object> groupData = new HashMap<>();
      groupData.put("title", group.getTitle());
      groupData.put("patchSetId", group.patchSetId);

      List<Map<String, Object>> commentsList = new ArrayList<>();
      for (Comment comment : group.comments) {
        Map<String, Object> commentData = new HashMap<>();
        if (group.fileData != null) {
          commentData.put("lines", getLinesOfComment(comment, group.fileData));
        }
        commentData.put("message", comment.message.trim());
        List<CommentFormatter.Block> blocks = CommentFormatter.parse(comment.message);
        commentData.put("messageBlocks", commentBlocksToSoyData(blocks));

        // Set the prefix.
        String prefix = getCommentLinePrefix(comment);
        commentData.put("linePrefix", prefix);
        commentData.put("linePrefixEmpty", Strings.padStart(": ", prefix.length(), ' '));

        // Set line numbers.
        int startLine;
        if (comment.range == null) {
          startLine = comment.lineNbr;
        } else {
          startLine = comment.range.startLine;
          commentData.put("endLine", comment.range.endLine);
        }
        commentData.put("startLine", startLine);

        // Set the comment link.

        if (comment.key.filename.equals(Patch.PATCHSET_LEVEL)) {
          if (comment instanceof RobotComment) {
            commentData.put("link", group.getFindingsTabLink());
          } else {
            commentData.put("link", group.getCommentsTabLink());
          }
        } else {
          commentData.put("link", group.getCommentLink(comment.key.uuid));
        }

        // Set robot comment data.
        if (comment instanceof RobotComment) {
          RobotComment robotComment = (RobotComment) comment;
          commentData.put("isRobotComment", true);
          commentData.put("robotId", robotComment.robotId);
          commentData.put("robotRunId", robotComment.robotRunId);
          commentData.put("robotUrl", robotComment.url);
        } else {
          commentData.put("isRobotComment", false);
        }

        // If the comment has a quote, don't bother loading the parent message.
        if (!hasQuote(blocks)) {
          // Set parent comment info.
          Optional<HumanComment> parent = getParent(comment);
          if (parent.isPresent()) {
            commentData.put("parentMessage", getShortenedCommentMessage(parent.get()));
          }
        }

        commentsList.add(commentData);
      }
      groupData.put("comments", commentsList);

      commentGroups.add(groupData);
    }
    return commentGroups;
  }

  private List<Map<String, Object>> commentBlocksToSoyData(List<CommentFormatter.Block> blocks) {
    return blocks.stream()
        .map(
            b -> {
              Map<String, Object> map = new HashMap<>();
              switch (b.type) {
                case PARAGRAPH:
                  map.put("type", "paragraph");
                  map.put("text", b.text);
                  break;
                case PRE_FORMATTED:
                  map.put("type", "pre");
                  map.put("text", b.text);
                  break;
                case QUOTE:
                  map.put("type", "quote");
                  map.put("quotedBlocks", commentBlocksToSoyData(b.quotedBlocks));
                  break;
                case LIST:
                  map.put("type", "list");
                  map.put("items", b.items);
                  break;
              }
              return map;
            })
        .collect(toList());
  }

  private boolean hasQuote(List<CommentFormatter.Block> blocks) {
    for (CommentFormatter.Block block : blocks) {
      if (block.type == CommentFormatter.BlockType.QUOTE) {
        return true;
      }
    }
    return false;
  }

  @Nullable
  private Repository getRepository() {
    try {
      return args.server.openRepository(projectState.getNameKey());
    } catch (IOException e) {
      return null;
    }
  }

  @Override
  protected void setupSoyContext() {
    super.setupSoyContext();
    boolean hasComments;
    try (Repository repo = getRepository()) {
      List<Map<String, Object>> files = getCommentGroupsTemplateData(repo);
      soyContext.put("commentFiles", files);
      hasComments = !files.isEmpty();
    }

    soyContext.put(
        "patchSetCommentBlocks", commentBlocksToSoyData(CommentFormatter.parse(patchSetComment)));
    soyContext.put("labels", getLabelVoteSoyData(labels));
    soyContext.put("commentCount", inlineComments.size());
    soyContext.put("commentTimestamp", getCommentTimestamp());
    soyContext.put(
        "coverLetterBlocks", commentBlocksToSoyData(CommentFormatter.parse(getCoverLetter())));

    if (isChangeNoLongerSubmittable()) {
      soyContext.put("unsatisfiedSubmitRequirements", formatUnsatisfiedSubmitRequirements());
      soyContext.put(
          "oldSubmitRequirements",
          formatSubmitRequirments(preUpdateSubmitRequirementResultsSupplier.get()));
      soyContext.put(
          "newSubmitRequirements", formatSubmitRequirments(postUpdateSubmitRequirementResults));
    }

    footers.add(MailHeader.COMMENT_DATE.withDelimiter() + getCommentTimestamp());
    footers.add(MailHeader.HAS_COMMENTS.withDelimiter() + (hasComments ? "Yes" : "No"));
    footers.add(MailHeader.HAS_LABELS.withDelimiter() + (labels.isEmpty() ? "No" : "Yes"));

    for (Account.Id account : getReplyAccounts()) {
      footers.add(MailHeader.COMMENT_IN_REPLY_TO.withDelimiter() + getNameEmailFor(account));
    }
  }

  /**
   * Checks whether the change is no longer submittable.
   *
   * @return {@code true} if the change has been submittable before the update and is no longer
   *     submittable after the update has been applied, otherwise {@code false}
   */
  private boolean isChangeNoLongerSubmittable() {
    boolean isSubmittablePreUpdate =
        preUpdateSubmitRequirementResultsSupplier.get().values().stream()
            .allMatch(SubmitRequirementResult::fulfilled);
    logger.atFine().log(
        "the submitability of change %s before the update is %s",
        change.getId(), isSubmittablePreUpdate);
    if (!isSubmittablePreUpdate) {
      return false;
    }

    boolean isSubmittablePostUpdate =
        postUpdateSubmitRequirementResults.values().stream()
            .allMatch(SubmitRequirementResult::fulfilled);
    logger.atFine().log(
        "the submitability of change %s after the update is %s",
        change.getId(), isSubmittablePostUpdate);
    return !isSubmittablePostUpdate;
  }

  private ImmutableList<String> formatUnsatisfiedSubmitRequirements() {
    return postUpdateSubmitRequirementResults.entrySet().stream()
        .filter(e -> SubmitRequirementResult.Status.UNSATISFIED.equals(e.getValue().status()))
        .map(Map.Entry::getKey)
        .map(SubmitRequirement::name)
        .sorted()
        .collect(toImmutableList());
  }

  private static ImmutableList<String> formatSubmitRequirments(
      Map<SubmitRequirement, SubmitRequirementResult> submitRequirementResults) {
    return submitRequirementResults.entrySet().stream()
        .map(
            e -> {
              if (e.getValue().errorMessage().isPresent()) {
                return String.format(
                    "%s: %s (%s)",
                    e.getKey().name(),
                    e.getValue().status().name(),
                    e.getValue().errorMessage().get());
              }
              return String.format("%s: %s", e.getKey().name(), e.getValue().status().name());
            })
        .sorted()
        .collect(toImmutableList());
  }

  private String getLine(PatchFile fileInfo, short side, int lineNbr) {
    try {
      return fileInfo.getLine(side, lineNbr);
    } catch (IOException err) {
      // Default to the empty string if the file cannot be safely read.
      logger.atWarning().withCause(err).log("Failed to read file on side %d", side);
      return "";
    } catch (IndexOutOfBoundsException err) {
      // Default to the empty string if the given line number does not appear
      // in the file.
      logger.atFine().withCause(err).log(
          "Failed to get line number %d of file on side %d", lineNbr, side);
      return "";
    } catch (NoSuchEntityException err) {
      // Default to the empty string if the side cannot be found.
      logger.atWarning().withCause(err).log("Side %d of file didn't exist", side);
      return "";
    }
  }

  private ImmutableList<Map<String, Object>> getLabelVoteSoyData(ImmutableList<LabelVote> votes) {
    ImmutableList.Builder<Map<String, Object>> result = ImmutableList.builder();
    for (LabelVote vote : votes) {
      Map<String, Object> data = new HashMap<>();
      data.put("label", vote.label());

      // Soy needs the short to be cast as an int for it to get converted to the
      // correct tamplate type.
      data.put("value", (int) vote.value());
      result.add(data);
    }
    return result.build();
  }

  private String getCommentTimestamp() {
    // Grouping is currently done by timestamp.
    return MailProcessingUtil.rfcDateformatter.format(
        ZonedDateTime.ofInstant(timestamp, ZoneId.of("UTC")));
  }
}