Shared posts

21 Jul 07:19

textsfromsuperheroes: Facebook | Twitter | Patreon

Courtney shared this story from Super Opinionated.

21 Jul 07:18

think-progress: Sandra Bland And The Invisible Plight Of Black...

Courtney shared this story from Super Opinionated.



think-progress:

Sandra Bland And The Invisible Plight Of Black Women In The Justice System

In McKinney, Texas, 15-year-old Dajerria Becton was tackled to the ground, kneed in the neck, and handcuffed by a  police officer while she was wearing a bikini. In Cleveland, Tanisha Anderson, a schizophrenic and bipolar woman, was allegedly slammed to the ground in front of her family, before dying in police custody. In Chicago, 22-year-old Rekia Boyd was accidentally shot in the head by an officer who opened fire on a group gathered in an alley.

21 Jul 07:17

krxs10: stuntmandame: alwaysbewoke: krxs10: NYC pays Eric...

Courtney shared this story from Super Opinionated.



















krxs10:

stuntmandame:

alwaysbewoke:

krxs10:

NYC pays Eric Garner family $6 million for his murder, but not a single person held accountable

Almost exactly one year ago to this day, on July 17, 2014, a New York Police Department officer choked Eric Garner to death on a Staten Island sidewalk. Now on Monday, it was revealed that Garner’s family received a $5.9 million dollar wrongful death settlement from the taxpayers of New York City. His family deserved this settlement, but it still rings hollow.

If Garner’s death was a $6 million mistake by the NYPD, why has no single person been held responsible? Officer Daniel Pantaleo applied illegal force to choke Garner that day and refused to let it go in spite of Garner’s persistent pleas. 

The logic in this settlement, like the logic in countless similar police brutality settlements before it, makes zero sense. Either officers made mistakes and broke laws and should be fired or sent to jail—in which case a $6 million settlement makes sense—or officers didn’t make mistakes or break laws, as the NYPD and the district attorney appears to have concluded, and this settlement makes no sense whatsoever.

It’s illogical that Pantaleo, who applied the chokehold on Garner and has been sued for misconduct before, still has his job and never even faced a trial, but the city admits it was responsible for the wrongful death of this man.

In other words, New York City is perfectly willing to foot the bill for the brutality and murder committed by its police, but pretty much refuses to hold anyone accountable. So much so that New York City has paid over $1 billion in police misconduct settlements in the past 10 years alone, with another $1 billion from the previous 10 years.

Chicago isn’t far behind. Struggling to pay its basic bills and shutting schools down across the city, Chicago has paid over $500 million in police misconduct settlements with almost no officers involved in those settlements held responsible in any serious fashion.

Ultimately, they don’t care as long as they can pay their problems away

#StayWoke



image

smfh

admitting guilt would of been worth all the money in the world if he was my family. 

I would just like to point out something very important!!! because a lot of people are misunderstanding something. THE POLICE DEPARTMENT DIDNT PAY THE $5.9 MILLION

NEW YORK CITY DID. AKA = THE TAX PAYERS

21 Jul 06:39

Ted V. Mikels, Blood Orgy of the She-Devils, 1972



Ted V. Mikels, Blood Orgy of the She-Devils, 1972

20 Jul 23:50

A Unique Elliptical Pool Table and ‘Loop’ Game Designed by a Mathematician

by Glen Tickle

In a recent episode of Numberphile, mathematician Alex Bellos demonstrates his custom-built elliptical pool table. The table can be used to demonstrate some interesting mathematical properties. In particular, it can be used to demonstrate elliptical focus points. When the ball is shot from the complementary focus point from the hole it should always go in, regardless of the direction of the shot.

Because a traditional game of pool would be impossible to play on the table, Bellos also invented a game called “loop” which uses the table and four balls to make the most out of the table’s unique properties.

Bellos explains additional details of the table itself and the game of loop in separate Numberphile videos.

loop table 2

loop table 1

photos via Loop

20 Jul 23:50

continuallynomadic:This is so much better of a way of putting...



continuallynomadic:

This is so much better of a way of putting it.

20 Jul 23:50

The Backstreet Boys And 'Nsync Are Teaming Up To Fight Zombie Cowboys

by James Whitbrook

There comes a time in everyone’s life that they come across a piece of news that renders them mute. News so baffling, so incomprehensible, the very act of language is impossible, news so profound that you are stunned into a damning silence. Ladies and Gentlemen: This is that news.

Read more...










20 Jul 23:34

Baby Fennec Fox And Baby Skunk Are Growing Up Together As The Very Best of Unlikely Friends

by Lori Dorn
firehose

via ThePrettiestOne

A baby fennec fox named Milo and a baby skunk named Flower are growing up together as the best of adorable friends. The animals are being raised to be educational ambassadors with Amazing Animal Ambassadors, a licensed Massachusetts-based teaching organization.

Amazing Animal Ambassadors connects our world with an audience of any age. Have us in your classroom, summer camp, town library, resort or even right in your house for a birthday party or other function! The hour long presentation brings multiple exotic animals and one of a kind props to you in a demonstration that informs and thrills and includes amazing spontaneity.

It seems that Milo and Flower love to be together, even if they are doing different things at the same time.

And of course, everyone needs some time alone with a toy mouse.

via Nothing To Do With Arbroath, Daily Picks and Flicks

20 Jul 23:19

Liberal activists see Bernie Sanders as champion for causes failed by Obama

“Today, the largest six financial institutions in this country have assets of some $10 trillion, equivalent to 60 percent of the GDP of America,” the senator from Vermont told a crowd of 11,000. “After we bailed them out, because they were ‘too big to fail,’ most of them are now a lot bigger than they were before.”

The surge of Sanders’s presidential campaign has been widely viewed as a gambit, by liberals, to force Democratic front-runner Hillary Rodham Clinton to the left.

But many liberal activists see no other way for Clinton to win. They are not just supporting Sanders’s agenda, or asking Clinton to embrace free college tuition or vast new infrastructure spending. They are telling an alternative history of modern liberalism.

20 Jul 22:52

Who Is John Galt GIFs on Giphy

firehose

why are so many of the gifs for this search from Doctor Who, is that who John Galt is? is that his real name? jesus no wonder nobody wants to hear it

20 Jul 22:09

Print, Cut, and Fold Your Own Pluto

by Matt Freund

Make - Pluto 1This week humanity received the sharpest images of Pluto yet. Check out the 3D imaging, posters, and papercrafts that have been released!

Read more on MAKE

The post Print, Cut, and Fold Your Own Pluto appeared first on Make: DIY Projects, How-Tos, Electronics, Crafts and Ideas for Makers.

20 Jul 22:07

animal-factbook: When chickens are first born, they will be...

firehose

via Bunker.jordan



animal-factbook:

When chickens are first born, they will be imprinted to the nearest animal next to them. These chickens imprinted themselves onto this feline. The cat however, is still fairly new to this concept.

20 Jul 22:07

No contact has been made with Philae since Thursday 9 July

firehose

speaking of apeshit robots

Over the last few weeks, Rosetta has been flying along the terminator plane of Comet 67P/Churyumov-Gerasimenko, at distances from 180 km down to 153 km and at latitudes between 0 and 54 degrees, in order to find the best location to communicate with Philae.

However, over the weekend of 10–11 July, the star trackers again struggled to lock on to stars at the closer distances thanks to confusion due to dust particles in the comet’s increasingly-active environment. Because safety of the spacecraft is the first priority, it is therefore being moved back to safer distances of 170–190 km.

360º view around the point of Philae's final touchdown. The three feet of Philae’s landing gear can be seen in some of the frames. Superimposed on top of the image is a sketch of the Philae lander in the configuration the lander team believed it was in November 2014. Credits: ESA/Rosetta/Philae/CIVA

360º view around the point of Philae's final touchdown. The three feet of Philae’s landing gear can be seen in some of the frames. Superimposed on top of the image is a sketch of the Philae lander in the configuration the lander team believed it was in November 2014. Credits: ESA/Rosetta/Philae/CIVA

No contact has been made with Philae since Thursday 9 July. The data acquired at that time are being investigated by the lander team to try to better understand Philae’s situation.

For example, included in the latest data set was information on the sunlight reaching the lander’s different solar panels.

“The profile of how strongly the Sun is falling on which panels has changed from June to July, and this does not seem to be explained by the course of the seasons on the comet alone,” explains Philae’s project manager, Stephan Ulamec at DLR.

One possible explanation being discussed at DLR’s Lander Control Center is that the position of Philae may have shifted slightly, perhaps by changing its orientation with respect to the surface in its current location. The lander is likely situated on uneven terrain, and even a slight change in its position – perhaps triggered by gas emission from the comet – could mean that its antenna position has also now changed with respect to its surroundings. This could have a knock-on effect as to the best position Rosetta needs to be in to establish a connection with the lander.

The Philae Ground Reference Model. Credits: DLR.

The Philae Ground Reference Model. Credits: DLR.

Another separate issue under analysis is that one of the two transmission units of the lander appears not to be working properly, in addition to the fact that one of the two receiving units is damaged.

Philae is programmed to switch periodically back and forth between these two transmission units, and after tests on the ground reference model, the team has sent a command to the lander to make it work with just one transmitter. As Philae is able to receive and accept commands of this kind in the “blind”, it should execute it as soon as it is supplied with solar energy during the comet’s day.

The current status of Philae remains uncertain and is a topic of on-going discussion and analysis. But in the meantime, further commands are being prepared and tested to allow Philae to re-commence operations. The lander team wants to try to activate a command block that is still stored in Philae’s computer and which was already successfully performed after the lander’s unplanned flight across to the surface to its final location. This “safe block” set of activities includes temperature measurements by the thermal probe MUPUS, measurements by ROMAP and SESAME, and analysis by PTOLEMY and COSAC in sniffing mode, and do not involve moving any mechanism on lander. No detailed commands are needed: if operated in the currently stored configuration, the “safe block” only needs to be activated.

Philae's instruments. Credits: ESA/ATG media

Philae's instruments. Credits: ESA/ATG media

If this commanding works, Philae could re-start its scientific measurements and, if a link is established with Rosetta, it would be able to send its data back to Earth, via the orbiter.

The team has already tried to ‘call’ ROMAP in a similar way to the commands sent to the CONSERT instrument earlier in the month, but so far no confirmation signal has been returned. The situation continues to be analysed with the available data.

“Philae is obviously still functional, because it sends us data, even if it does so at irregular intervals and at surprising times,” adds Stephan Ulamec. “Several times we were afraid that the lander would remain off – but it has repeatedly taught us otherwise”.

20 Jul 21:58

The Oddly Soothing Sound of 9 Cats and A Kitten Eating Dinner Together At The Same Time

by Lori Dorn

9 Cats and their newest family member made an oddly soothing sound as they munched down their dinner simultaneously. The group took a bit of time to coordinate with Osamu the kitten but eventually they all got there.

9 Cats and a Kitten

image via 10 Cats

via RocketNews24

20 Jul 21:57

Yay, Sports! FIFA 16 Putting Female Soccer Stars Right on the Cover for the First Time in History

by Carolyn Cox

FIFA16ps43DPFTleftca.0During E3 this year, we were excited to learn that playable women’s teams would be available for the first time ever in FIFA 16, but now EA is taking its representation of lady players one step further!

EA announced today that North-American and Australian versions of FIFA 16 will feature female players on the cover for the first time ever. The Canadian version will showcase team captain Christine Sinclair alongside Barcelona’s Lionel Messi, and American boxes will feature Messi and US forward Alex Morgan, and Steph Catley will appear on Australian covers.

FIFA16xone3DPFTleftus-640x898

In a press statement, Morgan explained:

It is an incredible honor to be one of the first women featured on the cover of EA Sports’ FIFA. I know people all over the world play this game and I’m really excited that FIFA 16 is putting such an important spotlight on women’s soccer. And now to share the cover with today’s greatest player is surreal.

FIFA executive producer David Rutter promised way back in 2012 that representing female players was a priority, but not something that EA wanted to come at the expense of realism.

At the time, that answer seemed like a pretty flimsy excuse for failing to represent incredible female athletes (the time frame required to “do justice” to female characters vs. male characters is always pretty telling), but it’s awesome to see EA following through on that promise and making playable female characters that actually look like their real-life counterparts a selling point of FIFA 16.

(via The Verge and Polygon)

—Please make note of The Mary Sue’s general comment policy.—

Do you follow The Mary Sue on Twitter, Facebook, Tumblr, Pinterest, & Google +?

20 Jul 21:56

Newswire: Wilco announces tour to go with its new album

by Sam Barsanti
firehose

08/05—Greek Theatre—Los Angeles, CA

08/06—The Independent—San Francisco, CA

08/07—Outside Lands—San Francisco, CA

08/08—Les Schwab Amphitheater—Bend, OR

08/09—McMenamins Edgefield—Troutdale, OR

08/11—Marymoor Park—Seattle, WA

08/12—Orpheum Theater—Vancouver, BC

Last week, Wilco shocked the alternative rock/alt-country/folk-rock world and the sci-fi/fantasy world by releasing Star Wars, a free surprise album that doesn’t actually have anything to do with intergalactic trade embargoes. (Not overtly, at least.) Now the band has announced that it will begin a North American tour in August, making the phrase “I bought Star Wars tickets!” slightly more confusing than it was before. Speedy Ortiz, Jenny Lewis, Vetiver, and William Tyler will be supporting Wilco on the tour. A full list of tour dates is below.

Wilco 2015 North American Tour

08/01—Gathering Of The Vibes—Brdigeport, CT

08/05—Greek Theatre—Los Angeles, CA

08/06—The Independent—San Francisco, CA

08/07—Outside Lands—San Francisco, CA

08/08—Les Schwab Amphitheater—Bend, OR

08/09—McMenamins Edgefield—Troutdale, OR

08/11—Marymoor Park—Seattle, WA

08/12—Orpheum Theater—Vancouver ...

20 Jul 21:56

A Lively Group Of Small Dogs Slobber Through Bowls Of Ice Cream On A Hot Summer’s Day

by Lori Dorn

Watercooler recently invited a lively group of small dogs to slobber through bowls of ice cream on a very hot summer day, though each dog had his/her own style of consuming the cold stuff. Chloe the Mini-Frenchie and Sir Palmercartney dug right in, Latte and Maddie took delicate licks, Remi the Cockapoo ate his ice cream whole, a fearful chihuahua in a pink dress wasn’t sure about the treat and Lester Lockwood just wanted to play.

20 Jul 21:55

Great Job, Internet!: New search engine lets you quickly find your favorite movie quote’s source

by Jennifer Billock

Finally, the world now has a way to quickly remember which quote came from which movie. Web developer Luis Sobrecueva created the site QuoDB, which searches thousands of movies and TV shows for specific quotes, all of which he compiled through subtitle files. Every quote culls information from the production’s IMDB page and is fully editable by users, who can also upload their own quotes. Try searching your favorite line from any movie and see where it’s appeared; “I’ll be back” from Terminator for example, has passed actors’ lips in more than 27,000 titles. The site works for foreign films as well.

The movie Elephant’s Dream with German subtitles

[Via Metafilter]

20 Jul 21:55

Clever Illustrations That Reimagine Famous Marvel Superheroes As Different Types Of Dogs

by Lori Dorn

Iron Man
Iron Man

Illustrator Josh Lynch has very cleverly reimagined some of the most famous Marvel superheroes as dogs whose personalities and looks seem to most match the character. For example, a chihuahua in shades is Iron Man, a green English bulldog is The Hulk, a long-haired golden retriever is Thor, a cigar smoking pug is The Punisher, a long dachshund is Mister Fantastic and a sleek greyhound is the Silver Surfer, just to name a few.

The Punisher
The Punisher

Hulk
Hulk

Thor
Thor

Silver Surfer
Silver Surfer

Mr Fantastic
Mister Fantastic

images via Josh Lynch

via Geek Tyrant

20 Jul 21:52

FIFA 16 box to feature stars of American, Canadian Women’s National Teams

by Sam Machkovech
firehose

Alex Morgan! Thorns~

Of all the features coming to this September's FIFA 16 soccer game, the most visually apparent one is a giant roster update that includes female players—in the form of ten major national women's soccer teams with accurately rendered players. This development, and the United States' stellar performance in this summer's FIFA Women's World Cup, led to a vocal movement. Suddenly, a thousands-strong petition called for something that's never before appeared on the cover of an annual EA Sports franchise: a woman as the cover star.

On Monday, EA Sports responded to Ars' questions about the cover with confirmation of multiple women as FIFA 16 cover stars. In particular, the company identified the women who will co-star with FC Barcelona star player Lionel Messi on North American versions of the game. The American box for FIFA 16 will include US Women's National Team forward Alex Morgan, while the Canadian box will feature their team captain Christine Sinclair.

When asked whether this cover star choice was made due to growing public pressure for a woman on the box, an EA Sports rep pointed to the company's announcement, which indicated that women as cover-art stars were being considered "as soon as we knew Women’s National Teams were joining FIFA 16." (We suppose if EA had waited until after the US Women's National Team won the cup, the company might have opted for golden-toed star player Carli Lloyd.)

Read 2 remaining paragraphs | Comments

20 Jul 21:52

Hacking Team goes to war against former employees, suspects some helped hackers

by Cyrus Farivar

Italian prosecutors have begun a criminal investigation of six former employees of the embattled company Hacking Team, according to a Reuters' report citing anonymous sources.

Hacking Team was hacked two weeks ago and had its data published all over the Internet. The leaked cache includes hundreds of gigabytes of company e-mails as well as some of its source code; the police allegedly suspect the involvement of former company insiders.

According to Reuters, the new criminal inquiry is in addition to the fact that the before the hack, several former employees were being privately accused of allegedly violating their contracts and using secrets to benefit competitors.

Read 27 remaining paragraphs | Comments

20 Jul 21:51

Where big ISPs won’t invest, customer-owned ISPs are deploying fiber

by Jon Brodkin
firehose

all carriers suck forever

New government funding will boost the networks of eight rural Internet service providers, including five customer-owned ISPs in areas that aren't densely populated enough to attract major investments from big cable companies and telcos.

The US Department of Agriculture today announced the new loans and grants, totaling $85.8 million. La Valle Telephone Cooperative in La Valle, Wisconsin, a town of about 1,300 residents, is getting a $7.61 million loan to expand its fiber network "and replace a switch to provide rural subscribers with improved services, including voice over Internet Protocol (VoIP) and the flexibility to connect to Gigabit Ethernet and IP interfaces," the USDA said.

The Washington Post highlighted the efforts of La Valle in a story today:

Read 2 remaining paragraphs | Comments

20 Jul 21:51

Microsoft issues emergency patch for critical vulnerability in Windows

by Dan Goodin
firehose

'the Windows Adobe Type Manager Library handles fonts that use Microsoft's OpenType format'

Microsoft has released an emergency update to patch a security bug that allows attackers to remotely execute malicious code on computers running every supported version of Windows.

The critical vulnerability, which is present in all supported version of Windows, involves the way the Windows Adobe Type Manager Library handles fonts that use Microsoft's OpenType format. The bug allows attackers to take complete control of vulnerable computers. Attackers can exploit it by luring targets to booby-trapped websites or by tricking a target into opening a malicious file.

There are no indications at the moment that the vulnerability is being actively exploited in the wild. Still, the unscheduled issuance on Monday is an indication that the chances of exploitation are high enough to merit installation as soon as possible.

Read 3 remaining paragraphs | Comments

20 Jul 21:49

The NFL brought in enough money last year to pay for 10 Pluto missions

by James Brady

TV deals means big, big money for the NFL. How big? $7.24 billion big.

The NFL split a massive $7.24 billion in revenue with all 32 teams last season. Each team received $226.4 million as part of the split, most of which comes from the various television deals. The numbers come from the Green Bay Packers annual financial report.

If you're having trouble grasping that massive amount of money, the NFL would qualify as one of the top 200 richest countries on the world, at least according to Wikipedia. Their numbers would put them somewhere in the 145 range. The league would rank somewhere around No. 50 overall when it comes to private companies as well, according to this list from Forbes.

More comparisons to help put $7.24 billion in context:

Packers quarterback Aaron Rodgers makes an average annual salary of $22 million -- to put this into perspective, the Packers made just over 10 times that amount in national revenue alone.

As the only NFL team publicly owned by fans, the Packers are required to release this financial information on a yearly basis. The numbers are up significantly from last year, in which roughly $6 billion was split between the teams. That's a pretty significant increase, which isn't surprising given the fact that new TV deals kicked in this past season.

Those TV deals includes new basic deals with CBS, NBC, Fox, ABC, ESPN and the NFL Network, including the Thursday Night Football package for CBS. That deal was worth $275 million, and has been renewed for 2015 at $300 million. It's possible these numbers will be even more massive next year, as DirecTV and the NFL agreed on a new deal for NFL Sunday Ticket, which kicks in this season.

The national revenue sharing is up by a massive 120 percent over the last 11 years, according to Rovell. That also factors in inflation. To compare, for the 2012 season, teams received a $179.9 million slice of the pie. National revenue growth per team from 2005 to 2010 was 16.2 percent, while from 2010 through 2014 it grew a massive 136 percent. Needless to say, the TV deals are being awfully kind to the NFL these days. For the Packers themselves, they also reported a record of $375.7 million in revenue in 2014, up more than $50 million from the previous year.

20 Jul 18:53

Chicken man playing a violin. 63rd and Powell.

firehose

that's no keytar bear

20 Jul 18:51

AEP : How Tom Cruise Almost Cost Ian McKellen the Roles of Gandalf and Magneto

firehose

via Albener Pessoa

'As McKellen tells it, X-Men then ran behind schedule so he had to tell Jackson that he couldn’t play Gandalf because of his commitment to Singer. Jackson told McKellen he’d hold the part for him (wise move) and McKellen then went back to his X-Men director. Singer, showing a healthy respect for geek properties, said, “Well, you must do Gandalf. I'll make sure you get out in time.” (If that sounds less like Singer and more like McKellen doing a Singer impression, you’re right!) According to McKellen he finished X-Men with three days to spare meanwhile John Woo’s Mission: Impossible II was “put off, put off, put off” due to behind-the-scenes conflicts. As McKellen puts it, “If I had decided to do that, I wouldn’t have been in X-Men and I wouldn't have been in Lord of the Rings.”

In an interesting parallel bit of film trivia, Mission: Impossible II’s main villain, Dougray Scott, was originally hired to play Wolverine in X-Men. He famously had to pull out because of the delays on Mission: Impossible II and then-unknown Australian actor Hugh Jackman was hired to replace him. So Mission: Impossible II—the weakest installment in the still-healthy franchise— nearly cost McKellen two seminal roles, and gave Jackman the role of a lifetime. Wolverine is a part Jackman will have played a whopping eight times before he finally hangs up the claws in 2017. As McKellen puts it, “It’s all about luck – being there at the right time and ready for it. You can‘t prepare for luck. I’ve learned that you’ve got to be ready for the luck when it arrives, but you’re going to need the luck.”'

Both Images Courtesy of Rex/Rex USA

If Sir Ian McKellen had never landed the roles of Gandalf the Grey in Lord of the Rings and Magneto in X-Men, it’s not as if he would have wilted into obscurity. McKellen was an award-winning, veteran stage actor, well-known gay rights activist, and Oscar-nominated film actor long before he donned that famous purple helmet or took up that equally famous wizard’s staff. But it’s not unreasonable to say that McKellen would be less recognizable in the mainstream if he had missed out on these two huge franchises. But according to McKellen that’s almost what happened back in the late 90s and Tom Cruise is nearly to blame.

While promoting his latest famously behatted role in Mr. Holmes, McKellen told People the whole story. Fresh off his Oscar-nominated turn in Gods and Monsters, McKellen was offered a role in Mission: Impossible II with Tom Cruise. (Presumably the one eventually played by Croatian actor Rade Serbedzija.) “But they wouldn’t let me see the whole script,” McKellen says, ”because I might have spilled the beans. I only got my scenes. Well, I couldn't judge from reading just those scenes what the script was like. So I said no. And my agent said, ‘You cant say no to working with Tom Cruise!‘ and I said, ‘I think I will.’” According to McKellen, director Bryan Singer offered him the role of Magneto the next day and Peter Jackson offered him Gandalf shortly thereafter and the actor “said yes to both.”

As McKellen tells it, X-Men then ran behind schedule so he had to tell Jackson that he couldn’t play Gandalf because of his commitment to Singer. Jackson told McKellen he’d hold the part for him (wise move) and McKellen then went back to his X-Men director. Singer, showing a healthy respect for geek properties, said, “Well, you must do Gandalf. I'll make sure you get out in time.” (If that sounds less like Singer and more like McKellen doing a Singer impression, you’re right!) According to McKellen he finished X-Men with three days to spare meanwhile John Woo’s Mission: Impossible II was “put off, put off, put off” due to behind-the-scenes conflicts. As McKellen puts it, “If I had decided to do that, I wouldn’t have been in X-Men and I wouldn't have been in Lord of the Rings.”

In an interesting parallel bit of film trivia, Mission: Impossible II’s main villain, Dougray Scott, was originally hired to play Wolverine in X-Men. He famously had to pull out because of the delays on Mission: Impossible II and then-unknown Australian actor Hugh Jackman was hired to replace him. So Mission: Impossible II—the weakest installment in the still-healthy franchise— nearly cost McKellen two seminal roles, and gave Jackman the role of a lifetime. Wolverine is a part Jackman will have played a whopping eight times before he finally hangs up the claws in 2017. As McKellen puts it, “It’s all about luck – being there at the right time and ready for it. You can‘t prepare for luck. I’ve learned that you’ve got to be ready for the luck when it arrives, but you’re going to need the luck.”

We can all count ourselves pretty lucky at how it all shook out between Cruise, McKellen, Scott, and Jackman. If McKellen hadn’t been in X-Men then we would have been deprived of one of the greatest bromances the world has ever seen.

A world without this friendship between Patrick Stewart and Ian McKellen? That, I’m afraid, shall not pass.

20 Jul 18:45

Tommy Craggs and Max Read Are Resigning from Gawker

firehose

lol

Tommy Craggs, the executive editor of Gawker Media, and Max Read, the editor-in-chief of Gawker.com, are resigning from the company. In letters sent today, Craggs and Read informed staff members that the managing partnership’s vote to remove a controversial post about the CFO of Condé Nast—a unprecedented act endorsed by zero editorial employees—represented an indefensible breach of the notoriously strong firewall between Gawker’s business interests and the independence of its editorial staff. Under those conditions, Craggs and Read wrote, they could not possibly guarantee Gawker’s editorial integrity.

On July 17 , Craggs informed the managing partnership that, “If we decide to pull the post, I think I have to quit.” Still, as we reported last week, four partners—Nick Denton; chief operating officer Scott Kidder; chief strategy officer Erin Pettigrew; and Andrew Gorenstein, who serves as president of advertising and partnerships—voted to remove the post. When Craggs began informing others that he was indeed quitting, colleagues persuaded him to wait until Monday to officially make a decision. On Saturday, Read informed staffers that if Craggs quit, he would quit as well. Over the weekend, Denton and colleagues of Read and Craggs tried, and failed, to persuade them to stay.

Here is Cragg’s memo to the editorial staff of Gawker Media:

Advertisement

I want to give you some sense of what happened within Gawker Media on Friday, and what has happened since, as a means of explaining why I have to resign as executive editor.

On Friday, I told my fellow managing partners—Nick Denton, founder and CEO; Heather Dietrick, president; Andrew Gorenstein, president of advertising and partnerships; Scott Kidder, chief operating officer; and Erin Pettigrew, chief strategy officer—I would have to resign if they voted to remove a story I’d edited and approved. The article, about the Condé Nast CFO’s futile effort to secure a remote assignation with a pricey escort, had become radioactive. Advertisers such as Discover and BFGoodrich were either putting holds on their campaigns or pulling out entirely.

(This isn’t the place to debate the merits of that story, other than to say that I stand by the post. Whatever faults it might have belong to me, and all the public opprobrium being directed at Jordan Sargent, a terrific reporter, should come my way instead.)

That there would even be a vote on this was a surprise to me. Until Friday, the partnership had operated according to a loose consensus. Nothing had ever come to a formal vote, and the only time anyone had even hinted that the partners might intrude on a departmental prerogative was when Andrew Gorenstein wondered openly in a partnership meeting why Sam Biddle hadn’t been fired.

I’d learned of the vote via gchat with Heather Dietrick, who throughout the day was my only conduit to the partners, Nick Denton included. The only reply to my pleading emails about yanking the story was a sneering note from Gorenstein. That is to say, none of the partners in a company that prides itself on its frankness had the decency or intellectual wherewithal to make the case to the executive editor of Gawker Media for undermining (if not immolating) his job, forsaking Gawker’s too-often-stated, too-little-tested principles, and doing the most extreme and self-destructive thing a shop like ours could ever do.

All I got at the end of the day was a workshopped email from Denton, asking me to stay on and help him unfuck the very thing he’d colluded with the partners to fuck up.

No one told me the vote was actually happening, by the way. It just … happened, while I was on a plane to California. No one in editorial was informed that Nick had reached what he now calls the point of last resort; no one had explained what other resorts had been tried and had failed in the less than 24 hours between publication and takedown. The final count was 4-2 (with Heather’s nay joining mine, despite initial reports otherwise), and the message was immediately broadcast to the company and to its readers that the responsibility Nick had vested in the executive editor is in fact meaningless, that true power over editorial resides in the whims of the four cringing members of the managing partnership’s Fear and Money Caucus.

Will they ever explain themselves to you? I don’t know. This is from the partnership’s text message thread on Sunday [all is sic]:


Gorenstein: Im getting emails from Keenan at gawker re post vote

Gorenstein: In not dealing with her

Me: Yeah, God forbid you explain yourself

Gorenstein: I’m 1 of 5

Nick Denton: We will all need to be at the office tomorrow morning to talk with Edit. I propose a meeting before at 9am among the Managing Partners. And you can all expect to be asked why you voted as you did at the all-hands.

Gorenstein (still replying to me): Don’t give me that bullshit

Me: I won’t be attending

Me: I would encourage you to meet with all of edit, but knowing you people I doubt you will

Nick Denton: I encourage everybody to do so, also.

Me: So that’s what it sounds like when Nick has my back.

Me: By the way, Andrew, Keenan is a male. You all should get to know the writers you just sold out.

Me: They may not be around for long.


Then Nick accused me of being “self-indulgent” for making it “all about the writers being sold out” and for not being sufficiently attuned to the damage the brand would suffer.

But of course it is all about you, the writers. The impulse that led to Thursday’s story is the impulse upon which Nick himself built Gawker’s brand, the impulse against which Gorenstein sells his ads. The undoing of it began the moment Nick himself put the once inviolable sanctity of Gawker Media’s editorial to a vote

One of the least rewarding parts of this job has been subjecting Max Read to a series of meetings that resulted in the creation of the company’s “brand book,” articulating for advertisers what it is that makes Gawker matter. As it happens, initial copy for the brand book—which you can read here (or here)—was approved on Thursday just hours before Gawker’s Condé Nast post went up.

The brand book was a preposterous exercise. The essence of Gawker has always been what happens when we get out of those meetings and go back to writing and editing the stories you do that no one else can do. You writers are this company. You are funny. You are smart. You are vital. You are honest and righteous and pissed-off and stupid, so galactically stupid, and you commit hilarious blunders and you perform great, honking prodigies of journalism that make me proud to have sat in a room with you. Often you do all these things in the same day. You are this company. Nick forgot that, and I hope he one day remembers it. You are, you will always be, the best argument for a company that no longer deserves you.

I love you all.

—Tommy

Here is Max Read’s memo to the managing partnership:

To the partnership group:

On Friday a post was deleted from Gawker over the strenuous objections of Tommy and myself, as well as the entire staff of executive editors. That this post was deleted at all is an absolute surrender of Gawker’s claim to “radical transparency”; that non-editorial business executives were given a vote in the decision to remove it is an unacceptable and unprecedented breach of the editorial firewall, and turns Gawker’s claim to be the world’s largest independent media company into, essentially, a joke.

I am able to do this job to the extent that I can believe that the people in charge are able, when faced with difficult decisions, to back up their stated commitments to transparency, fearlessness, and editorial independence. In the wake of Friday’s decision and Tommy’s resignation I can no longer sustain that belief. I find myself forced to resign, effective immediately.

This was not an easy decision. I hope the partnership group recognizes the degree to which it has betrayed the trust of editorial, and takes steps to materially reinforce its independence.

Best wishes,
Max

Read also sent the following memo to the writers and editors of Gawker.com:

Hey gang—

I’m quitting today. Tommy is too. You’ll see his email shortly. (Keep it between us till I email the partnership, please!)

Here’s the email I’m sending, which I hope outlines clearly why I am leaving.

[Text of above email to managing partnership]

If there is a reason to stay at Gawker, it is all of you. I mean this both sentimentally and practically.

Sentimentally in the sense that I cannot imagine working with a sharper, smarter, funnier, weirder, finer group of humans than the ones I have been lucky enough to inherit, hire, and poach here. I hope I have made this clear enough, but I am consistently and constantly in awe of every one of you, of your skill and your inventiveness. When you are in the office this week, look around: You are working with a rare class of talent. You will want to remember what it was like to write alongside so many current and future stars. I hope at some point over the next week or so I will have a drunken opportunity to tearfully and inappropriately corner each one of you to inarticulately communicate to you my gratitude and admiration and love.

Practically in the sense that the future of the site, and in most ways the company, is now in your hands. Collectively, you have the ability to demand from management the editorial protections you deserve, and I hope you organize this week to do so. I still believe Gawker can be great, even when it abdicates its own core institutional beliefs, because I know that Gawker isn’t really some constellation of Brand Values that can be betrayed at whim. It’s you guys. My friends.

I think I’ve already said everything I need to say about The Post Itself in the email I sent around on Saturday. Ultimately my decision is about the process by which this happened. If the partnership had not conducted some kind of utterly opaque backroom vote to delete it—if we had simply posted Nick’s note, as much I disagreed with and disliked it—I think this Monday would be very different.

I will be at the editorial meeting with Tommy; I’m not sure I can stomach whatever town hall Nick has planned. If you’re around, you should come in. If not, let’s get a drink soon. Or go to Spumoni! Or Atlantic City.

The last year of my life, and especially the last six months, have probably been the happiest and most fun. I have never been prouder of my work. And it was easy because all I had to do was give this group of writers access to Kinja and a mandate to be weird and funny and mean and skeptical and fearless. I hope that you guys will remember it as fondly as I will. If another mad Hungarian ever wants to give me $10 million dollars to start a website it’s good to know I already have a perfect hire list.

Here is the email Read sent to staffers on Saturday:

Hi guys—

(It would be nice if this—both the letter itself and the information it contains—was kept between all of us and not leaked anywhere.)

Sorry for going AWOL so quickly yesterday without warning. It was a weird day. I want to keep you all appraised of where everything stands (as far as I can tell) and what I’m thinking.

So, as I think most of you know, Tommy has prepared a resignation letter. He told me it contains the word “fart.” He was going to send it yesterday when he landed in California, but was convinced to wait until Monday, so it hasn’t officially happened yet.

We talked a little on the phone yesterday and he insists that his mind is made up. When the partnership group (himself, Nick, Heather, Andrew Gorenstein, Kidder, Erin Pettigrew) voted yesterday, Tommy made explicitly clear that he would quit if the post was removed. He feels like he’s bound to follow through on that threat; he can’t walk into partnership meetings knowing Gorenstein has the power to remove posts over his objections. John Cook says Tommy tied his dick to a rock and threw the rock off the cliff; Emma says it’s more like Tommy threw the rock on the ground and jumped off himself. The point is that Tommy’s dick was torn off in a gross way. Maybe this is a bad metaphor.

I obviously would be gutted if Tommy left, and am desperately hoping he can be convinced to stay, maybe if we can make assurances of editorial protections in a union contract, or some other kind of ironclad guarantee that his power will not be diminished. I will be calling him all weekend and begging him to reconsider. If you feel like it, you should email him something genuine and heartfelt and maybe a little bit thirsty and pleading. If you have any ideas of face-saving (or, better yet, power-saving) ways for him to stay, I’m all ears.

If Tommy quits, it’s very hard for me to see a way that I can stay and maintain any claim to integrity or control over my site. But I haven’t written a resignation letter and I haven’t made a decision yet. What’s done with the post is done; I don’t think I’ll be able to secure its re-instatement. But my feeling is that if I can get from Nick a public, written apology and guarantee that this will never happen again that would establish a sufficient level of editorial protection to carry us through union negotiations, and allow me to take the reins of the site with some shred of integrity and authority intact. I plan on speaking to Nick on Monday. I would ask that anyone thinking of making dramatic public resignations (or sending their resumes around) at least wait through next week and Hamilton’s proposed editorial meeting as we see how yesterday’s events shake themselves out.

Otherwise I’m not going to talk about this publicly or respond to Nick, either in private or public, in case you’re wondering why I haven’t written or said anything. He knows how I feel about his decision to remove the post; you all know how I feel; and the statement drafted for the sites yesterday sends a strong message that I don’t think I need to add to. I don’t want to be captured in some Kinja Works! PR stunt, and I don’t want to turn this into another one of the perennial Gawker Drama! moments. I mean, it is that, but it’s also an unacceptable breach of editorial independence.

A quick word about the post: Jordan reported out a true and interesting story that stands well within the site’s long tradition of aggressively reporting on the sex and personal lives of powerful media figures, and I—and Tommy—still stand behind that story, and Jordan’s reporting, absolutely. It was always going to land poorly with the army of Gamergaters and Redditors, and with the Twitter squad of smarmy media enemies we’ve made over the last 10 years, both groups of which are desperate for our collapse. To the extent that it failed to land with the people who are generally sympathetic to us—people we like and respect—I, and only I, should have protected us better, and I would have and will talk and think harder about how we assign, approach, edit, and package those stories. But that’s all we’re obligated to do: Listen to people we respect, and try to do better next time. Jordan is the rarest of all things, a funny writer and fantastic stylist who can also report the hell out of difficult and awkward stories—in other words, a perfect Gawker blogger. I am hugely proud of what he’s done for the site, and there is no one whose work I’d rather take a stand over.

If any of you are worried, please don’t be. This is a brief storm that Nick’s shortsightedness has extended. By the end of next week it will be a vague memory. I love you guys and am utterly confident in your ability to move through the now annual mid-summer Reddit freakout with grace and good humor. If any of you want to talk or get a drink this weekend, call or text me at [redacted]. I’m mostly gonna stay out of Slack and I’m staying the hell off of Twitter. I suggest you all do the same.

It is not yet clear who will fill the positions left vacant by Craggs and Read.

When asked to justify their votes for the post’s removal, managing partners Scott Kidder and Erin Pettigrew provided the following statements.

Scott Kidder:

Hey Keenan — my vote was supporting Nick is making a tough call as Founder and Editorial Ethos of the Company. It wouldn’t cross my mind to autonomously suggest taking down a post — in fact, I can’t remember a situation where any Partner has — this was Nick’s suggestion and call.

Erin Pettigrew:

Hi Keenan,

As Scott clarified and Nick is expected to —

Nick made the recommendation and the decision to take down the post. He is the final standard bearer of editorial-decision making in the organization.

When I heard he felt this was an important decision for him to make for the company’s future, I lent him support.

Thanks,

Erin

Andrew Gorenstein did not respond to repeated requests for comment.

Update, 12:20 p.m.:

Nick Denton sent the following memo to editorial staff on Monday afternoon:

To All of Edit at Gawker Media:

The Managing Partnership as a whole is responsible for the Company’s management and direction, but they do not and should not make editorial decisions. Let me be clear. This was a decision I made as Founder and Publisher — and guardian of the company mission — and the majority supported me in that decision.

This is the company I built. I was ashamed to have my name and Gawker’s associated with a story on the private life of a closeted gay man who some felt had done nothing to warrant the attention. We believe we were within our legal right to publish, but it defied the 2015 editorial mandate to do stories that inspire pride, and made impossible the jobs of those most committed to defending such journalism.

I’m sorry also that Jordan Sargent, reporting this story impeccably despite a personal drama, was exposed to such traumatizing hatred online, just for doing his job. And I’m sorry that other editors and writers are now in such an impossible position: objecting to the removal of a story that many of them found objectionable.

The company promotes truth and understanding through the pursuit of the real story — and supports, finances and defends such independent journalism. That is and remains its mission, and this story was in violation of it.

We pride ourselves on pushing boundaries and know that every story requires a judgment call. There was strong internal disagreement on whether the right judgment was made. I believe it was not and could not defend it.

Were there also business concerns? Absolutely. The company’s ability to finance independent journalism is critical. If the post had remained up, we probably would have triggered advertising losses this week into seven figures. Fortunately, though, I was only aware of one advertiser pausing at the time the decision to pull the post was made; so you won’t be able to pin this outrage on advertising, even though it is the traditional thing to do in these circumstances.

No, I was thinking in the broadest terms about the future of the company. The choice was a cruel one: a management override that would likely cause a beloved editorial leader to resign on principle; or a story that was pure poison to our reputation just as we go into the Hogan trial.

It was such a breach of everything Gawker stands for, actually having a post disappeared from the internet. But it was also an unprecedented misuse of the independence given to editorial.

Under Tommy’s leadership, Gawker and other sites have done more ambitious reporting. There have been many scoops we are indeed proud of: those arising from the Sony email hack, for instance, or the Bill O’Reilly or Hillary Clinton exposés. But even the best of our stories fail to get credit, in part because of Gawker’s reputation for tabloid trash, given another lift by the unjustifiable outing of a private individual in turmoil, in front of a potential audience of millions.

That post wasn’t what Gawker should stand for, and it is symptomatic of a site that has been out of control of editorial management. Our flagship site carries the same name as the company, and the reputation of the entire company rests on its work. When Gawker itself is seen as sneering and callous, it affects all of us.

From recent research, it is clear that the Gawker brand, for both flagship website and the company, is both confusing and damaging. A friend of the sites attests:

“First thing I’d say is being called Gawker is a big problem - all their other sites are more advertiser-friendly than Gawker itself. All the other sites are innovative, sharp, have a focused point of voice but not too snarky. Gawker itself is too snarky for me to recommend to advertisers, too risky. They’re really bitchy. The other sites are bitchy too but with Gawker itself it feels like it’s bitchy without a reason.”

The Hogan case has shown we can’t escape our past, and I can’t escape Gawker. Of the site’s qualities, some of its best and most of its worst were mine: the desire of the outsider to be feared if you’re not to be respected, nip the ankles till they notice you; contempt for newspaper pieties; and a fanatical belief in the truth no matter the cost. It is a creature of my own making. And even if it’s been seven years since I edited Gawker, I still have to represent it. Heather does in court and I do in the press. But not this time: for the first time that I can remember, I cannot stand by a story, or just agree to disagree, or keep silent.

This Geithner story was legal, but it could not be justified to colleagues, family members and people we respect. Nor was there any way to explain it to journalists and opinion-makers who decide whether we deserve the great privilege of the profession, the First Amendment that protects our most controversial work. The episode had the potential to do lasting damage to our reputation as a company, and each of our own personal reputations.

The insistence the post remain up despite our own second thoughts: that represents an extreme interpretation of editorial freedom. It’s an abuse of the privilege. And it was my responsibility to step in to save Gawker from itself, supported by the majority of the Managing Partners.

This is a one-time intervention, I trust, which will prompt a debate about the editorial mission, and a restoration of editorial independence within more clearly defined bounds.

To any that resign over the deep-sixing of the Geithner story, and to any that find a gentler editorial mission too limiting: I respect the strength of your convictions. This is a decision you’re taking to preserve principles you believed I still shared. And since you were abiding by a policy we had not formally superseded, we will treat all resignations as being constructive dismissal, subject to severance.

We need a codification of editorial standards beyond putting truths on the internet. Stories need to be true and interesting. I believe we will have to make our peace with the idea that to be published, those truths should be worthwhile.

And some humane guidelines are needed — in writing — on the calculus of cruelty and benefit in running a story. Everybody has a private life, even a C-level executive, at least unless they blab about it. We do not seek to expose every personal secret — only those that reveal something interesting. And the more vulnerable the person hurt, the more important the story had better be.

The editorial ethos of Gawker needs a calibration more than a radical shift. Gawker needs to keep being Gawker. If you’re wondering whether a more explicit editorial policy will turn us into some generic internet media company, I’d say no: I see Gawker Media occupying a space on the online media spectrum between a stolid Vox Media and a more anarchic Ratter; close to the edge, but not over it.

As Heather says: Keep doing the great stories. Keep writing on the edge. Just make sure you’re proud of it. Make sure people you respect can be proud of it.

At 1pm, Heather and I will come to the 4th Floor to take questions and criticism from New York editors and writers. At 12.30 on Tuesday, we will hold an all-hands meeting again on the Fourth Floor, with out-of-town editors included and other people who are getting back to town. The Managing Partners will be present.

Last week’s story — and the drastic reaction — cannot become a habit. We are open to a full debate on editorial independence — and the evolved editorial mission that must define it. There are also some ideas about governance floating around. There’s plenty to discuss, but hopefully not too much text to write: we don’t need a bureaucracy; but we do need some clarity.

This is a company built on stories: from the very first gadget recommendation on Gizmodo in 2002; through to the Tom Cruise video that marked a newsier Gawker in 2008; the iPhone 4 story that made Gizmodo and broke its staff in 2010; to the heyday of the sensational scoop in 2013, when Gawker and Deadspin revealed both Rob Ford and Manti Teo in their lurid glory. This story, and the aftermath, look like a low-point right now. But it can also be the catalyst for necessary change. Gawker’s best stories are ahead of it.

Update, 12:45 p.m.:

Denton, for what it’s worth, was slightly more pointed about Jordan Sargent’s reporting in an email to Sargent on Friday:

From: Nick Denton
Date: Fri, Jul 17, 2015 at 1:47 PM
Subject: Hey, Jordan
To: Jordan Sargent
Cc: Keenan Trotter

Can you give Heather or me a call? You need to know you did nothing wrong. These are the stories we used to do. But times have changed.

Update, 1:48 p.m.

Jezebel editor-at-large Jessica Coen forwarded the following email she received from Nick Denton in January 2014 (when Coen was serving as editor-in-chief of Jezebel) to Gawker Media’s editorial listserv:

From: Nick Denton
Date: Mon, Jan 20, 2014 at 7:37 PM
Subject: This is the opposite of our policy
To: Jessica Coen
Cc: Joel Johnson

jezebel.com/trans-woman-commits-suicide-amid-fear-of-outing-by-spor-1503902916

If the author believes this, she’s working at the wrong place. And should be guided to a more congenial work environment. We’re truth absolutists. Or rather, I am. And I choose to work with fellow spirits.

[Quote from post linked above] “Issue two is the reporting on the trans status of the subject. This is much clearer: Don’t out someone who doesn’t want to be out. The end. Everyone has a right to privacy when it comes to their gender identity or sexual orientation, and beyond this, the trans status is not relevant.”

Email the author of this post: trotter@gawker.com

20 Jul 17:15

How We Built Our Blog

firehose

"We have a policy of being "default public" at Stack Exchange. That means we try and work in the open when we can, and that includes our technical work. Because the blog prototype I was building was already on GitHub, it made sense to just keep it publicly available."

commenter:
"Just throwing it out there that your public Wordpress dump discloses the names, e-mail addresses, IPs, etc. for anyone who ever commented on your posts. I believe most people commenting on Wordpress blogs expect that information to remain private, especially since the default Wordpress commenting form says the e-mail address will never be made public.

I suppose you could've got permission or had it in your site's terms, but I'd consider this a fairly serious information disclosure issue and remove that file from the public repository if at all possible (assuming it hasn't been forked yet)..."

Yesterday, we announced the redesign of our blog and the addition of our engineering channel. This is the first post related to engineering detailing a walkthrough of what we've built, and what better than to blog about rebuilding our blog on our new blog? How meta.

It started with an engineering blog

A few months ago, I took up a de facto role heading up developer evangelism efforts at Stack Exchange. I say that with a caveat: we treat developer evangelism at Stack very differently than most other companies do. What we don't want to do is create a team of people that travel around, speaking at events, trying to sell something and code occasionally - that didn't make sense to us. Instead, what we really want to do is highlight the amazing public outreach work members of our engineering team are already doing. Most if not all of our developers are active members of not only Stack Overflow, but the larger technical community: writing blog posts, doing open source work, and speaking at conferences. We really want to make light of the individual public outreach efforts our engineering team is actively doing. Second, we want to make the philosophy that has made Stack Overflow so successful for the developer community more widely known. Who better to do that than the developers that helped shape that community?

So the first natural solution to address these goals would be to blog about the work we're doing. We were inspired by a lot of great technical blogs out there like Code as Craft and OkTrends and the idea of an engineering blog that was similar to these examples had been thrown around. However, there were reservations about creating a completely separate blog: why fragment our readership even further? We had the official Stack Exchange company blog, the ServerFault blog for our SRE team, and the many personal blogs that our individual developers had. There were so many different avenues to publish our work, and we couldn't figure out where this content would live. It seemed like if we created new kinds of content in a completely separate blog, the existing ecosystem would force us to fragment our audience even further. Otherwise we would host content that was simply inappropriate in one of the existing blogs. What we really needed was a single destination that could accomodate many different kinds of content instead of creating multiple destinations that specialized in just one kind.

Revisiting the Stack Exchange blog

After sending out the original proposal to the company, I quickly realized I might have stepped on a landmine of a project. The blog ecosystem was something that we've wanted to address for a very long time, and that meant that pretty much every part of the company would be affected by it and had strong opinions about the project. After considering all the comments I received, we came to a general conclusion: the ideal solution would be to take our most popular blog, the official Stack Exchange blog, and use it to house the new content we wanted - including the engineering posts. That turned out to be a much larger project that took six to eight weeks. There were some key parts to this solution that would make it work:

Channels

In the previous blog, we had all of our posts in a single column organized by tag. That meant everything we posted would go out to anyone reading our blog. The concern here was that if we just started writing very technical posts and put them in this channel, it would be relevant to a technical subset of our audience, but not to everyone. On the flip side, developers that would come to our blog to read technical content wouldn't necessarily want to read or care about everything else we're doing - they're here for the engineering stuff.

What we came up with were "channels" - high level categories that would let us separate the major kinds of posts we'd be publishing. There are two main ones: company news and engineering. The company news channel would house all of the familiar content like podcasts, company announcements, and so forth. It would also let us add new kinds of content like those for internal culture and diversity related efforts. The engineering channel effectively became our solution for an engineering blog, and would host all of our technical walkthroughs, write-ups of evangelism efforts, and technical opinion pieces like we originally wanted.

Reposts

Another key part of this solution was the ability to repost. Many of the most popular posts related to Stack Exchange - especially the technical posts - were decentralized, housed in our many developers' personal blogs. There was a good reason for this: we believe that our developers should publicly get credit for the things they build internally, and one of the best ways to claim it is to write about it on their personal blogs. Once we created an engineering channel, we didn't want to make our developers feel like they had to choose between posting on the company blog or on their personal blog. It seemed like the wrong move.

Instead, we came up with a different approach: post on your personal blog about your work just like you always have, and if you want to repost on the company blog for more exposure, we will do so with a prominent link to the original source. It does two things: it gives our technical audience the ability to get an inside look into how we build things while still giving credit to the people that build them.

A new blogging engine

During the original proposal stage for the engineering blog, we also had a conversation about what engine we would use. At the time, all of our blogs were running WordPress...which we weren't so happy about. It was very buggy, difficult to log in to, not very performant, and has caused our SRE team more than a few headaches. If we were really going to revamp the new company blog, it seemed like a lot of work to try and wrestle with our WordPress installation.

In comes Jekyll

Because we weren't happy with WordPress, we started looking at other engines. We looked at static site generation in Go and even considered building our own engine, but what we decided to do was switch to Jekyll. It's an open source static site generator built in Ruby that was great for building blogs on. A lot of developers I know were switching over to Jekyll for their personal sites and it was something we had played around with on some design projects. Switching to Jekyll had a number of advantages:

  • Posts are in Markdown, something most of our company was familiar with
  • Jekyll is just static site generation, so it's much more performant
  • Complete flexibility for front end work, no need to wrestle with templates
  • Open source with a strong community, which we love
  • Not WordPress or PHP

Jekyll seemed to fit the bill for what we wanted, and I started building a prototype. One of the other nice things about Jekyll is that it was supported by GitHub Pages, so I could actually share my work to the rest of the company without creating new builds. That leads me to my next point...

Open Source

We have a policy of being "default public" at Stack Exchange. That means we try and work in the open when we can, and that includes our technical work. Because the blog prototype I was building was already on GitHub, it made sense to just keep it publicly available. It was different from the work I was used to - having code available to those outside of our internal team changed the way I approached building the blog:

  • Our blog was going to be used by people who are not very technical. Having a GUI for our community and marketing teams to create posts and preview Markdown without learning Git was great.
  • It meant we left the door open to let people outside of company make changes, fix bugs, and possibly even contribute posts in the future.
  • There are few examples of major migration efforts to Jekyll out there, and could be one of them.
  • People could take the work we did and use it for themselves. There are insights in the migration that we want to give back to the community.
  • If there are bugs you can fix them too!

Building the blog

Alright - enough about the ideation process. Now to the meaty technical parts. There was a lot of development work that went into this, so I'm only going to highlight some of the major pieces and insights we had building the blog:

Infrastructure

Starting up a Jekyll project is pretty straightforward. It's ridiculously easy to install and with just a few naming conventions in the file structure, Jekyll takes care of the static site generation. Easy as it is, I decided to fork an existing bootstrapping repository called Jekyll Now made by a friend of mine (and VP of Engineering at Trello), Barry Clark.

Out of the box, most of what we needed was there: a posting engine with Markdown and code highlight support, JavaScript and CSS flexibility, and it was fast. Because all the hard work was being done up front, we were just serving static files and that was a huge performance boost over WordPress. In just a few minutes, I had a basic working blog that was being hosted on GitHub Pages. We were already well on our way to what we had originally set out to do.

Importing the old content

Moving all of our previous blog posts to the new solution was a hard requirement, and that meant taking all the content we had on our WordPress instance and converting that into files in Markdown. This was not easy: we had over 700 blog posts over the history of the company, each with comments, static assets, and deeplinking that had to be preserved. The process seemed pretty straightforward if not riddled with edge cases that needed to be resolved: WordPress has an export function that spits out a giant XML file (a whopping 30MB of text) and we just had to use that file to convert and pull files.

Thankfully, there are a few libraries that makes this migration easier. I tried a few of the import methods that were recommended in the Jekyll documentation, but none of them seemed to do it cleanly. After a few more attempts, I finally stumbled upon exitwp and that seemed to work pretty well. You can see the commit here - it was over 5,000 different file changes with the initial import.

For the most part, this worked pretty well. I was surprised by how much was preserved and the fact that Jekyll supports arbitrary HTML in the Markdown files helped a lot. There were a few things that were lost in the process though: some images with captions were misformatted, embeds were lost for many of our podcasts, and the references to uploaded files in WordPress broke images across the board.

This is when I had to really intervene programmatically. I started writing Python scripts to go through every post and repair a lot of the work done here. Here's the high level overview:

  • For HTML errors, much of this repair work was manual. We looked at the top 50 high trafficked posts and the 100 most recent posts and manually went through to make sure everything was formatted well. This was done with a lot of help from our marketing team.
  • I wrote a Python script to go through all the imported posts, looked for references to WordPress hosted content, download all the static assets into images/wordpress in the repo, and changed all the links to relative paths on Jekyll. Worked surprisingly well.
  • We used Soundcloud embeds for all of our podcasts, and the vast majority of this was broken. I wrote a Python script that used a regular expression to find the relevant URL for the embed and reinserted the code necessary to restore the player. You can see the code for this below. It's very similar to the code I wrote for the image import as well.
import os, re, requests
rootdir = '_posts'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        filename = os.path.join(subdir, file)

        f = open(filename, "r")
        contents = f.readlines()
        f.close()

        # Get WordPress 
        slug = filename.replace("_posts/", "").replace(".markdown", "")

        splits = slug.split("-")
        year = splits[0]
        month = splits[1]
        end = "-".join(splits[3:])

        link = "/".join([year, month, end])
        link = "/" + link
        wordpress_url = "http://blog.stackoverflow.com" + link

        if re.search('podcast', wordpress_url):
            print wordpress_url
            response = requests.get(wordpress_url)
            if response:
                for line in response.content.split("\n"):
                    if re.search('<iframe|<object', line) and re.search("soundcloud", line):
                        contents.append('\n'+line)
                        f = open(filename, "w")
                        f.write("".join(contents))
                        f.close()

        continue

        contents.append(iframe)
        f = open(filename, "w")
        f.write("".join(contents))
        f.close()

Feeds and links

Another hard requirement was making sure that we didn't break deep linking. The posts on our blog are referenced a lot across the Stack Exchange network as well on the Internet generally. To break our URL scheme for posts would have been absolutely disastrous. In addition to that, we needed to preserve the XML feed on our blog. There are integrations for the community bulletin, it's a dependecy for parts of the Stack Exchange sites themselves, and there are thousands of people that rely on the feed to get news from us. Preserving the links to our content and at least our main feed was extremely important.

Again, Jekyll thankfully had a feature to customize post URL structures. This was simply a setting in our _config.yml file, and it took a single line of code:

permalink: /:year/:month/:title/

The feed was a little more complicated. Taking a look at the XML feed that we had before, we had to make sure that all the data that was needed was preserved, but there wasn't any native functionality in Jekyll that could meet our needs. There was a workaround in sight though. Jekyll's templating engine wasn't just good for taking Markdown and parsing it into HTML; it could be used to create arbitrary static files that were exposed on the site. That meant I could just create something like /feed/index.xml and use the templating language to generate a feed! Here's what that looks like:

---
layout: null
---
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
    xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
    <title>{{ site.name }}</title>
    <atom:link href="{{ site.url }}/feed/" rel="self" type="application/rss+xml" />
    <link>{{ site.url }}</link>
    
    ...

    {% for post in site.posts limit:40 %}
        {% unless post.draft %}
        <item>
            <title><![CDATA[{{ post.title | raw }}]]></title>
            <link>{{ site.url }}{{ post.url }}</link>
            {% for author in site.authors %}
                {% if author.id == post.author %}
                    <dc:creator><![CDATA[{{ author.name }}]]></dc:creator>
                {% endif %}
            {% endfor %}
            {% for category in post.tags %}
            <category><![CDATA[{{ category }}]]></category>
            {% endfor %}
            <comments></comments>
            <pubDate>{{ post.date | date: "%a, %d %b %Y %T +0000" }}</pubDate>
            <guid></guid>
            <description><![CDATA[{{ post.excerpt | raw }}]]></description>
            <content:encoded><![CDATA[{{ post.content | raw }}]]></content:encoded>
            <wfw:commentRss></wfw:commentRss>
            <slash:comments></slash:comments>
        </item>
        {% endunless %}
    {% endfor %}
    </channel>
</rss>

Pagination

This was actually one of the most fascinating technical challenges I ran into. Like I mentioned before, we have over 700 posts on our blog, and that was only going to grow, probably at an even faster speed. It was simply unreasonable to leave out pagination support. Sadly, Jekyll only has limited support for pagination. It could do so reasonably well for all posts, but we needed more fine grain pagination that would also filter by author and tag. In addition to the lack of customization for pagination, using the native capability really slowed down the build time. Pages were going through each post, each tag, and each aother file and tried to generate HTML for every permutation. Our build time for all posts went from about 5 seconds to several minutes, because Jekyll generation was taking MxNxO time. There were simply no good solutions for this natively or that other people had solved with libraries I could find.

So I ended trying something completely different. Instead of relying on Jekyll to statically generate each page up front, I decided to generate JSON with all the posts and their metadata, then lazy load that JSON via AJAX and filter using the tags and authors for that post. It meant only one file had to be generated instead of every permutation, there was more programmatic flexibility with JavaScript to filter, and we could inject pagination into any page for any set of posts we wanted.

Here's the json/index.json file that is generated by Jekyll and used to populate the overview pages on each channel:

---layout:null---{"posts":[{%forpostinsite.posts%}{"title":"{{ post.title | raw | escape }}","url":"{{ site.baseurl }}{{ post.url }}","hero":"{{ post.hero }}","tags":[{%fortaginpost.tags%}"{{ tag }}"{%unlessforloop.last%},{%endunless%}{%endfor%}],"categories":[{%forcategoryinpost.categories%}"{{ category }}"{%unlessforloop.last%},{%endunless%}{%endfor%}],"date":"{{ post.date | date: "%B%e,%Y" }}","author":"{{ post.author }}","draft":{%ifpost.draftorpost.date>site.time%}true{%else%}false{%endif%},"content":"{% if post.description %}{{ post.description | strip_html | strip_newlines }}{% else %}{% if post.excerpt %}{{ post.excerpt | markdownify | strip_html | strip_newlines }}{% else %}{{ site.description }}{% endif %}{% endif %}"{%ifforloop.last%}}{%else%}},{%endif%}{%endfor%}],"authors":{{%forauthorinsite.authors%}"{{ author.id }}":{"name":"{{ author.name }}","avatar":"{{ author.avatar }}","twitter":"{{ author.twitter }}","url":"{{ site.baseurl }}/authors/{{ author.id }}","job":"{{ author.job }}"{%ifforloop.last%}}{%else%}},{%endif%}{%endfor%}}}

And here's the js/index.js file that is in every page that loads that file in, filters the right posts, and injects the controls.

$(document).ready(function() {

    var page = 1;
    var data;

    if (typeof pagination !== 'undefined') {
        if (pagination === true) {
            $(".pagination").css("display", "block");
        }
    }

    if (typeof top_active !== 'undefined') {
        $("nav a." + top_active).addClass("active");
    }

    if (typeof channel !== 'undefined') {
        if (channel != 'company' && channel != 'engineering') {
            $(".subheader a.category").removeClass("active");
            $(".subheader a.category#" + channel).addClass("active");
        }
    }

    if ($("div.pagination").length > 0) {
        check_page();
    } else {
        $(".posts").css("visibility", "visible");
    }

    ...

    function check_page() {
        var href = window.location.hash;
        var matched = href.match('^#page');
        if (matched) {
            var page_num = href.split("#page")[1];
            if (page_num = parseInt(page_num)) {
                page = page_num;
            }
        }
        $.getJSON(prefix + "/json/index.json", function(response) {
            console.log(response)
            if (response) {
                var result = [];
                for (key in response.posts) {
                    var post = response.posts[key];
                    if (post.draft) continue;
                    if (typeof channel !== 'undefined') {
                        if (post.tags.indexOf(channel) == - 1) {
                            continue;
                        }
                    }
                    if (typeof top_active !== 'undefined' && (top_active == "engineering" || top_active == "company")) {
                        if (post.tags.indexOf(top_active) == - 1) {
                            continue;
                        }
                    }
                    if (typeof author_id !== 'undefined') {
                        if (post.author != author_id) {
                            continue;
                        }
                    }
                    result.push(post);
                }
                response.posts = result;

                data = response;

                set_page(page);

                // Set total pages
                $("span.page.total_pages").html(Math.max(Math.ceil(data.posts.length / 5), 1));

                // Bind page clicks
                $("a.page").click(function() {
                    var selected_page = ($(this).hasClass("older") ? page + 1 : page - 1);
                    if (valid_page(selected_page)) {
                        set_page(selected_page);
                    }
                });

                $(window).hashchange(function() {
                    var selected_page = parseInt(window.location.hash.substr(5));
                    if (valid_page(selected_page)) {
                        set_page(selected_page);
                    }
                })
            }
        });
    }

    function set_page(page_num) {
        var max = Math.ceil(data.posts.length / 5);

        if (data == null) return;
        if (!valid_page(page_num)) {
            if (page_num > max) page_num = max;
        }

        page = page_num;

        if (typeof pagination !== 'undefined' && pagination === true) {
            window.location.hash = "#page" + page_num.toString();
        }

        $(window).scrollTop(0);

        var next = page_num + 1;
        var previous = page_num - 1;

        $("span.page.current_page").html(page_num);

        $("a.page.older").css("visibility", page_num >= max ? "hidden" : "visible");
        $("a.page.newer").css("visibility", page_num <= 1 ? "hidden" : "visible");

        var offset = (page_num - 1) * 5;

        var authors_posted = [];

        for (var i = 0; i < 5; i++) {
            var post = data.posts[offset + i];
            var article = $("article.post:eq(" + i + ")");

            article.css("border-bottom", i == data.posts.length - 1 ? "none" : null);
            if (i >= data.posts.length || typeof post == 'undefined') {
                article.css("display", "none");
                continue;
            }

            var author = data.authors[post.author];

            article.find(".title").html(post.title).attr("href", post.url);
            article.find(".avatar").attr("src", author.avatar);

            var post_info = [];

            post_info.push(post.date);
            post_info.push('By ' + author.name);
            post_info.push('In ' + post.tags.join(", "))

            article.find(".post-info").html(post_info.join(" &bull; "));

            article.find("img.hero").attr("src", post.hero);
            article.find("a.hero_url").attr("href", post.url);

            article.find(".excerpt").html(post.content);
            article.find("a.read-more").attr("href", post.url);
            article.css("display", "block");

            var podcast = (post.tags.indexOf('podcasts') > -1);
            article.find(".podcast-container").css("display", podcast ? "block" : "none");
            
            var no_background = (podcast || post.hero.length == 0);
            article.find(".hero-container").css("display", no_background ? "none" : "block");

            var auth = $("#authors-container .author-container:eq(" + i + ")");
            if (auth && authors_posted.indexOf(author.twitter) == -1) {
                auth.find(".avatar-link").attr("href", author.url);
                auth.find(".avatar").attr("src", author.avatar);
                auth.find(".name-link").attr("href", author.url).html(author.name);
                auth.find("p.job").html(author.job);
                authors_posted.push(author.twitter);
                auth.css("display", "block");
            } else {
                auth.css("display", "none");
            }
        }

        $(".posts").css("visibility", "visible");
    }

    function valid_page(page_num) {
        return (page_num > 0 && page_num <= Math.max(Math.ceil(data.posts.length / 5), 1))
    }
});

Comments

The last thing I want to go over is comments. Comments are a really important part of our blog - if they weren't preserved, we'd be missing out on a huge amount of context and losing valuable content by our community. It was critical that capability was maintained and that we also migrate all the previous comments over. There was really only one common solution we found that was compatible: Disqus.

Now, I don't have many issues with Disqus as a product - I've seen them work really well on other platforms, but it meant we had to sacrifice a few things like Stack Exchange login capability. Those were things we could reasonably deal with. The main problem was importing comments from WordPress. We ran into so many issues trying to do this import well:

  • Using Disqus' built-in WXR importer to take the XML export from WordPress and migrate (errors, didn't work)
  • Using their official plugin on WordPress, installing, and doing a sync (also didn't work)
  • Using their API to parse the XML, and create threads and posts into our account (didn't work either, API is not very well documented and kept running into auth errors)

The worst part of this is how unsupported we were by the Disqus team. We waited on the order of weeks for support responses and for over a month they went unresolved. Sending in official support tickets, emails, and posts on their Discuss forum went unnoticed. Even tweeting didn't seem to work:

@disqushelp Trying to move the Stack Overflow blog to Disqus, but imports (even with all troubleshoot attempts) not working. Case #437292

— Jon Chan (@JonHMChan) May 18, 2015

@disqushelp Guys - any update on #437292? WP import is our last hurdle to launching.

— Jon Chan (@JonHMChan) May 21, 2015

@disqushelp Guys - I've had a support ticket open for over 2 weeks now #437292. Any progress on this?

— Jon Chan (@JonHMChan) May 29, 2015

In the end, we opted to do something else entirely: we would do a manual import of comments to date and statically generate JSON that would be lazy loaded and injected into individual posts. These would simply be HTML that we marked as archived comments. You can see the heart of the Python script to generate the JSON I wrote here:

result = {}
for post in blog_data:
    slug = post["url"].replace("http://blog.stackexchange.com", "")
    slug = slug[:-1] if slug[:1] == "/" else slug
    result[slug] = []
    for comment in post["comments"]:
        del(comment["author_email"])
        del(comment["ip_address"])
        date_posted = time.strptime(comment["date"], "%Y-%m-%d %H:%M:%S")
        comment["date"] = time.strftime("%b %d, %Y")

        result[slug].append(comment)

    json_result = json.dumps({"response": result[slug]})

    parts = slug.split("/")
    if len(parts) < 3:
        print slug
        print parts
    directory = "json/comments/" + parts[1] + "/" + parts[2]

    if not os.path.exists(directory):
        os.makedirs(directory)

    f = open("json/comments" + slug + ".json", "w")
    f.write(json_result)

For commenting moving forward, we would use Disqus with a blank slate. If they ever got back to us or helped us with an import, we would backfill it then (we still want their help!) We simply couldn't keep delaying shipping the new blog and found an interim solution.

Final thoughts

This was a much larger project than I had originally anticipated, but I'm very happy with the results. Early feedback has been pretty positive, and while there were inevitably bugs with such a huge migration, with Meta and the code open sourced, we're fixing them quickly. We've even received pull requests already with changes and bug fixes.

In the end, I'm glad that there's finally a single destination for our engineering team to reach out to the technical community we love being a part of. You'll see much more content like this from our engineering team moving forward, and we'd love to hear your feedback. Until next time!

Jon is a developer and heads up evangelism efforts at Stack Exchange. You can follow him on Twitter.

20 Jul 17:14

somebody: you're cool

firehose

via baron

somebody: you're cool
me: you have been greatly misled
20 Jul 17:05

What coffee does to your body

by Rob Beschizza
firehose

via Burly.Thurr: "Over time, caffeine consumption may increase the number of adenosine receptors in the brain, according to a recent study done in rats. This sprouting may be the brain’s way of nuking caffeine’s effect to get you to rest up. More adenosine receptors means there’s a better chance adenosine can bind and make you feel sleepy."

CoffeeCaffeine is the world's most widely-used psychoactive drug. Four cups a day is, for average adults, about as much as it's safe to take, because of the mildly unpleasant things it does to us.