Bifurcated Rivets: From FB


Bifurcated Rivets: From FB


Bifurcated Rivets: From FB


Bifurcated Rivets: From FB

Bad lp covers - not seen any of these before

Bifurcated Rivets: From FB


Instructables: exploring - featured: 'Earplug Meter': a VU-meter Project

Hi! I'm Maike, a student at Erasmus Hogeschool Brussels. For one of my courses, I had to make up a concept for a volume meter, and make a prototype of it.Here, you can find a step by step tutorial for re-making my prototype. It's very beginner-style, because a few months ago, I was a beginner too. A...
By: MaikeM1

Continue Reading »

Instructables: exploring - featured: PVC Slingshot bow V 2.0 with shooting demo (Video)

This project is the sequel to my first PVC Slingshot bow which I made last year. I have completely redesigned the slingshot and arrows go give it more power.If you don't prefer to read, you can skip it and watch the video instead where I have explained all the steps in detail. If you do, then contin...
By: MiiBooth

Continue Reading »

Slashdot: Are Squirrels A Bigger Threat To Our Critical Infrastructure?

"The real threat to global critical infrastructure is not enemy states or organizations but squirrels, according to one security expert." Long-time Slashdot reader randomErr quotes the BBC. Cris Thomas has been tracking power cuts caused by animals since 2013... His Cyber Squirrel 1 project was set up to counteract what he called the "ludicrousness of cyber-war claims by people at high levels in government and industry", he told the audience at the Shmoocon security conference in Washington. Squirrels topped the list with 879 "attacks", followed by birds with 434 attacks and then snakes at 83 attacks. Those three animals -- along with rats -- have caused 1,700 different power cuts affecting nearly 5,000,000 people .

Read more of this story at Slashdot. API-Intis-1.00 WWW-BackpackTF-0.002001

interface to the trading service

All Content: Sundance 2017: "An Inconvenient Sequel: Truth to Power"


The biggest surprise of Sundance so far has nothing to do with a new addition or a healthy food eatery being added near the Yarrow theater. It’s that Al Gore is not actually running for president, despite the intense campaign vibes of his ego-driven effort, “An Inconvenient Sequel: Truth to Power,” a follow-up to his Oscar-winning film "An Inconvenient Truth." The documentary follow-up proves to be less about global warming than propping up a hero awkwardly desperate to captivate audiences again like he did eleven years ago. It's like the "Zoolander 2" of global warming documentaries.

The filmmaking by directors Bonni Cohen and Jon Shenk ("Audrie & Daisy") is solid, and they work with these very clear standards: follow Gore on his international speaking engagements, both during his meetings and maybe with a humanizing moment of him walking through a back hallway; share the slide shows that he prepares for said speaking moments and make sure we can see it; use an instructive score that could fit in with a political thriller. Adding a bit of cynicism to that title, "An Inconvenient Sequel" just wants to recreate the hits of the first time. But this return seems driven by even more vanity, with Gore unaware of how much he's talking about himself and not global warming.

From the very beginning, the cause is framed as being personal. Sobering footage of ruined glaciers and landscapes are accompanied by soundbites where people criticize Gore and his passion. Questions of whether this movie is actually about Gore or his cause nag the entire movie, even though you know the project thinks it’s doing a noble job with the latter. It takes far too long for this movie to situate into its actual causes, and to do so it’s back to the dull Al-Gore-gives-a-slideshow set-up. The movie only insulates itself more from there.

As with global warming, there are tidbits of information that do come across, as Gore uses vivid footage of entire communities being destroyed by forces of nature. We see the different areas that are affected by the apocalyptic weather changes, and further recognize the scope of it. And we see how the global warming effort has quite the ally in solar power, as shown with India and the like. The second half focuses on Gore interacting with world leaders as a type of person behind the scenes, not as high-profile as a president.

In the scheme of global warming, what does this offer? A reminder, yes, particularly if you haven’t seen “Before the Flood,” which played in 180+ countries via National Geographic. The two share many similarities: scenes with Miami floods, John Kerry, footage of Kiribati and India, and an Oscar-winner in the center who thinks he alone can get people to listen (in the case of “Before the Flood,” that was Leonardo DiCaprio).

But those are small nuggets to take from sifting through Gore’s self-centric version of the cause. There are plenty of scenes that have nothing to do with global warming, like him walking us through his childhood home, talking about how he had planned to be president. The flaw of this moment is like others, in that its intent is purely adoration or pity. It has nothing to do with the issues at hand. 

If any movie were to create the global warming idea as a type of cult, this is it. Gore’s many speaking scenes are to people in his climate change group, which has the air of watching an evangelist preaching to the choir—a tactic that doesn't work for us as viewers, who need something to connect to. And that’s the huge problem with this messy movie, that it never gives us a chance to connect. Gore is always in the way, or putting his foot deep in his mouth like when he compares global warming to the civil rights movement or abolitionist movement. In some scenes he is miscast as the everyman, and in others he's miscast as a savior. In both roles, Gore has a grave lack of focus or self-awareness.

All Content: Sundance 2017: "Pop Aye" & "Free and Easy"


Sundance’s reputation for cultivating interesting filmmakers is by no means a domestic-only effort, as proven again by this year’s World Dramatic Cinema lineup. In its first two days, the festival has presented the world premiere of two different films from vastly different writer/directors, but whose projects are united by an interest in challenging viewers with primary elements like pacing, character and atmosphere. “Pop Aye” and “Free and Easy,” from Thailand and China, respectively, are two competing titles that offer strength in vision from their respective filmmakers. 

Selected as an opening night film for the festival, “Pop Aye” is a charming, ambling mid-life crisis about a city architect in Thailand and the elephant from childhood he is reunited with. It’s a loaded pitch, and given a thoughtful execution from writer/director Kristen Tan. The elephant is a great hook, as beautiful and compelling as the animal is, but the story boasts a striking human element that does not bank on sympathy. 

Tan is a writer/director who is thrillingly playing with risks. “Pop Aye” challenges a lot of the conventions a viewer might expect from a movie about a man named Thana (Thaneth Warakulnukroh) and his elephant (Bong) on a journey. For one, though the actor who plays Thana makes him initially sweet, a graying man with glasses and an endearing gentleness towards his massive animal friend, seeming like an underdog being pushed out of the city architecture business due to gaudy new ideas, Thana is not an entirely sympathetic character, especially with the way that he thinks of women, despite his charitable, sincere actions in other ways. His strained relationship with his wife is especially cringe-worthy.

In a way that gives the film its own energy, it is not a tidy film with how it treats people or shares its big heart, adding further credence to this story being more like, in animal movie terms, “Au Hasard Balthasar” than “Operation Dumbo Drop.” The movie gains charm from constantly complicating characters one might assume to be simple pit stops. 

When telling this story, one risk that doesn’t work and might provide some confusion is the non-linear editing. It challenges the straightforward idea of a journey with reflections of the past, but doesn’t have the clear cut nature to be determined. There are some logic loopholes too (which can’t be spoiled, but you might notice them) that hold back this type of tight depiction of unpredictable, real life that it wants to be. 

“Pop Aye” is able to occupy its own tone, in which it isn’t particularly funny or a huge downer, despite its potential to take either path. It paints some thoughtful images, especially as its theme of urbanization comes beautifully with the idea that things change permanently, in spite of our pain from the past that we carry in the present. It’s quite a treat to see this all play out as a story about a man and his elephant, with no heavy-hand in sight. 

“Free and Easy” imagines a world where people seem to be inherently bad; it would be a cold, empty, lifeless place. The setting is a Chinese industrial town that was beat up and left for dead—as introduced with somber location shots of a horrible nothing. It’s a striking empty canvas that director Jun Geng presents the audience with, only to then add slight brushes to it with a few characters and their acts of manipulation. Many of the characters have their schemes, but with seemingly no other world for them to strive for, it’s more akin to survival. If this movie takes place in a world that seems post-apocalyptic, it is also that of post-empathy, post-warmth. 

It’s by no coincidence that “Free and Easy” is designed with the openness and lawlessness of a western. But it’s not a cowboy who rolls into town in the beginning, its a traveling soap salesman (Zhang Ziyong), who offers free soap to people that knocks them out when they smell it—enough time to rob them. He’s revealed to not be the only con in the area, which is populated with the likes of a monk who offers talismans (Xu Gang), a Christian who offers prayer (Gu Benbin) and a man whose bizarre job is planting trees (Xue Baohe), but someone keeps stealing them. As the script further elaborates itself, you can see some overly-calculated allegorical ideas, where power moves are currency. The characters with the most dialogue are not particularly sympathetic, but you don’t want the worst for anyone. And the way they are connected makes for its more memorable passages, and a surprising third act that registers as extremely dry comedy. 

Even as the movie resists action, watching Geng’s vision with script and character unfold is often enough to hold interest. Characters take on the attributes of the environment he’s set them into, and speaking very little between extended beats. When they do interact, they’re blocked like statues facing each other, with Geng’s static camera allowing his memorable casting choices to linger. The ideas that he gives them, some of them better sponsors of his poetry than others, makes for a film that’s rich in atmosphere. Though I’d love to see what Geng does with a lot more, the spaciousness of “Free and Easy” is one of its most striking traits. 

Hackaday: Persistence Of Vision Death Star

Death Stars were destroyed twice in the Star Wars movies and yet one still lives on in this 168 LED persistence of vision globe made by an MEng group at the University of Leeds in the UK. While Death Stars are in high demand, they mounted it on an axis tilted 23.4° (the same as the Earth) so that they can show the Earth overlaid with weather information, the ISS position, or a world clock.

More details are available on their system overview page but briefly: rotating inside and mounted on the axis is a Raspberry Pi sending either video or still images through its HDMI port to a custom made FPGA-based HDMI decoder board.  That board then controls 14 LED driver boards mounted on a well-balanced aluminum ring. All that requires 75W which is passed through a four-phase commutator. Rotation speed is 300 RPM with a frame rate of 10 FPS and as you can see in the videos below, it works quite well.

This isn’t the first POV Death Star we’ve seen here. [Jason] made a smaller one using his own rotating PCB that can be described only as awesome.

[via Adafruit]

Filed under: Raspberry Pi

Instructables: exploring - featured: Fishing Rod Storage Rack

Ever since junior got his own room for himself and his toys, and I had to move my stuff out, I feel that my precious toys, my fishing rods, are neglected, they just sadly sit in the corner and gather dust. I was long planning to make some sort of a storage rack for them, but just never had the ti...
By: stvnishere

Continue Reading »

Instructables: exploring - featured: Countertop Gumball Machine

Growing up, my grandpa had a wooden gumball machine that he built in their kitchen that would be the first place my cousins and I would run to when we got to their house. We’d grab a gumball and then go about our business, but that was always the first stop. I wanted to recreate that magical device ...
By: sampaulling

Continue Reading »

MetaFilter: Little Things: The outsized pleasures of the very small

Lori DeBacker wears "+300 reading glasses and a ring on every finger, enjoys creating minuscule cakes — 'faux gâteaux' — and humorously altered, miniaturized versions of famous paintings. 'I love to spoof the masters,' she smirked, showing me a postage-stamp-size reproduction of The Scream in which the central figure was replaced with an extra-agonized ghost. Making miniatures focuses DeBacker. 'My mother always said this would drive her to drink,' she said, 'but I think it keeps me from it.'" [SL Harper's]


Squarepusher - one of the most important figures in braindance/IDM/whatever - is set to release a new album with his live band Shobaleader One which features full band versions of classic Squarepusher tracks. They've been playing these tracks at live shows recently and the results are impressive:

Coopers World
Squarepusher's Theme
A Journey to Reedham
Full live set (see the first comment on that video for links to individual songs)

[Squarepusher previously: Stor Eiglass video, Solo Electric Bass, Squarepusher x Z Machines, Squarepusher vs music critics]

MetaFilter: 30 Years (give or take) of Acid on Wax

2017 marks 30 years since acid was put on (commercial) wax, if* you're crediting Phuture's Acid Tracks as the first Acid (House) song/EP. BBC Radio 1 recently celebrated this history with the first Essential Mix of 2017 by DJ Pierre, one third of Phuture, the Chicago group that recorded an epic 12 minutes of Roland TB-303 knob-twiddling and spread the acid madness via Ron Hardy in The Music Box. For more acid in the mix, B. Traits preceded that set and played a 2 hour set acid, with a 3rd hour by Luke Vibert, who stated (via a track title) "I Love Acid."

* Another contender for the first (commercial) acid record is Sleezy D's 'I've Lost Control' (released in 1986), though neither this nor 'Acid Tracks' made much of an impact at first. And while we're digging through the bins of history, Genesis P-Orridge's claim to have named the genre are often disputed, FWIW.

(And then there's Charanjit Singh's accidental acid that predates all that.)

Whoever gets credit for being first and for naming the genre, the sound and label stuck. If you're looking for some more "top picks" of acid, Fact Mag compiled a list of their favorite 20 tracks from the 1980s (previously), while DJ Pierre and Danny Rampling each pick 10, with some overlap but more diversity over all.

If you want more of modern acid, here's a snapshot of Seth Troxler's Acid Future festival, which "[payed] homage to London's acid house history ... but rather than looking backwards we're looking forward, inviting artists from all over the world which I feel embody the spirit of acid house in 2015."

A sampler from that lineup:

Slashdot: Google Pressured 90,000 Android Developers Over Insecure Apps

An anonymous reader quotes PCWorld: Over the past two years, Google has pressured developers to patch security issues in more than 275,000 Android apps hosted on its official app store. In many cases this was done under the threat of blocking future updates to the insecure apps... In the early days of the App Security Improvement program, developers only received notifications, but were under no pressure to do anything. That changed in 2015 when Google expanded the types of issues it scanned for and also started enforcing deadlines for fixing many of them... Google added checks for six new vulnerabilities in 2015, all of them with a patching deadline, and 17 in 2016, 12 of which had a time limit for fixes. These issues ranged from security flaws in third-party libraries, development frameworks and advertising SDKs to insecure implementations of Android Java classes and interfaces. 100,000 applications had been patched by April of 2016, but that number tripled over the next nine months, with 90,000 developers fixing flaws in over 275,000 apps.

Read more of this story at Slashdot.

Recent additions: fltkhs

Added by deech, Sat Jan 21 17:19:44 UTC 2017.

FLTK bindings qbit_xgettext-0.005

QBit gettext extractor

Electronics-Lab: DIY an Arduino-Controlled AM/FM/SW Radio

Combine the Si4844-A10 analog-tuned radio receiver with an Arduino to make a full-featured multiband radio.

The idea of a single chip radio is intriguing. The prospect is especially interesting to me because, frankly, I envy the analog skills I associate with building a radio receiver. When I browsed the circuit literature in the area, I came across the Silicon Labs collection. One of their chips, the Si4844-A10 caught my attention. This receiver has AM/FM/SW capability with all the bells and whistles and it is designed to work with a microprocessor. Best of all, the support components required are mainly associated with the microprocessor display and control functions with only a small amount of antenna support needed. I couldn’t resist taking the plunge.

DIY an Arduino-Controlled AM/FM/SW Radio – [Link]

The post DIY an Arduino-Controlled AM/FM/SW Radio appeared first on Electronics-Lab.

Electronics-Lab: ESP32 Review: Using the ESP32 with the Arduino IDE

In this video reviews the ESP32, the successor of the popular ESP8266!

Hello guys, I am Nick and welcome to a channel that is all about DIY electronics projects with Arduino, Raspberry Pi, ESP8266 and other popular boards. You can subscribe to our channel by clicking on this button. Today I am very excited because we are going to see this new board which uses the new ESP32 chip and we are going to learn how to program it using the Arduino IDE. The ESP32 chip will be the heart of most of the projects we are going to build in the near future, because it offers everything we need in one low cost solution!

ESP32 Review: Using the ESP32 with the Arduino IDE [Link]

The post ESP32 Review: Using the ESP32 with the Arduino IDE appeared first on Electronics-Lab. SMS-Send-Sergel-Simple-HTTP-0.01

SMS::Send driver for Sergel simple http service

Instructables: exploring - featured: Sexy Leg Vise

It was about time I made a decent leg vise, and this is how I did it. the Chop is made from a slab of Cherry, the Wooden Screw was made of Hard Maple from Acer-Ferrous. it has bowties and Celtic carving throughout. and a Brass retention ring to top it all off.Tools NeededPanel saw:
By: woodbywright

Continue Reading »

Recent additions: madlang

Added by vmchale, Sat Jan 21 16:37:47 UTC 2017.

Randomized templating language DSL

Slashdot: FTC Dismantles Two Huge Robocall Organizations

Billions of robocalls came from two groups selling extended auto warranties, SEO services, and home security systems over the last seven years -- many to numbers on the "Do Not Call" list -- but this week the Federal Trade Commission took action. Trailrunner7 shares this report from OnTheWire: Continuing its campaign against phone fraud operations, the FTC has dismantled two major robocall organizations... They and many of their co-defendants have agreed to court-ordered bans on robocall activities and financial settlements... The FTC and the FCC both have been cracking down on illegal robocall operations recently. The FCC has formed a robocall strike force with the help of carriers and also has signed an agreement to cooperate with Canadian authorities to address the problem. "The law is clear about robocalls," says one FTC executive. "If a telemarketer doesn't have consumers' written permission, it's illegal to make these calls."

Read more of this story at Slashdot.

Hackaday: Lego Boosts Their Robotic Offering

Kids often have their first exposure to robots in school using Lego Mindstorm kits. Now Lego is rolling out Boost — a robotic kit targeting all Lego builders from 7 years old and up. The kit is scheduled to be on the market later this year (it appeared at the recent CES) and will sell for about $160.

[The Brothers Brick] had a chance to try the kit out at CES (see the video below) and you might find their review interesting. The kit provides parts and instructions to build five different models: a cat, a robot, a guitar, a 3D printer, and a tracked vehicle. You can check out the official page, too.

boostThe system communicates with an Apple or Android tablet via Bluetooth. The review notes that the programming language is a bit simplistic, allowing actions to occur due to stimulus, but no real conditional tests and branches. In addition to motor control, the device comes with blocks that can sense motion and color (see right). Builders can integrate the blocks with other Lego designs, too.

We’ve seen lots of additions and enhancements to Mindstorms (along with lots of interesting applications). It will be interesting to see what hacks appear for Boost.

Filed under: Microcontrollers, robots hacks

All Content: Sundance 2017: "Person to Person," "Axolotl Overkill," "Family Life"


The first full day of Sundance saw the world premiere of three films that focus on finding your place in the world, whether it's the strange streets of New York, the anything-goes nightlife of Berlin, or someone else's house in Chile. Below are three reviews, including NEXT category title "Person to Person" and two World Cinema Dramatic films, "Axolotl Overkill" and "Family Life."

“Person to Person” begins with a New Yorker talking about having a party, and after a strange day of various New York stories, the last scene is said person having a party. This is that kind of movie, an ensemble riff on character ideas based on 20/30-something New Yorkers trying to figure out what they want to do with their relationships, jobs, and their lives overall. It’s played out casually, never lunging for big laughs or revelations—and it charms often because it's cozy with just enough surprises. 

Writer/director Dustin Guy Defa makes his stories interesting with their sensitivities. In one thread, a young woman starts a new job where she has to be invasive into a widow’s personal life, as pushed by her oblivious boss (Michael Cera in his reoccurring new role as anti-Michael Cera). In another thread, a vinyl collector (Bene Coopersmith) ventures across town to buy a rare Charlie Parker vinyl, and finds out that he’s a part of a larger scheme. Somewhere else in the city, a young woman (Tavi Gevinson) faces some type of dilemma about what she wants in a relationship, and with what type of person. 

It should be noted that this movie’s aesthetic is undoubtedly hipster—both by the jazz definition and the modern definition—a designation that it seems to demand when Coopersmith's Bene is in a legitimately tense, mini-action scene chase through a vinyl store and then onto fixed-gear bikes. That’s not a knock against the movie at all (as the “h”-word might be negative to some), especially with this movie’s excellent soundtrack. But said hipness is crucial to a key part of this spirit, where it’s a little different, but it stands out—and yes, with its own personality. In Sundance speak, "Person to Person" boasts a cast that would fit a Premiere category slot, but the movie is right at home in the NEXT section. 

That appeal isn’t limited to age, either. Philip Baker Hall and Isiah Whitlock Jr., in particular, have some strong scenes that could be throwaway moments, but they contribute to filling in the movie’s atmosphere. They would certainly fit in with that finale party, which Defa’s filmmaking invites you to join as well. 

"Axolotl Overkill" is either too much or too little, depending on how you read it. With a polarizing brazenness more familiar to Sundance's NEXT category, this World Dramatic competitor is like an abstract memoir; it focuses a great amount of detail on one life, the rebellious, self-destructive 16-year-old Mifti, and experiments with telling her story as if the pages were shuffled at random. It doesn't work. 

The biggest takeaway for the project might be Jasna Fritzi Bauer, who plays Mifti as if the character was Joan of Arc of fucking shit up. Bauer gives one of those completely wild performances that promises great roles in the future (Stacy Martin's breakout work in "Nymphomaniac Vol. 1" comes to mind). She takes us through the albeit maddening events with an anything-goes mentality and a zeal to live more than just dangerously. 

As impulsiveness becomes the movie's main sense of logic, it's an idea that works for Mifti but not for anything writer/director Helene Hegemann is trying to do. Mifti interacts with people who float in and out of her life, like her actress friend Anika (Laura Tonke), or an older woman named Alice (Arly Jover) that she meets in a grocery store who becomes a fixation. Everyone is painted with throwaway interactions, the movie's penchant for random conversations as character detail (further nudging its French new wave influence) leading to white noise. As a filmmaker too, she communicates without logic—here's something of a flashback, here's another character of uncertain relationship to Mifti, here's a scene of a penguin walking around Mifti's apartment.

"Axolotl Overkill" dreams most of actualizing raw, wild images, but it stinks of a rotting malaise where nothing matters to the story or storyteller, not even the arc that is very possible with its boundless lead performance. It's frustrating to watch a director take on so many ideas, but pursue none of them with clarity. There's passion in here, at least for the numerous scenes that seem like intricate productions (scenes in the club, or walking around the city). But I wish I could say there was hope for where Hegemann's vision will go next—spending 90 minutes with it, I don't even know what that vision is. 

Also competing in the World Cinema Dramatic category is "Family Life," a big whiff of a Chilean dramedy about a bad house sitter, but a movie that has little personality despite its intriguing premise, and low-key quirkiness. Fifteen minutes after showing a relationship between husband Bruno (Cristián Carvajal), wife Consuelo (Blanca Lewin) and their young daughter, it finally focuses on Martín (Jorge Becker), Bruno’s long-lost friend who has been chosen to watch Bruno and Consuelo’s house for a few months (in a rare charismatic detail, Bruno asked Martin to do it when they ran into each other at Martín’s father’s funeral, of all places).

The main problem is with the story, which never lets anything develop. A depressed but self-entertaining Martín does a couple of amusing things to the house in wordless sequences, urinating on plants, wearing Bruno’s clothes, framing a picture of Consuelo for him to look at. But he’s as bland a character can be when immersed in such melancholy, to the detriment of even the broadest ideas of comedy or drama. 

Co-directors Cristián Jiménez and Alicia Scherson provide a little focus when pursuing an underwhelming narrative about Martín using the house and its pieces to be someone else. When he meets a woman, Paz (Gabriela Arancibia) looking for her dog (after he loses the family cat, Mississippi), his lies get bigger while their bond goes beyond purely sexual. She thinks the house is his, that the woman in the framed picture is his ex-wife, etc. It’s a movie of constantly waiting for the other shoe to drop, whether its Paz finding out the truth, or Consuelo & Bruno coming home to see Martín’s displays of self-destruction, without any sympathy for anyone established. As a movie that continues to only exist rather than barely amuse, it then aims for poignancy in the last few minutes about what we can’t have, but it’s one last strike-out before the movie's done.

Recent additions: xcffib 0.5.0

Added by TychoAndersen, Sat Jan 21 16:24:50 UTC 2017.

A cffi-based python binding for X Date-Tolkien-Shire-1.20

Convert dates into the Shire Calendar.

Recent additions: xcb-types 0.8.0

Added by TychoAndersen, Sat Jan 21 16:20:43 UTC 2017.

Parses XML files used by the XCB project

MetaFilter: Grizabella sings Queen

Elaine Paige (Cats, Chess, a zillion other things) sings the songs Queen in a 1988 album titled simply The Queen Album. [YouTube playlist, so so sorry about the commercials]

Slashdot: New Release Of Nim Borrows From Python, Rust, Go, and Lisp

An anonymous reader writes: "Nim compiles and runs fast, delivers tiny executables on several platforms, and borrows great ideas from numerous other languages," according to InfoWorld. After six years, they write, Nim is finally "making a case as a mix of the best of many worlds: The compilation speed and cross-platform targeting of Go, the safe-by-default behaviors of Rust, the readability and ease of development of Python, and even the metaprogramming facilities of the Lisp family..." Fossbytes adds that Nim's syntax "might remind you of Python as it uses indented code blocks and similar syntax at some occasions. Just like Rust and Go, it uses strong types and first class functions... Talking about the benchmarks, it's comparable to C. Nim compiler produces C code by default. With the help of different compiler back-ends, one can also get JavaScript, C++, or Objective-C. There's an improved output system in the newest release, and both its compiler and library are MIT licensed. Share your thoughts and opinions in the comments. Is anybody excited about writing code in Nim?

Read more of this story at Slashdot.

Recent additions: simple-log 0.5.1

Added by AlexandrRuchkin, Sat Jan 21 15:32:54 UTC 2017.

Simple log for Haskell

Saturday Morning Breakfast Cereal: Saturday Morning Breakfast Cereal - Humpty Dumpty

Click here to go see the bonus panel!

We must imprison his acolytes before they can make a martyr of him. Else, this brief time of peace shall be ova.

New comic!
Today's News:

Hackaday: A Motherboard Manufacturer’s Take On A Raspberry Pi Competitor

In the almost five years since the launch of the original Raspberry Pi we have seen a huge array of competitors emerge in the inexpensive single board computer market. Many have created their own form factors, but an increasing number have gone straight for the jugular of the fruity board from Cambridge by copying its form factor and interfaces as closely as possible. We’ve seen sterling efforts from the likes of Banana Pi, Odroid, and several others, but none have yet succeeded in toppling it from its pedestal.

The ASUS Tinker specification.
The ASUS Tinker specification.

The latest contender in this arena might just make more of an impact though, because it comes from a major manufacturer, a name you will have heard of. Asus have quietly released their Tinker, board that follows the Pi form factor very closely, and packs a 1.8 GHz quad-core ARM Cortes A17 alongside an impressive spec we’ve captured as an image for this article. Though they are reticent about it on their website, there is a SlideShare presentation with some of the details, which we’ve placed below the break.

At £55 (about $68) where this is being written it’s more expensive than the Pi, but Asus go to great lengths to demonstrate that it is significantly faster. We will no doubt verify the accuracy of that claim as the boards find their way into the hands of our community. Still, it features a mostly-Pi-compatible I/O header, and the same display and camera connectors as the Pi. There is no information as to how compatible these last two are though.

Other boards in this arena have boasted impressive hardware, but have fallen down when it comes to the support for their operating systems. When you buy a Raspberry Pi it is not just the hardware you are taking on but the Raspbian operating system and its impressive community support. The Tinker supports Debian, so if Asus is to make a mark they must ensure that its support rivals that of the board it is targeting. If they succeed in that endeavor then the result can only be good news for us.

To get an idea of the products the Tinker is up against, read our Raspberry Pi 3 and Odroid C2 reviews from last year. But don’t take all our SBC coverage so seriously.

Thanks [Mynasru].

Header image: the CPC catalogue page linked above.

Filed under: computer hacks, news

Slashdot: Microsoft To Lay Off 700 Employees Next Week, Report Says

According to a report by Business Insider (Warning: may be paywalled), Microsoft will cut about 700 jobs in conjunction with its quarterly earnings release next week. GeekWire reports: The latest layoffs are part of the company's previously announced plan to cut about 2,850 roles globally during its current fiscal year, according to the Business Insider report. The company declined to comment this afternoon, but we understand the report to be accurate, based on our own sources. Next week's cuts will be spread across a variety of job functions inside the company. The company's previous job cuts have come in areas including its smartphone business and global sales team. Microsoft announced its largest cuts in July 2014, eliminating 18,000 jobs, or 14 percent of the company at the time.

Read more of this story at Slashdot.

Hackaday: DreamBlaster X2: A Modern MIDI Synth for Your Sound Blaster Card

Back in the 90s, gamers loaded out their PCs with Creative’s Sound Blaster family of sound cards. Those who were really serious about audio could connect a daughterboard called the Creative Wave Blaster. This card used wavetable synthesis to provide more realistic instrument sounds than the Sound Blaster’s on board Yamaha FM synthesis chip.

The DreamBlaster X2 is a modern daughterboard for Sound Blaster sound cards. Using the connector on the sound card, it has stereo audio input and MIDI input and output. If you’re not using a Sound Blaster, a 3.5 mm jack and USB MIDI are provided. Since the MIDI uses TTL voltages, it can be directly connected to an Arduino or Raspberry Pi.

This card uses a Dream SAM5000 series DSP chip, which can perform wavetable synthesis with up to 81 polyphonic voices. It also performs reverb, chorus, and equalizer effects. This chip sends audio data to a 24 bit DAC, which outputs audio into the sound card or out the 3.5 mm jack.

The DreamBlaster X2 also comes with software to load wavetables, and wavetables to try out. We believe it will be the best upgrade for your 486 released in 2017. If you’re interested, you can order an assembled DreamBlaster. After the break, a review with audio demos.

Filed under: digital audio hacks

Tea Masters: Winter Alishan Zhuo Yan Oolong

I'm ready to head south for my little family's traditional Chinese New Year vacation. I'll be back around February 2nd to resume the delivery of your orders.

But before I leave, let me share another wonderful find from this winter season: a jassid bitten Qingxin Oolong from Alishan. The bites are not as numerous as in this Oolong from Shan Lin Xi, the oxdition is lighter, but it delivers very unusual fruity and fudge notes with a very powerful sweet taste and aftertaste. DEEP! A Beethoven symphony or a Pearl Jam concert! It's the kind of Oolong that lingers in the mouth with just the right mix of dark sugar sweetness and bitterness (a nicer word would be tannins).
There's a ray of light with dark undertones, just like the sight of the brew on this dark blue Chabu. (This is a wonderful Chabu, by the way, and it is a great example of how a well matched Chabu can create a fitting atmosphere for a tea session.)
 Since it's a recently made tea, I recommend that you be careful not using too many leaves. Instead, make rather long brews to let its aftertaste shine!
 Have a wonderful Chinese New Year!
I'm heading for the sea and the sun tomorrow. This is also the theme of this year's new tea postcards. They have just arrived!
Thanks for helping me select them.

Planet Haskell: JP Moresmau: So long Haskell, and thanks for all the functional fish

I've realized I haven't written or read a line of Haskell in the past 6 months. After roughly ten years of tinkering with it, it seems that I've given up on it. There is a big obvious reason, and other smaller ones.

Professionally, my job got a lot more challenging (I'm officially an **architect** now, which means I still write lots of code but I have to draw pretty diagrams too (-: ) and involves a lot of research and learning new stuff, things like microservices, docker, messaging, Angular2, mobile apps, etc. So a lot of my time is dedicated to work or to learning for work, so I don't have the time to play around with something quite unrelated like Haskell.

I suppose to be honest there also was a bit of lassitude with Haskell. I got tired of the less than optimal IDEs, I realized Haskell was not going to get me a great job, and there were a few little skirmishes on the web that got ugly and made me see the community in a less favorable light.

This was fun, though, and I certainly learned a lot, and I hope it has made me a better programmer. A lot of my coding now is done in Java 8, and it's good to be able to apply some functional idioms practiced in Haskell, and more general ideas like data immutability, small pure functions do help make better - more testable, easier to understand - code.

So maybe I'll come back to Haskell some day, but not for now. To all the open source projects I've contributed, I wish you the best!

Happy Haskell (or any other language) Hacking!

MetaFilter: Pressure!!

Pigeons sing Under Pressure by Queen and David Bowie. A comic by ProfessorBees.

Electronics-Lab: SAMD21G-Based Arduino Compatible Development Board

With extended I/O pins, the same powerful controller of the Arduino Zero, Atmel SAMD12G18 and in smaller size, Albert Van Dalen had developed “SAM 15×15“ development board.

SAM 15×15 is an Arduino compatible development board that features the Atmel SAMD12G18 microcontroller. It has 34 digital I/O pins, 24 pins of them support PWM, and 14 are analog inputs.

The SAMD12G18 is a low-power, high-performance Atmel SMART ARM Cortex-M0+ based flash microcontroller. It is ideal for a wide range of home automation, consumer, metering, and industrial applications. It features 256KB of flash and 32KB of SRAM, up to 48MHz operating frequency, 1.62V to 3.63V power supply, full speed USB device and embedded host, and six serial communication modules configurable as UART/USART, SPI or I2C.

The SAM 15×15 board is 28x28mm size and it has three embodiments combined into one PCB:

  • 28 x 28m: This board fits on a standard breadboard; it has 40 pins with 2.54mm pitch.
  • 22 x 22mm: This board is a smaller version of the 28 x 28mm board.
  • 15 x 15mm: This board has 40 pins with 1.27mm pitch.

Only the default non-reduced dimensions (28 x 28mm) is available for ordering by contact with Albert directly, its price is €24.95 and the shipping is free for all countries worldwide. 4-pin USB pin header is included, and male USB 2.0 motherboard cable is optional for €2.00.

The price is expensive a bit because of the high manufacturing costs for the initial series of just 100 pieces. But you can get back your money when publishing your project with the SAM 15×15 on the internet as an article.

SAM 15×15 features

  • Controller: Atmel ATSAMD21G18, 32-bit, 48MHz, ARM Cortex-M0+
  • Digital I/O pins: 34
  • PWM outputs: 24 (PWM DAC)
  • Analog inputs (ADC): 14
  • ADC resolution: 12-bit
  • One 10-bit DAC
  • Flash memory: 256 kbyte
  • SRAM: 32 Kbyte
  • EEPROM: 32 Kbyte (emulated in Flash)
  • Preprogrammed Arduino Zero bootloader
  • Programming and debugging through the integrated USB port
Comparison between SAM 15×15 and other Arduino boards

More details and information about the board is available here with examples and other useful tips and guides.

This video shows the 34 I/O pins and the 24 PWM pins in action

The post SAMD21G-Based Arduino Compatible Development Board appeared first on Electronics-Lab.

Hackaday: Hidden Bookshelf Door Shows Incredible Motion

Who didn’t dream of a hidden door or secret passage in the house when they were kids? Some of us still do! [SPECTREcat] had already built a secret door in a fully functioning bookcase with a unique opening mechanism. The intriguing mechanism allows the doors to start by sliding slightly away form one another before hinging into the hidden space. Their operation was, however, was manual. The next step was to automate the secret door opening mechanism with electronics.

The project brain is an off-the-shelf Arduino Uno paired with a MultiMoto Arduino shield to drive 4 Progressive Automations PA-14 linear actuators. These linear actuators have 50lb force, allowing the doors to fully open or close within 10 seconds and maintain a speed that wouldn’t throw the books off the bookcases.

Not wanting to drill a hole through the bookshelf for a switch or other opening mechanisms, [SPECTREcat] added a reed switch that is activated on the other side by a DVD cover with a magnet inside. In addition to that, there is a PIR sensor on the inside room to automatically close the doors if no motion is detected for 2 hours. Dont worry, there’s also a manual switch inside just in case.

Using one of the items on the shelf to trigger the secret passage is a classic move. He could also have used a secret knock code, like the Secret Attic Library Door we covered in the past. Check out the video below to see the hinge and slide movement in action.

Filed under: home hacks

Penny Arcade: News Post: PAX South Pin Post!

Gabe: Pax South is just less than a week away now and already people are calling it the Pax South of the year. I will be in attendance although you might see me zipping around on a scooter sometimes. I’m feeling much better now but my doctor doesn’t want me to push it and the scooter has already been rented. Let’s talk pins! PARTNER PINS Clank and Bandit Queen [Dire Wolf Digital] Available for $15 each at the Dire Wolf Digital Booth #10641. Will also be given away to players who win demo games throughout the weekend. Edith Finch [Annapurna Interactive] Attendees who complete…

All Content: Sundance 2017: "Whose Streets?"


When people ask about the Black Lives Matter movement, whether it’s a year or 50 from now, I will tell them to see director Sabaah Folayan’s documentary “Whose Streets?” This documentary about the events in Ferguson, MO, as told from the perspective of people who were actually there, is important to understanding both the past and the present—it’s a historical document that could do great things right at this moment. 

"Whose Streets?" starts with the simple gesture of letting people tell their story with their own voice and footage, and it makes for a compelling beginning to something that expands to five parts. "Whose Streets?" continues to be so much more and more powerful than I expected. Taking shape as an epic about a community uniting over its pursuit of equality, “Whose Streets?” talks about the racist Ferguson police force, the Ferguson October movement, and so much more. It’s a movie that takes you through a movement, under the name Black Lives Matter and more, in which you see how people expand, and how it continues to prosper.

“Whose Streets?” is in part an act of justice. The events that followed in Ferguson, MO on August 2014 after the killing of Michael Brown by police officer Darren Wilson were not given proper due by the rest of the world. Those who weren’t there don’t really know the events that happened, especially if relying on news reports that favored sensationalism and baited racism in the process. To start, segments that often led with “a riot in Ferguson” left out the candlelight vigils and the peaceful protests that were the initial response to such tragedy. In the process they took away the humanity of a place and people, when that’s the exact opposite response needed when such lives are in danger. 

This movie tells the story of Ferguson from first-person perspectives—footage shot by people who were in Ferguson during and after Michael Brown was killed, and when the militarized police came to further dehumanize its citizens. The police's military-level approach is all the more visceral when a flash grenade is captured on a shaky iPhone camera, or explosions rip through the audio while showing people running away from police. Or footage of red dots appearing on Ferguson residents, a type of warning fit for a war zone. 

“Whose Streets?” is in part an act of love. It finds some reoccurring characters in various people of Ferguson, who speak openly and passionately about their fight for equality. Activist and mother Brittany Farrell is one particular person who fills this story with so much love, as she talks about how she wants to teach her daughter about the importance of protesting. And there's a life-changing moment for her with her girlfriend that brought me to tears instantly, accompanied by Brittany talking about how she wants to challenge the idea of normal. 

Using such raw footage from the perspective of the silent and the oppressed, this documentary is extremely potent with the many things it wants you to feel. The anger is so visceral, and so goddamn tragic. Just the same, its images of love and pride will fill your soul. It presents so many important images—racism, hatred and so much love—and dares you not to be moved. Comic for 2017.01.21

New Cyanide and Happiness Comic

Penny Arcade: News Post: The Spotlight

Tycho: Now that it seems like Gorobriel’s stuff is staying in, and he can laugh without terror, he’s back to his old haunts.  He loves Symmetra’s playstyle, and he loves her comic, which I love also.  The moral dimension of Overwatch is deliciously robust, even before you broach the subject of erotic Tumblr comminglings. Symmetra is not his attack choice.  Although, I just had a conversation with somebody yesterday about the effectiveness of Attack Symmetra after the rebuild, so who knows.  He has an Attack roster and a Defend roster, and he won’t mix…

All Content: Sundance 2017: “The Incredible Jessica James” & “The Little Hours”


Sundance programmers are smart enough to know that many attendees would be bringing their own personal storm cloud related to the new President’s inauguration falling on the first full day of this year’s event. Perhaps that’s why they programmed a special screening of one of the most purely enjoyable romantic comedies in a long time and a world premiere of a wacky, broad, gigantic ensemble laugher that equally allowed moviegoers to leave the real world behind for 90 minutes. Both of these flicks are often remarkably funny, and they do something similar in the way they play up to the strengths of their talented casts. Not every comedy needs to break the mold, and many of our best in the genre worked because they were designed for the people who fronted them.

Such is the case with “The Incredible Jessica James,” from Jim Strouse (“People Places Things,” “Grace is Gone”), which the writer/director admitted in his introduction was created for “The Daily Show” veteran Jessica Williams. And it shows. She is fantastic, and one truly hopes this film opens dozens of doors for her. It is a movie wildly and unapologetically in love with its leading lady. It’s not that it presents its title character without flaws but that even her insecurities and anxieties come across as so genuine that the people around her love those parts of her as well. It’s a simple film—about a woman getting over one relationship and into another, while also dealing with the delayed gratification that often comes when one pursues a life in the arts—but that simplicity can be deceiving. This is not an easy balancing act. If it was, there would be more quality romantic comedies like it.

Williams plays, of course, Jessica James, a character introduced dancing her way through her apartment, up the stairs, and to her Bushwick roof. She is all energy—fast-talking and faster-thinking. She is defiant in the face of societal norms—a scene in which she gives her younger sister a book about defying the patriarchy for a baby shower is perfectly in tune with the character—but she’s struggling in two areas of her life. She just broke up with her boyfriend Damon (Lakeith Stanfield, great here and in the also-at-Sundance “Crown Heights”) and she gets daily rejection letters in her attempts to become a playwright. She works at a theater for children interested in playwriting and does some odd jobs with a friend (Noel Wells of “Master of None”). Said friend introduces her to a recently-divorced guy named Boone (Chris O’Dowd), and the two help each other get over their recent break-ups.

“The Incredible Jessica James” is genuinely funny, but not in an aggressively bit-driven way. Strouse is too delicate of a filmmaker for that, although there are some wonderful broad comedy scenes, including several dream sequences Jessica has about her ex. For the most part though, the humor is character-driven, and this is what’s lacking from most modern rom-coms—relatability. It’s so hard to see ourselves in most romantic comedy characters, but it’s easy to picture checking your ex’s social media feeds obsessively or casually walking by your ex-wife’s house every night just to see what’s up. And Williams conveys the artistic drive of this character beautifully. She doesn't write because she wants to, she has no other choice. And she puts that energy into everything. Jessica and Boone are likable people (O’Dowd hasn’t been this funny since “Bridesmaids”) and it’s just a pleasure to hang out with them for 90 minutes and then move on. It’s not a movie meant to change the world, just to give you a little bit of joy. Try not to smile.

The same could be said about Jeff Baena’s wacky “The Little Hours,” a film with echoes of Mel Brooks in its non-contemporary setting, broad physical comedy, unexpected punchlines, and gigantic ensemble (seriously, every other face is a recognizable one). Baena uses one of the stories of The Decameron as the inspiration for a comedy of religious people who don’t exactly have the expected moral code for a film set in a 14th century convent. Baena may have used The Decameron explicitly but he’s also inspired by physically-driven comedies of the ‘70s and ‘80s, with echoes of “The History of the World, Part 1” and Monty Python’s work. It’s often hysterically funny, especially when allowing its talented cast to play up to their individual strengths.

That cast is led by Alison Brie as Sister Allesandra, living a simple life in a convent, although her sisters are jealous of her greater creature comforts courtesy of her father’s (Paul Reiser) donations to the church. Said sisters include the foul-mouthed and possibly sociopathic Fernanda (Aubrey Plaza) and the more demure and chaste Ginerva (Kate Micucci). Their simple life is interrupted when a young man named Massetto (Dave Franco) takes up residence as a handyman in their convent. Hidden there by Father Tommasso (John C. Reilly), Massetto pretends to be a deaf-mute (again, so Brooks) so as not to raise suspicions. Of course, this only makes him more fascinating to the sisters, who all try to sleep with him. Molly Shannon co-stars and Nick Offerman and Fred Armisen practically steal the movie in just a few scenes.

Again, much like “Jessica James,” a review of “The Little Hours” can be summarized in the word "enjoyable." I laughed, multiple times. And that’s really all Baena wants here. He’s not making any grand statements about religion or sexuality. He just wants you to laugh. And I did. A lot. At this Sundance, more than most years, that seems like a gift.

ScreenAnarchy: Hey Australia! Win Tickets to See JOURNEY TO THE WEST 2: THE DEMONS STRIKE BACK in Cinemas!

Directed by Tsui Hark and produced and co-written by Stephen Chow, Journey to the West 2: The Demons Strike Back is the latest film based on the classic Chinese novel ‘Journey to the West’. The cast includes Kris Wu, Kenny Lin, Yao Chen, Lin Yun and Bao Bei-Er.    Thanks to Magnum Films, we have FIVE double passes for the film to give away to our readers.    For a chance to win, all you have to do is to follow these two steps:   1) Like the Magnum Film Facebook page, and   2) Email your name and postal address to me at: hugo[at]   Journey to the West 2: The Demons Strike Back will open in Australian cinemas on January 28 and this...

[Read the whole post on]

bit-player: The Polite Apocalypse

On the Beach cover of 1957 editionI’ve been rereading On the Beach, Nevil Shute’s novel about humanity’s last gasp in the aftermath of a nuclear war. The book was published 60 years ago, in 1957. I first read it in 1963, which is roughly when the events in the story are supposed to take place. It was also just a few months after the Cuban missile crisis, when annihilation was in the air.

Spoiler alert: Everybody dies.

The setting is Melbourne, Australia, the southernmost major city on the planet. The entire population of the Northern Hemisphere was wiped out in the war, and airborne radioactivity is slowly creeping across the Equator. Darwin and Cairns, on Australia’s north coast, are already ghost towns, and the people of Melbourne are told they have less than a year to go.

A U.S. submarine takes refuge in Melbourne’s harbor. Over a period of weeks the captain of that vessel, Dwight, forms an attachment to a young woman named Moira. There’s affection on both sides, and maybe passion, but Dwight is determined to remain faithful to his wife and children back in Connecticut. He buys them presents: a diamond bracelet, a fishing rod, a pogo stick. He speaks of them in the present tense. Is Dwight delusional? Not exactly. He knows perfectly well that his family are all dead, and that he’ll never rejoin them except in the sense that he too will soon be dead. But those deaths are abtractions.

He had seen nothing of the destruction of the war . . . ; in thinking of his wife and of his home it was impossible for him to visualize them in any other circumstances than those in which he had left them. He had little imagination, and that formed a solid core for his contentment in Australia.

It’s not just Dwight who lacks imagination—or chooses to ignore the truths it reveals. Moira studies shorthand and typing for a future job that will never exist. Her father harrows fields for crops that will never grow. Another couple plant hundreds of daffodils whose blooms they will never see, and they invest in a lawn mower for grass they’ll never cut.

The author himself seems to share this selective connection to reality. Everyone in his doomed society is unfailingly polite, and usually cheerful. Civilization may be ending, but not civility. There’s not a single act of violence or malice or even selfishness in the entire story. Shute mentions no hoarding or profiteering, much less rape and pillage. No marauding bandits or desperate refugees from the contaminated north descend on this last haven. On the Beach is the antithesis of that other Australian vision of apocalypse: the Mad Max movies. (The first of the series, in 1979, was filmed near Melbourne.)

It’s also worth noting that no one in Shute’s world takes any steps to prolong life. The government is not hollowing out mountains to keep the human germ line going until the atmosphere clears. Families are not digging fallout shelters in the back yard. These last few representatives of Homo sapiens may indulge in a variety of follies, but hope isn’t one of them.

Why am I writing about this sad book just now? Well, obviously, it’s inauguration day. Which feels more like termination day.

The threat of nuclear disaster has continued to shadow us through all the years since Shute wrote his novel. The danger of a planet-scouring war seemed particularly urgent when I was 13 and reading On the Beach for the first time. I stood up in front of my eighth-grade English class to give an oral report on the book. My performance was not interrupted by a duck-and-cover drill, but it could have been.

Now we have handed control of 4,700 nuclear warheads to a petulant brat, and the danger seems greater than ever.

Revisiting that sense of menace is why I picked up the book, but it’s not what has made the strongest impression on me this second time around. I am both drawn to and appalled by the stoic acceptance of Shute’s fictional Melbournites. Given their circumstances, their reaction is not inappropriate. The worst has already happened, there’s nothing they can do to change it, they may as well make the best of it. In the face of certain extinction, what can you do but shrug your shoulders? Maybe the best way of muddling through is just to plant some daffodils.

Given the current mood of the nation and the world, I suddenly find it easier to understand Dwight’s behavior. The urge to pretend is powerful. I too want to believe that life can go on as normal, that I can continue to enjoy the private pleasures of family and friends, that I can retreat to a cozy office or library and lose myself in the world of ideas, in the “less fretful cosmos” of mathematics and science, or art and literature for that matter.

But we are not yet huddled on the beach, the last of the doomed. It’s late, but not yet too late. This is not the moment for resignation and acquiescence. Tomorrow we march!

Quiet Earth: First Look at Pastoral Thriller AMERICAN FABLE [Trailer]

Watching the trailer for Anne Hamilton's feature film debut brought back memories of Guillermo del Toro's Pan's Labyrinth, not in setting or story or perhaps even theme but in its approach to how a young girl deals with a traumatic event.

American Fable stars Peyton Kennedy as Gitty, an 11-year-old girl who lives on a struggling farm with her family.

When she discovers a man being held in a silo, her world is thrown into a tailspin and she finds herself trying to piece together what the adults aren't telling her. It's here the fantastical elements kick in.

I'm not certain if American Fable is actually a horror movie but the trailer features some unsettling images and there's a sense of dread throughout which is really appealing.

Ame [Continued ...]

BOOOOOOOM!: Book Giveaway: Cut That Out

Creative duo Ryan Doyle and Mark Edwards (aka DR.ME) have come out with a new book celebrating contemporary collage in the field of graphic design! Published by Thomas and Hudson, Cut That Out offers a curated collection of collage work from leading designers and studios from 15 different countries. See more images below or get yourself a copy in stores/online.

We also have a copy to give away to one of you guys! We wanna know what your current favourite art book is? Let us know by leaving a comment at the bottom of this post. We’ll pick a winner two weeks from today (open to all readers based in North America and Europe).


Deap Vally x Natalie Foss


Musician Anna Bulbrook (The Bulls, Airborne Toxic Event, and Edward Sharpe & the Magnetic Zeros) recently launched GIRLSCHOOL, a Los Angeles-based music festival and collective that celebrates female voices. A portion of proceeds from each event go to a girl-positive organization, and this year’s festival (Jan 27-29) will support Rock n’ Roll Camp for Girls LA, a 501c3 social justice organization using loud music to nurture self-esteem and self-expression in young girls.

Society6 has joined forces with GIRLSCHOOL to pair up musicians and artists to create visuals inspired by the music, to be displayed at the event. See a few more of the collaborations below!

ScreenAnarchy: Slamdance 2017 Review: Laugh At Awful People in NEIGHBORHOOD FOOD DRIVE

Neighborhood Food Drive’s synopsis should be a clue as to what kind of film it is: “Awful idiots fail at throwing a party over and over”. Director Jerzy Rose definitely wasn’t out to make a feel-good comedy with those emotional moments the more mainstream ones tend to tack on during the last 20 minutes. The idiots in question are Madeline (Lyra Hill) and Naomi (Bruce Bundy), the owners of an upscale yet curiously always empty restaurant. Wanting to supposedly help their community, they set about organizing food drives with the help of their dimbulb waiter Steven (Marcos Hughes), his flighty girlfriend Bianca (Ruby McCollister) and the couple’s douchey, bearded, Jason Sudeikis-type college prof David (Ted Tremper), who apparently has nothing better to do than hang...

[Read the whole post on]

Quiet Earth: COLOSSAL Looks Like Nacho Vigalondo's Kaiju Comedy [Trailer]

Aside from telling interesting stories, Spanish writer/director Nacho Vigalondo's movies have something else in common: the director's often strange sense of humor. His latest movie, which is also his biggest to date, is no exception.

Colossal stars Anne Hathaway as Gloria, a woman suffering from an emotional breakdown who discovers she can control the kaiju which has suddenly appeared and is wreaking havoc over Korea.

Yes, Hathaway is, quite literally, playing a monster.

The premise is ridiculous and the first trailer suggests the movie is just as nutty. Kaiju dancing is not exactly as funny as I thought it would be but this looks promising.

Along with Hathaway, the movie also stars Dan Stevens, Jason Sudeikis and Tim Blake Nelson.

Colossal [Continued ...]

ScreenAnarchy: NYC Weekend Picks, Jan 20-22: Dealing with Trump, Early Scorsese, Adapting Patricia Highsmith, Poetic Docs From Iran, and a Jarmusch Classic

I wasn’t with it, but just that very minute, it occurred to me the suckers had authority … – Public Enemy, “Black Steel in the Hour of Chaos”   Today is when it all goes down, figuratively and literally. Regardless of where you sit on the political spectrum, the gravity and the portentousness of today's events in Washington D.C. can hardly be understated, even if it often seems that the ascendant occupant of the U.S.'s highest office doesn't fully appreciate that fact.     So, whether you wish to contemplate the consequences of our new national and world order, are looking for inspiration for resisting it, or just want to forget about the whole thing for a couple of hours, my choices this week have you covered.     In...

[Read the whole post on]

ScreenAnarchy: Slamdance 2017: WEXFORD PLAZA, A Small Slice Of Real Life

Wexford Plaza plays out its story on a small and intimate scale, a picture of suburban life which probably repeats itself in many an abandoned strip mall. Joyce Wong didn't feel the need to go big, and this affecting little slice of life is all the better for it.

[Read the whole post on]

ScreenAnarchy: Slamdance 2017 Review: CORTEZ, A Quietly Affecting and Beautifully Acted Debut

It's not easy to find cinema that transports the viewer into a place filled with people who genuinely seem to have existed before the film begins and long after it rolls credits. Cortez offers just that.

[Read the whole post on]

Open Culture: 20 Lessons from the 20th Century About How to Defend Democracy from Authoritarianism, According to Yale Historian Timothy Snyder

Image by Rob Kall, via Flickr Commons

Timothy Snyder, Housum Professor of History at Yale University, is one of the foremost scholars in the U.S. and Europe on the rise and fall of totalitarianism during the 1930s and 40s. Among his long list of appointments and publications, he has won multiple awards for his recent international bestsellers Bloodlands: Europe between Hitler and Stalin and last year’s Black Earth: The Holocaust as History and WarningThat book in part makes the argument that Nazism wasn’t only a German nationalist movement but had global colonialist origins—in Russia, Africa, and in the U.S., the nation that pioneered so many methods of human extermination, racist dehumanization, and ideologically-justified land grabs.

The hyper-capitalism portrayed in the U.S.—even during the Depression—Snyder writes, fueled Hitler’s imagination, such that he promised Germans “a life comparable to that of the American people,” whose “racially pure and uncorrupted” German population he described as “world class.” Snyder describes Hitler’s ideology as a myth of racialist struggle in which “there are really no values in the world except for the stark reality that we are born in order to take things from other people.” Or as we often hear these days, that acting in accordance with this principle is the “smart” thing to do. Like many far right figures before and after, Hitler aimed to restore a state of nature that for him was a perpetual state of race war for imperial dominance.

After the November election, Snyder wrote a profile of Hitler, a short piece that made no direct comparisons to any contemporary figure. But reading the facts of the historical case alarmed most readers. A few days later, the historian appeared on a Slate podcast to discuss the article, saying that after he submitted it, “I realized there was more…. there are an awful lot of echoes.” Snyder admits that history doesn’t actually repeat itself. But we’re far too quick, he says, to dismiss that idea as a cliché “and not think about history at all. History shows a range of possibilities.” Similar events occur across time under similar kinds of conditions. And it is, of course, possible to learn from the past.

If you’ve heard other informed analysis but haven’t read Snyder’s New York Review of Books columns on fascism in Putin’s Russia or the former Yanukovich’s Ukraine, or his long article “Hitler’s World May Not Be So Far Away,” you may have seen his widely-shared Facebook post making the rounds. As he argued in The Guardian last September, today we may be “too certain we are ethically superior to the Europeans of the 1940s.” On November, 15, Snyder wrote on Facebook that “Americans are no wiser than the Europeans who saw democracy yield to fascism, Nazism, or communism.” Snyder has been criticized for conflating these regimes, and rising “into the top rungs of punditdom,” but when it comes to body counts and levels of suppressive malignancy, it’s hard to argue that Stalinist Russia, any more than Tsarist Russia, was anyone’s idea of a democracy.

Rather than making a historical case for viewing the U.S. as exactly like one of the totalitarian regimes of WWII Europe, Snyder presents 20 lessons we might learn from those times and use creatively in our own where they apply. In my view, following his suggestions would make us wiser, more self-aware, proactive, responsible citizens, whatever lies ahead. Read Snyder’s lessons from his Facebook post below and consider pre-ordering his latest book On Tyranny: Twenty Lessons from the Twentieth Century:

1. Do not obey in advance. Much of the power of authoritarianism is freely given. In times like these, individuals think ahead about what a more repressive government will want, and then start to do it without being asked. You’ve already done this, haven’t you? Stop. Anticipatory obedience teaches authorities what is possible and accelerates unfreedom.

2. Defend an institution. Follow the courts or the media, or a court or a newspaper. Do not speak of “our institutions” unless you are making them yours by acting on their behalf. Institutions don’t protect themselves. They go down like dominoes unless each is defended from the beginning.

3. Recall professional ethics. When the leaders of state set a negative example, professional commitments to just practice become much more important. It is hard to break a rule-of-law state without lawyers, and it is hard to have show trials without judges.

4. When listening to politicians, distinguish certain words. Look out for the expansive use of “terrorism” and “extremism.” Be alive to the fatal notions of “exception” and “emergency.” Be angry about the treacherous use of patriotic vocabulary.

5. Be calm when the unthinkable arrives. When the terrorist attack comes, remember that all authoritarians at all times either await or plan such events in order to consolidate power. Think of the Reichstag fire. The sudden disaster that requires the end of the balance of power, the end of opposition parties, and so on, is the oldest trick in the Hitlerian book. Don’t fall for it.

6. Be kind to our language. Avoid pronouncing the phrases everyone else does. Think up your own way of speaking, even if only to convey that thing you think everyone is saying. (Don’t use the internet before bed. Charge your gadgets away from your bedroom, and read.) What to read? Perhaps “The Power of the Powerless” by Václav Havel, 1984 by George Orwell, The Captive Mind by Czesław Milosz, The Rebel by Albert Camus, The Origins of Totalitarianism by Hannah Arendt, or Nothing is True and Everything is Possible by Peter Pomerantsev.

7. Stand out. Someone has to. It is easy, in words and deeds, to follow along. It can feel strange to do or say something different. But without that unease, there is no freedom. And the moment you set an example, the spell of the status quo is broken, and others will follow.

8. Believe in truth. To abandon facts is to abandon freedom. If nothing is true, then no one can criticize power, because there is no basis upon which to do so. If nothing is true, then all is spectacle. The biggest wallet pays for the most blinding lights.

9. Investigate. Figure things out for yourself. Spend more time with long articles. Subsidize investigative journalism by subscribing to print media. Realize that some of what is on your screen is there to harm you. Learn about sites that investigate foreign propaganda pushes.

10. Practice corporeal politics. Power wants your body softening in your chair and your emotions dissipating on the screen. Get outside. Put your body in unfamiliar places with unfamiliar people. Make new friends and march with them.

11. Make eye contact and small talk. This is not just polite. It is a way to stay in touch with your surroundings, break down unnecessary social barriers, and come to understand whom you should and should not trust. If we enter a culture of denunciation, you will want to know the psychological landscape of your daily life.

12. Take responsibility for the face of the world. Notice the swastikas and the other signs of hate. Do not look away and do not get used to them. Remove them yourself and set an example for others to do so.

13. Hinder the one-party state. The parties that took over states were once something else. They exploited a historical moment to make political life impossible for their rivals. Vote in local and state elections while you can.

14. Give regularly to good causes, if you can. Pick a charity and set up autopay. Then you will know that you have made a free choice that is supporting civil society helping others doing something good.

15. Establish a private life. Nastier rulers will use what they know about you to push you around. Scrub your computer of malware. Remember that email is skywriting. Consider using alternative forms of the internet, or simply using it less. Have personal exchanges in person. For the same reason, resolve any legal trouble. Authoritarianism works as a blackmail state, looking for the hook on which to hang you. Try not to have too many hooks.

16. Learn from others in other countries. Keep up your friendships abroad, or make new friends abroad. The present difficulties here are an element of a general trend. And no country is going to find a solution by itself. Make sure you and your family have passports.

17. Watch out for the paramilitaries. When the men with guns who have always claimed to be against the system start wearing uniforms and marching around with torches and pictures of a Leader, the end is nigh. When the pro-Leader paramilitary and the official police and military intermingle, the game is over.

18. Be reflective if you must be armed. If you carry a weapon in public service, God bless you and keep you. But know that evils of the past involved policemen and soldiers finding themselves, one day, doing irregular things. Be ready to say no. (If you do not know what this means, contact the United States Holocaust Memorial Museum and ask about training in professional ethics.)

19. Be as courageous as you can. If none of us is prepared to die for freedom, then all of us will die in unfreedom.

20. Be a patriot. The incoming president is not. Set a good example of what America means for the generations to come. They will need it.

via Kottke

Related Content:

Umberto Eco Makes a List of the 14 Common Features of Fascism

George Orwell’s Final Warning: Don’t Let This Nightmare Situation Happen. It Depends on You!

Watch “Don’t Be a Sucker!,” the 1947 US Government Anti-Hatred Film That’s Relevant Again in 2016

Josh Jones is a writer and musician based in Durham, NC. Follow him at @jdmagness

20 Lessons from the 20th Century About How to Defend Democracy from Authoritarianism, According to Yale Historian Timothy Snyder is a post from: Open Culture. Follow us on Facebook, Twitter, and Google Plus, or get our Daily Email. And don't miss our big collections of Free Online Courses, Free Online Movies, Free eBooksFree Audio Books, Free Foreign Language Lessons, and MOOCs.

Daniel Lemire's blog: How quickly can you remove spaces from a string?

Sometimes programmers want to prune out characters from a string of characters. For example, maybe you want to remove all line-ending characters from a piece of text.

Let me consider the problem where I want to remove all spaces (‘ ‘) and linefeed characters (‘\n’ and ‘\r’).

How would you do it efficiently?

size_t despace(char * bytes, size_t howmany) {
  size_t pos = 0;
  for(size_t i = 0; i < howmany; i++) {
      char c = bytes[i];
      if (c == '\r' || c == '\n' || c == ' ') {
      bytes[pos++] = c;
  return pos;

This code will work on all UTF-8 encoded strings… which is the bulk of the strings found on the Internet if you consider that UTF-8 is a superset of ASCII.

That’s simple and should be fast… I had a blast looking at how various compilers process this code. It ends up being a handful of instructions per processed byte.

But we are processing bytes one by one while our processors have a 64-bit architecture. Can we process the data by units of 64-bit words?

There is a somewhat mysterious bit-twiddling expression that returns true whenever your word contains a zero byte:

(((v)-UINT64_C(0x0101010101010101)) & ~(v)&UINT64_C(0x8080808080808080))

All we need to know is that it works. With this tool, we can write a faster function…

uint64_t mask1 = ~UINT64_C(0) / 255 * (uint64_t)('\r');
uint64_t mask2 = ~UINT64_C(0) / 255 * (uint64_t)('\n');
uint64_t mask3 = ~UINT64_C(0) / 255 * (uint64_t)(' ');

for (; i + 7 < howmany; i += 8) {
    memcpy(&word, bytes + i, sizeof(word));
    uint64_t xor1 = word ^ mask1;
    uint64_t xor2 = word ^ mask2;
    uint64_t xor3 = word ^ mask3;

    if (haszero(xor1) ^ haszero(xor2) ^ haszero(xor3)) {
      // check each of the eight bytes by hand?
    } else {
      memmove(bytes + pos, bytes + i, sizeof(word));
      pos += 8;

It is going to be faster as long as most blocks of eight characters do not contain any white space. When this occurs, we are basically copying 64-bit words one after the other, along with a moderately expensive check that our superscalar processors can do quickly.

As it turns out, we can better without using 64-bit words.

// table with zeros at indexes corresponding  to white spaces
int jump_table[256] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
  0, 1, 1, 0, 1,  ...};

size_t faster_despace( char* bytes, size_t howmany ) {
  size_t i = 0, pos = 0;
  while( i < howmany )
    bytes[pos] = bytes[i++];
    pos += jump_table[ (unsigned char)bytes[pos] ];
  return pos;

This approach proposed by Robin Leffmann is very clever, and it is fast because it avoids penalties due to mispredicted branches.

Can we do even better? Sure! Ever since the Pentium 4 (in 2001), we have had 128-bit (SIMD) instructions.

Let us solve the same problem with these nifty 128-bit SSE instructions, using the (ugly?) intel intrinsics…

__m128i spaces = _mm_set1_epi8(' ');
__m128i newline = _mm_set1_epi8('\n');
__m128i carriage = _mm_set1_epi8('\r');
size_t i = 0;
for (; i + 15 < howmany; i += 16) {
    __m128i x = _mm_loadu_si128((const __m128i *)(bytes + i));
    __m128i xspaces = _mm_cmpeq_epi8(x, spaces);
    __m128i xnewline = _mm_cmpeq_epi8(x, newline);
    __m128i xcarriage = _mm_cmpeq_epi8(x, carriage);
    __m128i anywhite = _mm_or_si128(_mm_or_si128(xspaces, 
                xnewline), xcarriage);
    int mask16 = _mm_movemask_epi8(anywhite);
    x = _mm_shuffle_epi8(
          x, _mm_loadu_si128(despace_mask16 + mask16));
    _mm_storeu_si128((__m128i *)(bytes + pos), x);
    pos += 16 - _mm_popcnt_u32(mask16);

The code is fairly straight-forward if you are familiar with SIMD instructions on Intel processors. I have made no effort to optimize it… so it is possible, even likely, that we could make it run faster. My original SIMD code had a branch but Nathan Kurz realized that it was best to simplify the code and remove it.

Let us see how fast it runs!

I designed a benchmark using a recent (Skylake) Intel processor over text entries where only a few characters are white space.

regular code 5.5 cycles / byte
using 64-bit words 2.56 cycles/byte
with jump table 1.7 cycles/byte
SIMD (128 bits) code 0.39 cycles / byte
memcpy 0.08 cycles / byte

So the vectorized code is nearly 14 times faster than the regular code. That’s pretty good.

Yet pruning a few spaces is 5 times slower than copying the data with memcpy. So maybe we can go even faster. How fast could we be?

One hint: Our Intel processors can actually process 256-bit registers (with AVX/AVX2 instructions), so it is possible we could go twice as fast. Sadly, 256-bit SIMD instructions on x64 processors work on two 128-bit independent lanes which make the algorithmic design more painful.

Leffmann’s approach is not as fast as SIMD instructions, but it is more general and portable… and it is still three times faster than the regular code!

My C code is available.

Open Culture: Deconstructing How Louis CK Writes a Joke

Those who subscribe to the notion that deconstructing a joke ruins it may consider making an exception for the Nerdwriter (aka Evan Puschak).

His careful parsing of Louis CK’s Monopoly joke, above, takes rhythm, word choice, and the importance of a clearly stated premise into account.

Delivering the 207-word joke at the Beacon Theater, CK is characteristically nonchalant, but Puschak argues that there’s nothing unrehearsed about his performance.

Take the way he ramps up a scenario that will be familiar to any parent—the six-year-old who is emotionally unequipped to handle losing at games. CK gets at an even deeper truth about the howling injustice of being six, by saying that his younger daughter is “not emotionally developed enough to handle her inevitable loss in every game of Monopoly.”

Oh, the humanity.

Puschak also singles out CK’s acting ability. The way he speaks to his daughter, placing her in the first row of the audience, sharpens the comedy by helping the audience to fully visualize the scenario he’s set up:

I play Monopoly with my kids, that’s really fun. My nine year old, she can totally do Monopoly. The six year old totally gets how the game works but she’s not emotionally developed enough to handle her inevitable loss in every game of Monopoly because a monopoly loss is dark. It’s heavy. It’s not like when you lose at Candyland ‘Oh you got stuck in the fudgy-thing, baby! Oh well you’re in the gummy twirly-o’s! You didn’t get to win!’ But when she loses at Monopoly, I gotta look at her little face and go ‘Ok, so here’s what’s gonna happen now, ok? All your property, everything you have, all your railroads and houses, and all your money…that’s mine now. Gotta give it all to me. Give it to me, that’s right. And no no, you can’t play anymore because, you see, even though you’re giving me all of that, it doesn’t even touch how you owe me. Doesn’t even touch it, baby. You’re going down hard, it’s really bad. All you’ve been working for all day, I’m gonna take it now and I’m gonna use it to destroy your sister. I mean I’m gonna ruin her! It is just mayhem on this board for her now.

You can view the Nerdwriter’s other videos essays on his website or subscribe to his YouTube channel where a new video is published every Wednesday.

Related Content:

How the Great George Carlin Showed Louis CK the Way to Success (NSFW)

20-Year-Old Louis CK Performs Stand Up (1987)

Louis CK Ridicules Avant-Garde Art on 1990s MTV Show

Ayun Halliday is an author, illustrator, theater maker and Chief Primatologist of the East Village Inky zine.  Her play Zamboni Godot is opening in New York City in March 2017. Follow her @AyunHalliday.

Deconstructing How Louis CK Writes a Joke is a post from: Open Culture. Follow us on Facebook, Twitter, and Google Plus, or get our Daily Email. And don't miss our big collections of Free Online Courses, Free Online Movies, Free eBooksFree Audio Books, Free Foreign Language Lessons, and MOOCs.

Planet Haskell: Joachim Breitner: Global almost-constants for Haskell

More than five years ago I blogged about the “configuration problem” and a proposed solution for Haskell, which turned into some Template Haskell hacks in the seal-module package.

With the new GHC proposal process in plase, I am suddenly much more inclined to write up my weird wishes for the Haskell language in proposal form, to make them more coherent, get feedback, and maybe (maybe) actually get them implemented. But even if the proposal is rejected it is still a nice forum to discuss these ideas.

So I turned my Template Haskell hack into a proposed new syntactic feature. The idea is shamelessly stolen from Isabelle, including some of the keywords, and would allow you to write

context fixes progName in
  foo :: Maybe Int -> Either String Int
  foo Nothing  = Left $ progName ++ ": no number given"
  foo (Just i) = bar i

  bar :: Int -> Either String Int
  bar 0 = Left $ progName ++ ": zero no good"
  bar n = Right $ n + 1

instead of

foo :: String -> Maybe Int -> Either String Int
foo progName Nothing  = Left $ progName ++ ": no number given"
foo progName (Just i) = bar progName  i

bar :: String -> Int -> Either String Int
bar progName 0 = Left $ progName ++ ": zero no good"
bar progName n = Right $ n + 1

when you want to have an “almost constant” parameter.

I am happy to get feedback at the GitHub pull request.

Colossal: Full Trailer for ‘Loving Vincent,’ a Feature-Length Film Animated by 62,450 Oil Paintings

The full trailer for Loving Vincent (previously here and here), a film examining the life of Vincent van Gogh, has finally been released after nearly six years of creative development. Each of the 62,450 frames for the feature-length film were hand-painted by 115 professional oil painters, and will integrate 94 of Van Gogh’s paintings into the animation. First captured as a live action film, the final oil paintings replicate each shot, recreating the entire film frame-by-frame. Loving Vincent is written and directed by Dorota Kobiela and Hugh Welchman, and produced by Poland’s BreakThru Films and UK’s Trademark Films. You look behind-the-scenes of the film in the video below, as well as keep up-to-date with release information on the film’s Twitter and Facebook.

BOOOOOOOM!: Photographer Spotlight: Charlie Hawks

Colourful work by Brooklyn-based photographer Charlie Hawks. More images below.

Quiet Earth: Watch Bellflower Producer's CHUCK HAND AND THE SAN DIEGO TWINS [Trailer]

Behold the first teaser trailer for Chuck Hank and the San Diego Twins, the second film from Coatwolf Productions (Bellflower).

The film is the directorial debut of Jonathan Keevil who channels side-scrolling games of the 80s like Double Dragon, Contra, Bad Dudes, et all, in a fun, masculine beat-em-up, sci-fi romp.

The Syndicate, an evil gang bent on world domination, summons a secret weapon from the heavens and breaks the long-standing truce with the San Diego family by kidnapping their sister and cutting off the town’s supply of Tatsui Power-Up Drinks. [Continued ...]

Saturday Morning Breakfast Cereal: Saturday Morning Breakfast Cereal - It's not what it looks like!

Click here to go see the bonus panel!

I swear to you - our bond was only emotional and physical, never contractual like what you and I have!

New comic!
Today's News:

OK, so I meant to post these Wednesday. Eyyyyyy.


Bellevue (Oshinsky)

This is a well-researched history of New York’s Bellevue hospital. The author cleverly uses what is ostensibly a sort of biography of Bellevue to explore the history of medicine since the 18th century, and to explore the relation between hospitals, the government, and the public in the United States. It’s fascinating stuff.

Wonderland (Johnson)

This book was a bit light, but still very enjoyable. The thesis is that play and pleasure very important to the history of science, technology, and culture. As an example, Johnson argues that interest in automata helped lead (if a little indirectly) to the development of computers. Apparently, Babbage was quite interested in these early robots as a child, and it probably influenced his work. Johnson discusses other topics, such as the spice trade and the development of the Jacquard loom. I found this book fun, though I’m not quite prepared to buy the thesis as such. After all, anything that reaches fruition as a technology must first have been imagined. It’s hard to think of any interesting contraption whose origins couldn’t be traced back to something fun, in part (I suspect) because fun things tend to be easier to make. It’s hard to think of space-rockets coming into existence without someone first making toy versions. Furthermore, people play with all sorts of stuff that, of course, does NOT lead to technological revolutions.

My Best Mathematical and Logic Puzzles (Gardner)

I finally got myself into Martin Gardner, and I enjoyed myself thoroughly. My only complaint (and, it’s a bullshit complaint) is that I really prefer a particular type of puzzle - the kind that is simple enough to easily hold in one’s head, and which doesn’t benefit from having pencil and paper. Some of the puzzles had interesting results, but really just required you to sit and write out a little algebra.

Every Behaves Badly (Blume)

A delightful history of how the book The Sun Also Rises got written. It’s basically a slice of Hemingway’s early life, right up until that book made him famous (and a tiny bit afterward). My only gripe is it participates in this notion about Hemingway that I’m not quite ready to sign up for - that he was some sort of master of image creation. I’m sure he put forward an image of himself, but that’s true of every writer. It’s not obvious to me that he does it more than just about anyone else, and I don’t see him as especially calculating about it. I mean, he did put forward an image, but he also really actually liked drinking hard and watching bullfights. Still, it’s well-researched and tells a great story about a great story. If you’re interested in Hemingway, you’ll like it.

Penny Arcade: Comic: The Spotlight

New Comic: The Spotlight

Electronics-Lab: Ultra-thin, high thermal conductivity substrate integrates ESD protection

Clemens Valens @ discuss about a new IC substrate. He writes:

A new, ultra-thin ceramic substrate with an ESD strength of up to 25 kV – more than three times higher than the standard 8 kV of state-of-the-art Zener diodes – also features a high thermal conductivity of 22 W/mK. This is three times better than that of conventional carriers, even though the substrate is significantly slimmer. The new technology is especially well-suited for LED applications where the number and density of LEDs per unit continues to grow.

Ultra-thin, high thermal conductivity substrate integrates ESD protection – [Link]

The post Ultra-thin, high thermal conductivity substrate integrates ESD protection appeared first on Electronics-Lab.

Colossal: A New Large-Scale Installation of Boats and Tangled Thread by Artist Chiharu Shiota

All images, “Where are we going?” Installation by Chiharu Shiota at Le Bon Marché Rive Gauche, copyright Gabriel de la Chapelle

The newest installation by Chiharu Shiota (previously here and here) is composed of nearly 300,000 yards of white yarn, woven to encapsulate the center, ground floor, and ten windows of Le Bon Marché. The exhibition, titled Where are we going?, will feature 150 boats within the French department store’s center, and the ground-floor exhibition will house a giant threaded wave that visitors are encouraged to walk through. Despite boats being a common theme in Shiota’s work, this installation will mark the first time she has used white yarn, previously creating installations with only black or red thread.

The title of the exhibition, Where are we going?, refers to the mysterious destinations that pinpoint each of our individual and collective lives. Therefore the boats in this installation represent vessels sailing towards unknown locations, the works expressing both a sense of poetry and a sense of unease over what is to come.

“I am struck by the multiplicity of interactions that we experience every day, by their connections with the past and the future,” said Shiota in an interview with Le Bon Marché. “The creation of this indecipherable mesh and its plasticity are a mystery, just like our brain, the universe, and of course, life. I have no answers, only questions. These questions are the foundations of my work.”

Last year Le Bon Marché organized a large exhibition of Ai WeiWei's work which featured a 65-foot bamboo and silk dragon in the store’s atrium. Shiota’s Where are we going? will be displayed at Le Bon Marché through February 18, 2017. (via Fubiz)

The Half-Dipper: Everybody Darths, Sometime

Disquiet: The Radiant Explosion of W. Zabarkas

There’s a radiant explosion at the heart of W. Zabarkas’ The Origin of Dreams, a recent release on the Glistening Examples label. Much of it has an overwhelming industrial churn, even if you don’t make good on Zabarkas’ liner-note appeal: “The artist requests that you listen to this album at maximum volume,” it reads. Each of the tracks — “Autumn Invades the House,” “FOREST-91,” “2 0 9 4,” “Whereof One Сannot Speak, Thereof One Must Be Silent” — opens with an expansive, hyperactive static. For the most part they also see that massiveness, that ebullient chaos, through to the end. “Whereof One Сannot Speak, Thereof One Must Be Silent” closes on a long fade. “2 0 9 4,” after peaking with something akin to a post-rock band’s third-encore climax, also fades at the end. “Autumn Invades the House,” the opening track, fades as well, if fairly quickly by the standard set by the others. Only “FOREST-91” gives way to something else, something elegant, something other than the sense of a knob dutifully, patiently rotated to cold zero; it’s a few notes on repeat, the world’s slowest arpeggio, It’s so apart from the rest of the album that its quietness has the opposite effect: it ends up perhaps the main thing, other than the overall sense of being caught in a cyclone, that the listener may remember. It’s hard to tell what’s buried in that noise. There may be ritual chanting amid “FOREST-91,” or it’s a trick of the ear, human presence imagined as a pattern in the vast randomness. Zabarkas’ suggested patterns are rousing, powerful, fully mechanical, yet charged with purpose and momentum.

More from Glistening Examples at More from Zabarkas at and

Embedded in Academia: Introduction to Precision Farming

[My father, David Regehr, encouraged me to write this piece, provided some of its content, edited it, and agreed to let me use data from his farm.]
[For readers outside the USA: Alas, we do not farm in metric here. In case you’re not familiar with the notation, 10″ is ten inches (25.4 cm) and 10′ is ten feet (3.05 m). An acre is 0.4 hectares.]

Agriculture and technology have been intimately connected for the last 10,000 years. Right now, information technology is changing how we grow food; this piece takes a quick look at how that works.


If soil conditions aren’t right, crops will grow poorly. For example, alfalfa grows best in soils with a pH between 6.5 and 7.5. Soils that are too acidic can be “fixed” by applying ground limestone (CaCO3) at rates determined by formulae based on chemical analysis. The process typically begins with taking soil samples (to an appropriate depth) in a zig-zag pattern across each field, mixing the samples in a bucket, and then sending a sub-sample to a laboratory where it’s analyzed for pH, cation exchange capacity, major nutrients such as phosphorus, potassium, and sulfur, and micro nutrients such as zinc. For more details, see this document about interpreting soil test results.

Applying a uniform rate of ag (agricultural) lime to an entire field is suboptimal where there is variation in soil pH within the field. Ag lime applied where it is not needed is not only a waste of money, it can raise soil pH to a point that is detrimental to crop growth. To characterize a field more accurately, it needs to be sampled at a finer granularity. For example, GPS grid lines can be super-imposed on a field to locate points each representing an area of, say, 2.5 acres. Around each such point, ten or more soil samples would be taken along a 30’ radius, mixed, sub-sampled, and GPS-tagged. From the resulting analysis, the lime requirement, and adequacy of other nutrients essential for plant growth, of all areas in the field can be interpolated using a model.

Let’s look at an example. This image shows the farm near Riley KS that my parents bought during the 1980s. I spent many afternoons and weekends working there until I moved out of the area in 1995. It’s a quarter-section; in other words, a half-mile on a side, or 160 acres. 135.5 of the acres are farmland and the remaining 24.5 are used by a creek, waterways (planted in grass to prevent erosion), buildings, and the driveway.

This image shows the points at which the fields were sampled for soil analysis in November 2015:

Each point represents a 1.25 acre area; this is pretty fine-grained sampling, corresponding to relatively small fields with terraces and other internal variation. A big, relatively homogeneous field on the high plains might only want to be sampled every 5 or 10 acres.

Here are the soil types:

This image shows how much sulfur the soil contains:

In the past it wasn’t necessary to fertilize with sulfur due to fallout from coal-burning power plants. This is no longer the case.

Another quantity that can be measured is crop yield: how much grain (or beans or whatever) is harvested at every point in a field? A combine harvester with a yield monitor and a GPS can determine this. “Point rows,” where a harvested swath comes to a point because the field is not completely rectangular, need to be specially taken into account: they cause the grain flow to be reduced not because yield is low but rather because the full width of the combine head is not being used. Yield data can be aggregated across years to look for real trends and to assess changes in how low-yield areas are treated.

Aerial measurement with drones or aircraft can be used to look for irregularities in a field: color and reflectivity at various wavelengths can indicate problems such as weeds (including, sometimes, identification of the offending species), insect infestations, disease outbreaks, and wet or dry spots. The alternative, walking each field to look for problems, is time consuming and risks missing things.

Some of the procedures in this section (maintaining a drone, intensive grid-sampling, interpreting soil test and yield results) are time-consuming and complicated, or require expensive equipment that would be poorly utilized if owned by an individual farmer. Such jobs can be outsourced to crop consultants who may be hired on a per-acre basis during the growing season to monitor individual fields for pests and nutrient problems, irrigation scheduling, etc. During the off-season, consultants may do grid sampling, attend subject-matter updates to maintain certification, and assist growers with data interpretation and planning, etc. Many crop consultants have years of experience, and see many fields every day; the services of this sort of person can reduce risks. Here’s the professional society for crop consultants and some companies that provide these services (1, 2).


“Variable-rate application” means using the results of intensive soil grid sampling to apply seed, fertilizer, herbicide, insecticide, etc. in such a way that each location in the field receives the appropriate amount of whatever is being applied. For example, fewer seeds can be planted in parts of a field that have weaker capacity to store water in the soil, reducing the likelihood of drought stress.

Variable-rate can apply to an entire implement (planter or whatever) but it can also be applied at a finer granularity: for example, turning individual spray heads on and off to prevent harmful overspray or turning individual planter rows on and off to prevent gaps or double-planting on point rows and other irregularities. Imagine trying to achieve this effect using a 12-row planter without computer support:

(Image is from this slide deck.)

Here’s the soil pH for my Dad’s farm and also the recommended amount of ag lime to apply for growing alfalfa:

For cropland on this farm, 443,000 pounds (221 US tons / 201 metric tons) of ag lime are needed to bring the soils to the target pH of 6.5, the minimum pH for good alfalfa or soybean production. Purchase, hauling, and variable-rate application of ag lime in this area would be $20-25/ton, so the cost is roughly $5,000. However, because the land is farmed with no-till practices (i.e. no deep tillage to incorporate the lime), no more than about 1 ton/acre of ag lime is applied per year, so there will be a doubling or tripling of application costs, spread over several years, to some parts of the farm.

Of course there are limits on how precisely a product can be applied to a field. Ag lime would typically be applied using a truck that spreads a 40′ swath of lime. Even if the spreader is calibrated well, there will be some error due to the width of the swath and also some error stemming from the fact that the spreader can’t instantaneously change its application rate. There might also be error due to latency in the delivery system but this could be compensated for by having the software look a few seconds ahead.

Here’s an analogous recommendation, this time for phosphorus in order to meet a target of 60 bushels per acre of winter wheat:

Phosphorus fertilizer application is an annual cost, which can vary greatly depending on type and price of formulation used. Most cropland farmers in this part of the world would figure on $25-35/acre for purchase and variable-rate application.

And finally, here’s the zinc recommendation for growing soybeans:

As you can see, much less zinc than lime is required: less than a ton of total product across the entire farm.


Driver-assist systems for cars are primarily about safety, and driverless cars need to pay careful attention to the rules of the road while not killing anyone. Automated driving solutions for tractors and harvesters seem to have evolved entirely independently and have a different focus: following field boundaries and swaths accurately.

An early automated row-following technology didn’t do any steering, but rather provided the farmer with a light bar that indicated deviation from an intended path. This was followed by autosteer mechanisms that at first just turned the steering wheel using a servo, and in modern machines issues steering commands via the power (hydraulic) steering system. The basic systems only handle driving across a field, leaving the driver to turn around at the end of each row. To use such a system you might make a perimeter pass and then a second pass around a field; this provides room to turn around and also teaches the autosteer unit about the area to be worked. Then, you might choose one edge of the field to establish the first of many parallel lines that autosteer will follow to “work” the interior of the field. Static obstacles such as trees or rocks can be marked so the GPS unit signals the driver as they’re approached. Dynamic obstacles such as animals or people are not accounted for by current autosteer systems; it’s still up to the driver to watch out for these. Autoturn is an additional feature that automates turning the tractor around at the end of the row.

Autosteer and autoturn aren’t about allowing farmers to watch movies and nap while working a field. Rather, by offloading the tiring, attention-consuming task of following a row to within a couple of inches, the farmer can monitor the field work: Is the planter performing as expected? Has it run out of seed? Autosteer also enables new farming techniques that would otherwise be unfeasible. For example, one of my cousins has corn fields in central Kansas with 30″ row spacing, that are sub-surface irrigated using lines of drip tape that are buried about 12″ deep, spaced 60″ apart. Sub-surface irrigation is far more efficient than overhead sprinkler irrigation, as it greatly reduces water loss to evaporation. As you can imagine, repairing broken drip tape is a difficult, muddy affair. So how does my cousin knife anhydrous ammonia into the soil to provide nitrogen for the corn? Very carefully, and using RTK-guidance (next paragraph) to stay within 1-2 cm of the intended path, to avoid cutting the drip lines.

GPS readings can drift as atmospheric conditions change. So, for example, after taking a lunch break you might find your autosteer-guided tractor a foot or two off of the line it was following an hour earlier. My Dad says this is commonplace, and there can be larger variance over larger time scales. Additionally, it is expected that a GPS will drop out or give erratic readings when signals reflect and when satellites are occluded by hills or trees. So how do we get centimeter-level accuracy in a GPS-based system? First, it is augmented with an inertial measurement unit: an integrated compass, accelerometer, and gyroscope. I imagine there’s some interesting Kalman filtering or similar going on to fuse the IMU readings with the GPS, but I don’t know too much about this aspect. Second, information about the location of the GPS antenna on the tractor is needed, especially the height at which it is mounted, which comes into play when the tractor tilts, for example due to driving over a terrace. Third, real-time kinematic uses a fixed base station to get very precise localization along a single degree of freedom. Often, this base station is located at the local Coop and farmers pay for a subscription. This web page mentions pricing: “Sloan Implement charges $1000 for a 1 year subscription to their RTK network per radio. If you have multiple radios on the farm, then it is $2500 for all of the radios on a single farm.”

A farm’s income depends entirely on a successful harvest. Often, harvesting is done during a rainy time of year, so fields can be too wet to harvest and in the meantime if a storm knocks the crops down, yields will be greatly reduced. Thus, as soon as conditions are right, it is imperative to get the harvest done as quickly as possible. In practice this means maximizing the utilization of the combine harvester, which isn’t being utilized when it is parked next to a grain wagon to unload. It is becoming possible to have a tractor with a grain cart autonomously pull up alongside a working combine, allowing it to unload on-the-go, without requiring a second driver.


The population of the world is increasing while the amount of farmland is decreasing. Precision agriculture is one of the things making it possible to keep feeding the human race at an acceptable cost. I felt that this piece needed to be written up because awareness of this material seemed low among computer science and computer engineering professionals I talk to.

Better Embedded System SW: Language Use (Coding Style for Compilers) Overview Video

Here's a summary video on Language Use (Coding Style for Compilers) which is half of the topic of coding style.

Other pointers on this topic (my blog posts unless otherwise noted):
For more about Edge Case Research and how to subscribe to our video training channel, please see this Blog posting.

The Half-Dipper: Congregation of Vapours

Open Culture: 12 Million Declassified CIA Documents Now Free Online: Secret Tunnels, UFOs, Psychic Experiments & More

Image by Duffman, via Wikimedia Commons

“The United States Government has not yet made any official reply to the Soviet and East German allegations and protests concerning the 300-yard tunnel that American intelligence operatives are said to have built underneath the border between West and East Berlin for espionage purposes,” says a Washington Post article from 1956 headlined “The Tunnel of Love.” The Communists’ excitement about their discovery even had them conducting “special propaganda tours through the tunnel and to have exhibited the wiretapping and other recording apparatus that the Americans are supposed to have installed inside it.”

This amusing chapter of Cold War history might have seemed, to America at the time, like the kind of foiled effort — though one of an ingenuity admired on both sides of the Iron Curtain — best buried at the back of the espionage archives. But now, thanks to an executive order requiring the Central Intelligence Agency to release “nonexempt historically valuable records 25 years or older” as well as the dogged efforts of journalist Michael Best, you can read over 12 million pages of previously classified documents at CREST, the CIA Records Search Tool. In addition to the files on the “Berlin Tunnel” operation, it offers copious material on much else, such as vintage espionage techniques like writing with invisible ink and undetectably opening sealed letters and CIA research into spiritualist healingtelepathy, and other psychic powers.

For quite some time before now, you technically could have looked up all of this information yourself, provided you felt like going to the National Archives in College Park, Maryland, and pulling it up on one of the four computers made available to do so — but only between the hours of 9 a.m. and 4:30 p.m. The fact that you can now do it from the comfort of your browser owes in large part to the efforts of Best, who raised $15,000 on Kickstarter to go manually print out all (or at least some) of those twelve million pages and upload them to the internet, thereby prodding the CIA to save the ink-and-paper money and just do it themselves.

Some of the project’s backers, no doubt, wanted specifically to see what the CIA’s archives have to say about space aliens, a stock of information you may recall that we featured here just last year. “The publication of the files represents a potential motherlode of background material for researchers, journalists and curious hobbyists,” write the New York Times‘ Daniel Victor and Erin McCann, not long before admitting that “most of the files are pretty boring,” a result of “regular bureaucratic collation.” But then, that kind of methodical gathering and organizing of information has long constituted most of the work of national intelligence: even the short-lived “Tunnel of Love” gathered enough data to keep its processors busy for years after it became a Soviet tourist spot.

Related Content:

FBI’s “Vault” Web Site Reveals Declassified Files on Hemingway, Einstein, Marilyn & Other Icons

The CIA Puts Hundreds of Declassified Documents About UFO Sightings Online, Plus 10 Tips for Investigating Flying Saucers

History Declassified: New Archive Reveals Once-Secret Documents from World Governments

Declassified CIA Document Reveals That Ben Franklin (and His Big Ego) Put U.S. National Security at Risk

75 Years of CIA Maps Now Declassified & Made Available Online

Based in Seoul, Colin Marshall writes and broadcasts on cities and culture. He’s at work on a book about Los Angeles, A Los Angeles Primer, the video series The City in Cinema, the crowdfunded journalism project Where Is the City of the Future?, and the Los Angeles Review of Books’ Korea Blog. Follow him on Twitter at @colinmarshall or on Facebook.

12 Million Declassified CIA Documents Now Free Online: Secret Tunnels, UFOs, Psychic Experiments & More is a post from: Open Culture. Follow us on Facebook, Twitter, and Google Plus, or get our Daily Email. And don't miss our big collections of Free Online Courses, Free Online Movies, Free eBooksFree Audio Books, Free Foreign Language Lessons, and MOOCs.

Electronics-Lab: A New Era of 3D Printing With Cel Robox’s Root, Mote and Tree!

C Enterprise Ltd., the company behind the amazing 3D printer Cel Robox, is now back on stage with some new upgrades and plug-ins: Root, Mote and Tree! Imagine that you will be able to control your 3D printer missions remotely where you can also control not only one printer, but multiple of them!

Robox is not another 3D printer, the 20-micron accuracy printer is a micro-manufacturing platform. The precise positioning of the 3 axis system along with the mechanical and electronic design of the HeadLock system provides a robust framework on which to build a range of manipulators and scanning devices to allow this robot in a box to do much more than just create beautiful 3D prints.

Key features of Robox is on this slideshow. You can check the full specifications here.


If you already have a Robox so don’t worry, you are not left behind. Robox team thinks that it won’t be a good choice to build above the already functional 3D printer in order to increase its capabilities. What they are doing right now is updating peripherals which are standalone and won’t disrupt the quality of the original printer. For example, an original Robox can be upgraded to become a RoboxDual using DIY upgrade kits or vendor provided services.

Increasing the size of printing by making a bigger size Robox was a suggestion for them, but what they were thinking about was different. Making a bigger Robox may risk some features already guaranteed in the original one, so why not make a way that you can function multiple Robox editions at the same time in an amazing architecture that saves space and time? Here comes Tree: a bespoke furniture system that utilises the compact nature of the Robox micro-manufacturing platform to increase productivity. It is  a precision CNC machined from high quality birch plywood with a choice of two different finishes, and is supplied as an easy-to-assemble ‘flat-pack’ solution. Using familiar fasteners, Tree can be assembled by anyone in under 30 minutes with just an allen key and screwdriver. It is a nice addition to your fablab, coworking space or even your office!

To control this Tree, a new plugin from Robox is also introduced: Root! Robox Root is a connectivity
extension platform for all Robox printers. Its core function is to add network capabilities to multiple Robox from a single Root, with secondary functions to include a web interface and printer sharing across a network. It is perfectly suited for use in offices, schools or other professions where multiple users need easy access to a single or multiple printers. The onboard HDMI port also allows you to connect Root to any external display or touchscreen, including its companion, Robox Mote.

Robox Mote is custom designed controller for Root. Using a 5” touch screen connected directly to Root, you can see the status of any connected machines and also control them directly. This allows you to control and execute prints without a connected PC from pre-sliced GCode on SDcard or USB flash drive. Using Mote is an option, you can use any smartphone, tablet, or a computer using AutoMaker – Robox outstanding software.

In order to launch this new phase of Robox with customers involved, the team had launched a crowdfunding campaign on Kickstarter. Although it still has 21 days to go but the campaign exceeded its 10,000 goal.

Check the campaign video to learn more from Robox team:

If you don’t have a Robox, it’s a good opportunity now to get one with a great deal. You can order Robox now for £999, as mentioned in the website, but how about a DualRobox with Root included for £1399? If you already have a Robox it’s time to add a Root to your collection for £149 including Mote and support. And finally, if you are a business or a fablab and want to add a great 3D printing corner to your space then it’s the suitable time to order one of the Tree packages provided in the campaign.

Lots more rewards, packages, specifications and detailed information are provided in the campaign page, so check it out!

The post A New Era of 3D Printing With Cel Robox’s Root, Mote and Tree! appeared first on Electronics-Lab.

BOOOOOOOM!: Artist Spotlight: Grzegorz Domaradzki


Poland-based graphic designer and illustrator Grzegorz Domaradzki aka Gabz continues to create some seriously impressive movie poster designs. Click here for previous post. More images below!

BOOOOOOOM!: Photographer Spotlight: Gabriela Herman


Photos by Brooklyn-based photographer Gabriela Herman (click here for previous post). More images below.

Open Culture: Watch Mr. Rogers Persuade Congress to Stop Cutting PBS Budget in 1969 : Would It Stop Trump from Defunding PBS & NEA Today?

Yesterday, the news broke that the Trump administration will apparently be slashing federal spending, to the tune of $10.5 trillion over 10 years. According to The Hill, the “departments of Commerce and Energy would see major reductions in funding.” And “the Corporation for Public Broadcasting [aka PBS] would be privatized, while the National Endowment for the Arts and National Endowment for the Humanities would be eliminated entirely.”

Attempts to cut funding for the arts is nothing new. Above, we take you back to 1969, when Richard Nixon planned to reduce PBS’ funding from $20 million to $10 million. That is, until Fred Rogers, the gentle creator of Mister Rogers’ Neighborhood, spent six short minutes before Senator John Pastore, the chairman of the Subcommittee on Communications, and made his pitch for publicly-funded educational television. In those 360 seconds, Rogers gets the gruff senator to do a complete 180 – to end up saying “It looks like you just earned the 20 million dollars.”

It’s unlikely that Mr. Rogers could get the same traction today. Quite the contrary, his sweetness and sincerity would likely be mocked quite mercilessly, a sign of how coarse our society has become these days.

Follow Open Culture on Facebook, Twitter and Flipboard and share intelligent media with your friends. Or better yet, sign up for our daily email and get a daily dose of Open Culture in your inbox. And if you want to make sure that our posts definitely appear in your Facebook newsfeed, just follow these simple steps.

Related Content:

Mr. Rogers Introduces Kids to Experimental Electronic Music by Bruce Haack & Esther Nelson (1968)

Mr. Rogers Takes Breakdancing Lessons from a 12-Year-Old (1985)

Mister Rogers Turns Kids On to Jazz with Help of a Young Wynton Marsalis and Other Jazz Legends (1986)


Watch Mr. Rogers Persuade Congress to Stop Cutting PBS Budget in 1969 : Would It Stop Trump from Defunding PBS & NEA Today? is a post from: Open Culture. Follow us on Facebook, Twitter, and Google Plus, or get our Daily Email. And don't miss our big collections of Free Online Courses, Free Online Movies, Free eBooksFree Audio Books, Free Foreign Language Lessons, and MOOCs. Comic for 2017.01.20

New Cyanide and Happiness Comic

Penny Arcade: News Post: Cool PAX South Teaser

Tycho: Octavio Abea, who does the Welcome to PAX series, just delivered unto us this morsel: It’s next week!  And you can go! (CW)TB

Planet Haskell: Douglas M. Auclair (geophf): December 2016 1HaskellADay 1Liners

  • December 22nd, 2016:  f :: (Either a b, c) -> Either (a, c) (b, c), define f, snaps for elegance, e.g.: f (Left 4, "Hi") = Left (4, "Hi")
    • bazzargh @bazzargh uncurry (flip (join bimap . (,) ))
      • Denis Stoyanov @xgrommx need (Left 4, "Hi") = Left (4, "Hi") but your version Left ("Hi", 4)
    • Thomas D @tthomasdd Do tuple sections count? do I have access to Data.Bifunctor?
      • f (eab,c) = bimap (,c) (,c) eab
    • SocialJusticeCleric @walkstherain uncurry $ either ((Left .).(,)) ((Right .).(,))
    • Denis Stoyanov @xgrommx or f (e, a) = (join bimap (\x -> (x, a))) e
    • Nickolay Kudasov @crazy_fizruk most elegant IMO:
      f (Left a, c) = Left (a, c)
      f (Right b, c) = Right (b, c)
  • December 22nd, 2016: define a function that writes out an infinite, alternating stream of 1's and 0's as below. 
    • Philipp Maier @AkiiZedd mapM putStrLn $ join $ repeat ["0","1"]
      • Eyal Lotem @EyalL join . repeat = cycle?
    • mavant @mavant f = putStr "10" >> f
    • Eyal Lotem @EyalL mapM putStrLn $ cycle ["0","1"]
  • December 10th, 2016:
    startsWith :: [String] -> String
    points-free so that:
    startsWith ["ΜΗΛΟΝ", "ΗΔΟΝΗ"] = "ΛΟ"
    That is: (length list)+1 Char of each word
    • SocialJusticeCleric @walkstherain 
      • I prefer `uncurry (!!) . (Data.List.transpose &&& length)`
      • but `map . flip (!!) . length =<< id` only uses the Prelude
    • Nick @crazy_fizruk zipWith (!!) <*> repeat . length

Quiet Earth: Abbie Cornish Fights Memory Loss in Canadian Thriller LAVENDER [Trailer]

Canadian director Ed Gass-Donnelly arrived on the scene in 2010 with the outstanding Small Town Murder Songs (review). It wasn't his first film but by that point, it was clear that he was ready for the next big step.

That seemed to come with The Last Exorcism Part II except that movie failed to deliver anything of interest so Gass-Donnelly packed it up and headed back North and in the last few years, has co-directed a short film and released another movie, one that looks to be more in line with the talent on display in Small Town Murder Songs.

Lavender stars Abbie Cornish as Jane, a woman who loses her memory after an accident. [Continued ...]

Quiet Earth: A Look at Walter Hill's Sex-Change Revenge Thriller THE ASSIGNMENT [Trailer]

Walter Hill (yes, we mean THAT Walter Hill) has been pretty busy the last few years producing movies but after a five-year sabbatical, he's finally back directing another action movie - this time starring Michelle Rodriguez in an odd role.

The Assignment stars Rodriguez as Frank Kitchen, an assassin who is double-crossed by gangsters who turn him over to a surgeon, played by Sigourney Weaver, who, in turn, turns Frank into a woman who then goes off looking for revenge.

Did you follow all that? Dude gets turned into a woman and then goes on a murderous spree in search of revenge. It's a little bit like John Wick but with an added twist.

It's a pretty ridiculous set-up conceived by Hill who also had a hand in writing the script and I have to admit, I'm tota [Continued ...]

Jesse Moynihan: Network Notes – Smug Bros

Hey y’all I took two months off from coffee and then got back on the brown sauce to finish addressing the executive notes for the Smuggle Brothers thumbnail board. I just got back from the coffee shop with my metal folder of pages and pens. Often there’s an assumption that the relationship between artist and […]

Disquiet: This Week in Sound: Sonic Illusion + Stonehenge Simulation +

A lightly annotated clipping service:

Sonic Illusion: “[W]hat we imagine hearing can change what we see” is the layperson’s summary of an investigation by Christopher C. Berger & H. Henrik Ehrsson (“The Content of Imagined Sounds Changes Visual Motion Perception in the Cross-Bounce Illusion”) noted in Nature. The article lays out various experiments involving response bias and auditory imagery. (I’m immediately drawn to wonder just how much, in turn, we can attribute to the role sound informs our experience of narratives and places.)

Stonehenge Simulation: Rupert Till of the University of Huddersfield has created a virtual experience of what Stonehenge might have been like “with all the stones in place,” writes David Sillito for the BBC. “He has now developed an app which will help people blot out the sounds – including those made by tourists, and cars on the nearby A303 – and go back to the soundscape of 3,000 years ago.” (The project brings to mind Bassel Khartabil’s work on revisiting the ancient city of Palmyra.)

Avian Few: Birds thought long ago to have gone extinct, having disappeared from their native England, live on in New Zealand. “By comparing recordings of yellowhammer accents in both countries scientists were able to hear how the birds’ song might have sounded in the UK 150 years ago,” reports Georgia Brown in the Guardian. (Via Tim Prebble)

Good Lick: According to the postal service of Greenland, only 10 to 15 albums of music are released each year by citizens of the island nation: “The bestselling of these are issued in a number of 5,000. copies. Rather impressing in at country of only 56,000 inhabitants.” So it is that the post office has released music-themed stamps, ranging from “drum song” to accordion music. (Via Michael Rhode)

Jacked Up: The headline to Rita El Khoury’s article at says it all: “[Because that doesn’t sound ridiculous] HTC has an app to update the firmware of its USB-C to 3.5mm adapter.” It’s worth noting that as of this typing, the article has 137 comments.

Audio UI: That cool hockey puck that comes with Microsoft’s Surface Studio may have gotten old quickly: As Juli Clover reports at, Adobe is working on voice-enabled search and editing of images.

Dust Up: Artist Nina Katchadourian has produced a sound tour of the MoMA in Manhattan in which she details the battle against dust at the venerable museum. As Aruna D’Souza writes at, two years of research yielded a 30-minute recording with numerous stops, among them “the main lobby, a closet holding air purifiers, the soaring atrium, the helicopter that hangs on the second floor, a window ledge.”

Theater Geeks: Putting aside the Wired article’s clickbait title suggestion of autonomously created large-scale buildings, Liz Stinson writes up the marvel that is the Elbphilharmonie. That’s a new theater in Hamburg, Germany, and its acoustic panelling was produced with hyper-detail computer aid: “No two panels absorb or scatter sound waves alike, but together they create a balanced reverberation across the entire auditorium.” The architecture firm of Herzog and De Meuron collaborated with acoustics expert Yasuhisa Toyota on the project.

Primate Directive: Researchers have found that human and baboon voices have far more in common than was previously believed to be the case, writes Colin Barras for the New Scientist. Joël Fagot (Aix-Marseille University) and Louis-Jen Boë (Grenoble Alps University) have identified previously unrecognized vowels among 1,300 baboon subjects.


Recent deaths of note.

RIP, musician Tommy Allsup (b. 1931), who lost the coin toss that would have put him in Holly/Valens/Bopper’s plane

RIP, Bronski Beat keyboardist Larry Steinbachek (56)

RIP, pianist and singer Buddy Greco (b. 1926)

RIP, songwriter Greg Trooper (b. 1956). He wrote, among others, “Everywhere,” a war heartbreaker I know from Billy Bragg’s great cover.

RIP, conductor, composer, and scholar of Australian music Richard Divall (b. 1945)

RIP, Hans Berliner (b. 1929), chess champion and early computer-games figure

RIP, Keyboard Magazine (42)

RIP, Dick Gautier (b. 1931), played rock star in Bye Bye Birdie

This first appeared, in slightly different form, in the January 17, 2017, edition of the free Disquiet “This Week in Sound” email newsletter:

Open Culture: Download & Print Free Shepard Fairey Protest Posters for the Trump Inauguration

Shepard Fairey probably first crossed your radar when he drew the iconic “Hope” poster so associated with Barack Obama’s 2008 campaign. Now, he returns with another set of posters to help protest the inauguration of one Donald J. Trump. If you head over to the Amplifier Foundation web site, you can download and print a series of posters (shown above) by Fairey. The same applies to a number of posters designed by other artists, including Jessica Sabogal and Ernesto Yerena.

The images capture the “shared humanity of our diverse America” and condemn the exclusionary policies of the incoming administration. And thanks to the $1.3 million raised through a successful Kickstarter campaign, these posters will figure into a larger Inauguration Day plan. Here’s how it will work:

Much of Washington will be locked down on Inauguration Day, and in some areas there will be severe restrictions on signs and banners.  But we’ve figured out a hack.  It’s called the newspaper!  On January 20th, if this campaign succeeds, we’re going to take out full-page ads in the Washington Post with these images, so that people across the capitol and across the country will be able to carry them into the streets, hang them in windows, or paste them on walls.

You’re welcome to print and post these posters around your town–wherever it’s legally permitted to do so. To download the posters, click here.

Follow Open Culture on Facebook, Twitter and Flipboard and share intelligent media with your friends. Or better yet, sign up for our daily email and get a daily dose of Open Culture in your inbox. And if you want to make sure that our posts definitely appear in your Facebook newsfeed, just follow these simple steps.

Related Content:

2,200 Radical Political Posters Digitized: A New Archive

A Gallery of Visually Arresting Posters from the May 1968 Paris Uprising

Artist Shepard Fairey Curates His Favorite YouTube Videos

Google Puts Online 10,000 Works of Street Art from Across the Globe


Download & Print Free Shepard Fairey Protest Posters for the Trump Inauguration is a post from: Open Culture. Follow us on Facebook, Twitter, and Google Plus, or get our Daily Email. And don't miss our big collections of Free Online Courses, Free Online Movies, Free eBooksFree Audio Books, Free Foreign Language Lessons, and MOOCs.

Ansuz - mskala's home page: Modular synthesis intro, part 1: What is it?

My mother asked me to explain what I'm up to in one sentence, for inclusion in the annual Christmas Letter, and I said that I'm making electronic musical instruments. That's a pretty good summary as far as it goes. But people often want more detail on what modular synthesizers are all about, and this is the first of three postings I'm writing so that I can have a place to which I can direct the curious. In this episode I'll summarize what modular synthesis is. Next time, I'll explain why you shouldn't get involved in modular synthesis, and what to do instead. And in part 3, I'll give some advice on how to get started with modular synthesis, for those who foolishly ignored part 2.

I may update these postings a bit in the future, if they prove to have any lasting value. And as a reminder, my company is North Coast Synthesis Ltd., and I'll some day soon be selling synthesizer modules from my Web storefront, which is not open yet. You can register your address on that page if you want me to send you an email when it opens.

Disquiet: Disquiet Junto Project 0264: Time Travel

Each Thursday in the Disquiet Junto group, a new compositional challenge is set before the group’s members, who then have just over four days to upload a track in response to the assignment. Membership in the Junto is open: just join and participate. A SoundCloud account is helpful but not required. There’s no pressure to do every project. It’s weekly so that you know it’s there, every Thursday through Monday, when you have the time.

Tracks will be added to this playlist for the duration of the project:

This project’s deadline is 11:59pm wherever you are on Monday, January 23, 2017. This project was posted in the morning, California time, on Thursday, January 19, 2017.

These are the instructions that went out to the group’s email list (at

Disquiet Junto Project 0264: Time Travel
Record a piece of music that plays with the perception of time.

Step 1: Recorded music is, generally speaking, a fixed object. It’s a document. It proceeds linearly, over time. It is, in the terminology of fine art, “time-based.” That said, music has the power to change one’s perception of time. Slowing and speeding tempo alone can alter a listener’s understanding of what is happening. Backward masking, sublimated hints of themes yet to come, the sound of a tape in fast forward mode — those are just a few ways that a composer can suggest that time is not moving linearly. Now, consider for a moment the tools available to give an impression of time doing things other than proceeding in a steady forward motion.

Step 2: Record a short piece of music that takes time travel as its theme, using ideas that resulted from the consideration in Step 1.

Five More Important Steps When Your Track Is Done:

Step 1: If you hosting platform allows for tags, be sure to include the project tag “disquiet0264″ (no spaces) in the name of your track. If you’re posting on SoundCloud in particular, this is essential to my locating the tracks and creating a playlist of them.

Step 2: Upload your track. It is helpful but not essential that you use SoundCloud to host your track.

Step 3: In the following discussion thread at please consider posting your track:

Step 4: Annotate your track with a brief explanation of your approach and process.

Step 5: Then listen to and comment on tracks uploaded by your fellow Disquiet Junto participants.

Deadline: This project’s deadline is 11:59pm wherever you are on Monday, January 23, 2017. This project was posted in the morning, California time, on Thursday, January 19, 2017.

Length: The length is up to you, but two to three minutes sounds about right.

Title/Tag: When posting your track, please include “disquiet0264″ in the title of the track, and where applicable (on SoundCloud, for example) as a tag.

Upload: When participating in this project, post one finished track with the project tag, and be sure to include a description of your process in planning, composing, and recording it. This description is an essential element of the communicative process inherent in the Disquiet Junto. Photos, video, and lists of equipment are always appreciated.

Download: It is preferable that your track is set as downloadable, and that it allows for attributed remixing (i.e., a Creative Commons license permitting non-commercial sharing with attribution).

Linking: When posting the track online, please be sure to include this information:

More on this 264th weekly Disquiet Junto project, Time Travel: Record a piece of music that plays with the perception of time”:

More on the Disquiet Junto at:

Subscribe to project announcements here:

Project discussion takes place on

There’s also on a Junto Slack. Send your email address to for Slack inclusion.

Image associated with this track is by Heather and used thanks to a Creative Commons license:

Colossal: New Impossibly Intricate Embroideries by Chloe Giordano

We continue to be enthralled by the work of Chloe Giordano (previously here and here) who produces everything from tiny coin-sized depictions of woodland creatures to entire book covers typography and all. The Oxford-based illustrator is entirely self-taught, learning her craft “through a lot of trying things out and messing them up.” Each piece is deeply connected to her pencil drawings, as she works out many of the details on paper before turning to thread. Giordano frequently fields questions on her Tumblr and you can follow more of her progress on Instagram.

Saturday Morning Breakfast Cereal: Saturday Morning Breakfast Cereal - Eat Your Vegetables

Click here to go see the bonus panel!

Oh, weird. The soul doesn't want to return to a boy with an untidy room.

New comic!
Today's News:

Submissions are open for BAHFest MIT! Also, we announced our keynote speaker...

Please note, this year's show is OPEN THEME. You can do any science/technology idea you've got!

CreativeApplications.Net: Solace: How We Made the Interactive Speculative Fiction

Part of a new series of posts inviting artists and curators to share latest projects on CAN, we'd like to introduce you to Evan Boehm, and his latest collaboration with Nexus Studios. Solace is an interactive animated film based on celebrated science fiction writer Jeff Noon’s short story about a near future in which marketing and addiction are disturbingly intertwined.

TheSirensSound: New single - Bad Decisions by Maya Killtron

Ideas from CBC Radio (Highlights): The Truth about "Post-Truth"

The election of Donald Trump has ignited talk that we're now living in a "post-truth" era. But are we? And if we are, what are the origins of this idea that the truth no longer exists, or if it does, that it doesn't matter anymore?

TheSirensSound: New songs - Away/Tangerine by Mons Vi

Penny Arcade: News Post: Satyrical

Tycho: I was trying to figure out why Gabriel would be playing Diablo III; I kept seeing his PSN account logged into it.  If you’re down with the D or whatever it’s fine.  Lots of people play Diorblo, specifically, lots of people not named Mike.  Overwatch or Titanfall 2, certainly.  I asked him about it, and he said that while his guts are still fucked up, playing “exciting” games hurts too much, and that playing Diablo - a game where you beat back unrelenting waves of hell monsters - is relaxing by comparison.  Relaxing for the heroes, at…

Planet Haskell: Michael Snoyman: Follow up on mapM_

This is a short follow-up to my blog post about mapM_ and Maybe. Roman Cheplyaka started a discussion on that post, and ultimately we came up with the following implementation of mapM_ which works for all Foldables and avoids the non-tail-recursive case for Maybe as desired:

mapM_ :: (Applicative m, Foldable f) => (a -> m ()) -> f a -> m ()
mapM_ f a =
    go (toList a)
    go [] = pure ()
    go [x] = f x -- here's the magic
    go (x:xs) = f x *> go xs

Why is this useful? If you implement mapM_ directly in terms of foldr or foldMap, there is no way to tell that you are currently looking at the last element in the structure, and therefore will always end up with the equivalent of f x *> pure () in your expanded code. By contrast, with explicit pattern matching on the list-ified version, we can easily pattern match with go [x] and avoid *> pure () bit, thereby making tail recursion possible.

Some interesting things to note:

  • Using () <$ f x instead of f x *> pure () or f x >> return () seemed to make no difference for tail recursion purposes.
  • As a result of that, we still need to have the ()-specialized type signature I describe in the previous blog post, there doesn't seem to be a way around that.
  • As you can see from the benchmark which I unceremoniously ripped off from Roman, there do not appear to be cases where this version has more memory residency than mapM_ from base. Roman had raised the concern that the intermediate list may involve extra allocations, though it appears that GHC is smart enough to avoid them.

Here are the results. Notice the significantly higher residency numbers for base:

   5000      roman          36,064 bytes
   5000    michael          36,064 bytes
   5000       base          36,064 bytes
  50000      roman          36,064 bytes
  50000    michael          36,064 bytes
  50000       base         133,200 bytes
 500000      roman          44,384 bytes
 500000    michael          44,384 bytes
 500000       base       2,354,216 bytes
5000000      roman          44,384 bytes
5000000    michael          44,384 bytes
5000000       base      38,235,176 bytes

My takeaway from all of this: it's probably too late to change the type signature of mapM_ and forM_ in base, but this alternative implementation is a good fit for mono-traversable. Perhaps there are some rewrite rules that could be applied in base to get the benefits of this implementation as well.

Completely tangential, but: as long as I'm linking to pull requests based on blog posts, I've put together a PR for classy-prelude and conduit-combinators that gets rid of generalized I/O operations, based on my readFile blog post.

Colossal: Over Two Decades of Charting the Various Movements of Snails by Photographer Daniel Ranalli

“Spiral #9” (1996)

For more than 20 years photographer Daniel Ranalli has been actively collaborating with the ecology of Cape Cod, with one of his most collaborative projects being his Snail Drawing series. The works each contain two images, the first capturing the snails in a simplified pattern of Ranalli’s choosing on the beach, and the second showcasing the ways the snails have decided to move out of this neatly formed configuration. The second image allows the viewer to see the trace of the snail’s movement in the sand, the small bodies slowly scattering away from center.

“The best pieces depend on a certain degree of randomness for their success,” said Ranalli. “I tend to think of the snail pieces as a metaphor for the order we establish in our lives, and how the element of chance enters in to affect the result—regardless of how much we attempt to structure it.”

Some of Ranalli’s work will be exhibited with Laurence Miller Gallery this weekend at Classic Photographs Los Angeles from January 21-22. You can see more of his snail series as well as other gesture-based photography (like his Erased Chalkboard series) on his website. (via La Boite Verte)

“Stone Surrounded” (2014)

“Stick Square” (2013)

“Rock Vein #2” (2013)

“Long Rectangle” (1999)

“Infinity” (2013)

“Diminishing Line” (2013)

“Double Line #2” (2007)

“Cross #2” (2008)

“Circle #2” (2007)

Colossal: Speculative Paintings of a Graffiti-Covered Earth by Josh Keyes

"Descent" (2016), acrylic on panel, 8"x10"

“Descent” (2016), acrylic on panel, 8″x10″

Josh Keyes' newest series features subjects both manmade and natural, their common element being several layers of graffiti that cover a space shuttle, a melting iceberg, and even a whale’s tail. For the last ten years these marks had remained in the background of Keyes’ paintings, adding detail to the supporting elements of the environment rather than being integrated into the subjects of his work.

For Keyes, the decision to place graffiti writing in the foreground questions our relationship to the natural world, and what impact we are undeniably leaving on our planet. The iceberg for instance, is marked with the words, “I’ll melt with you.” This blood red message could be the voice of both the iceberg and the tagger, a warning that we will all be melting if we continue to desecrate the Earth.

“Are there things and places that graffiti should not be?” asked Keyes to Colossal. “Who is to say what surface is to be kept graffiti clean? My personal concern is that this will be a reality some day and speaks to a larger issue of our relationship with the natural world. The satellite and space graffiti hints that even if we colonize other worlds, what mark will we leave? No matter where we go there is evidence of our presence.”

Keyes’ will exhibit his paintings later this year with Thinkspace Gallery in LA. You can see more of his works on his Instagram and website.

"Tin Can" (2016), acrylic on panel, 24"x48", all images via Josh Keyes

“Tin Can” (2016), acrylic on panel, 24″x48″, all images via Josh Keyes

"Tin Can" (2016), acrylic on panel, 24"x48"

“Tin Can” (2016), acrylic on panel, 24″x48″

"I'll Melt With You" (2016), acrylic on panel, 12"x18"

“I’ll Melt With You” (2016), acrylic on panel, 12″x18″

"Frontier 2" (2016), acrylic on panel, 12"x16"

“Frontier 2″ (2016), acrylic on panel, 12″x16”

"Frontier" (2015), acrylic on panel, 19"x24"

“Frontier” (2015), acrylic on panel, 19″x24″

Saturday Morning Breakfast Cereal: Saturday Morning Breakfast Cereal - Eat the Apple

Click here to go see the bonus panel!

I still don't understand why no in the Bible ever says 'Holy shit, a talking snake!'

New comic!
Today's News:

Perlsphere: I hope to see you at FOSDEM in Brussels

I've been rather quiet lately because between building Tau Station and working with some clients, I'm running around faster than a long-tailed cat in a room full of rocking chairs.

I'll be in Brussels for the February 4/5 2017, FOSDEM, talking about Building the Tau Station Universe in Perl. I was planning on giving a talk about testing, but I was specifically asked if I'd talk about Tau Station. While I love the project, I tried to think of a way it wouldn't sound like a 40 minute infomercial at an open source conference.

Woman relaxing in a high-tech hotel room in a space station.
Relaxing in a high-tech hotel room in a space station.

I'm pretty sure I've succeeded and I have to say, I think people are going to be really impressed with some of the code examples. In fact, it's gotten me to the point where I'm having more serious doubts about how object-oriented programming is currently taught. For example, what does the single responsibility principle mean for a combat suit that can pass the Turing test? It serves as armor, and might serve as a weapon, and might serve as a medkit, and even give the soldier a pep-talk.

Single-responsibility my ass.

The Tau Station talk will show a very simple way out of that conundrum.

We have an awesome team working on Tau Station. We've used the same hiring strategy that we use hiring for our clients at All Around the World and it's paid off in spades. You'll be impressed with their work. Fortunately, since this is FOSDEM, even if you can't make it to Brussels, the video will later be online for free and I'll post a link for you.

Hope to see you there!

Michael Geist: Not Exactly a Netflix Tax: Where Canada Stands on a Digital Sales Tax

The CBC’s report that the Canadian government is considering extending goods and services sales taxes to foreign-based digital services has sparked yet another round of articles and coverage of a possible “Netflix tax.” Some Conservative MPs were quick to pounce with claims the Liberals are pursuing a Netflix tax, yet the reality is a bit more complicated. At issue is not the culture contributions payment that is often called a Netflix tax. Despite calls for that form of Netflix tax, Canadian Heritage Minister Melanie Joly has been consistent in saying that the government will not extend mandatory Cancon contributions to Netflix.

In fact, this proposal is not targeted specifically at Netflix at all. Rather, it envisions the possibility of extending GST/HST to foreign-based digital services that are currently exempt from collecting and remitting sales taxes. While the law technically requires Canadian consumers to self-declare the sales tax they owe on those purchases, few are aware of the requirement and presumably even fewer actually do it.

The prospect of extending GST/HST emerged as an issue in 2014 when the Conservative government raised the idea in its budget and launched a public consultation on the issue.  Moreover, the Canadian government is not alone in exploring the possibility of extending sales taxes to the digital world. With many governments fearing increasing lost tax revenue due to online sales and domestic companies expressing frustration with being placed at a competitive disadvantage (Netflix does not collect and remit sales tax, but CraveTV does), the extension of sales taxes to foreign digital providers appears to be a question of when, not if. The “when” depends largely on developing international standards on the issue. The OECD has been actively working on it, recognizing that common standards and a reasonable exemption amount is needed (asking small foreign businesses to collect and remit for a few hundred dollars makes little sense).

The digital sales tax issue was discussed in some detail last month at a Standing Committee on Canadian Heritage hearing that did not attract much attention. Sean Keenan, the director of the sales tax division with the Department of Finance’s Tax Policy Branch told the committee:

E-commerce sales by foreign-based companies can present a challenge for proper sales tax collection. Foreign-based Internet vendors’ businesses with no physical presence in Canada are generally not required to collect GST/HST on their sales. Instead, in the case of physical goods that are purchased online and shipped to Canada by post or courier, the applicable customs duties and GST/HST would generally be collected by the Canada Border Services Agency at the time the goods are imported.

In cases other than the importation of physical goods, the GST/HST legislation imposes a general requirement to self-assess the tax. For businesses that would be entitled to recover any tax payable by claiming input tax credits, there is generally no requirement to self-assess tax on such imports.

The challenges related to the proper collection of sales tax on digital supplies by foreign-based vendors are not unique to Canada. It’s a difficult issue for all jurisdictions with a sales tax. In this regard, the issue was examined as part of the recent initiative of the G20 and the Organisation for Economic Co-operation and Development to address what is known as “base erosion and profit shifting”, or BEPS.

In the context of that international initiative, budget 2014 invited input from stakeholders on what actions the government should take to ensure the effective collection of sales tax on e-commerce sales by foreign-based vendors. Specific feedback was solicited on whether foreign vendors should be required to register with the Canada Revenue Agency and charge the GST/HST on digital sales to residents of Canada. The feedback from these consultations helped shape Canada’s input and participation in the G20 OECD BEPS project.

The final reports of the BEPS project were issued by the OECD on October 5, 2015, including “Addressing the Tax Challenges of the Digital Economy, Action 1”. The Action 1 report examined issues related to the effective collection of sales tax on cross-border digital supplies and services and recommended that where countries decide to institute a regime for taxing foreign suppliers of digital content, the regime should follow the principles of the OECD’s international value-added tax/GST guidelines for these supplies. These guidelines indicate that, at the present time, the most effective and efficient approach to ensure the appropriate collection of VAT/GST on cross-border business-to-consumer supplies is to require the non-resident supplier to register and account for VAT/GST in the jurisdiction of the consumer—essentially, the usual residence of the customer.

Following up on the BEPS Action 1 report, the OECD’s Working Party No. 9 on Consumption Taxes is developing a report on mechanisms for the collection of VAT/GST on digital supplies and services by foreign vendors. The report will examine and identify the best practices of jurisdictions that have required non-resident digital suppliers to register and collect tax on sales in their jurisdictions, in order to assist those that are considering doing so. Canadian officials are participating in the development of this OECD report.

The discussion that followed is worth reading as the witnesses explained the complexity behind developing policy in the area and patiently tried to address MP questions that had nothing to do with digital sales taxes. The takeaway was that extending GST/HST to foreign based digital service providers seems inevitable, but is unlikely to happen in Canada until global standards are adopted at the OECD.

The post Not Exactly a Netflix Tax: Where Canada Stands on a Digital Sales Tax appeared first on Michael Geist.

Planet Haskell: FP Complete: Speeding up a distributed computation in Haskell


While helping a client ship a medical device we were tasked to make its response time bearable. This was no easy feat, given that each request to this device requires running a simulation that takes hours if ran on a single CPU. This long response time would make it impossible for doctors to use this device interactively, which in turn would make the device much less desirable -- think of a doctor having to wait hours between inputting the patient data and getting results, as opposed to getting results immediately as the data is available.

Luckily the simulations in question are embarrassingly parallel, and thus one obvious path to reduce the response time is to run it on multiple CPUs.

At the core of this device sits a Haskell program that performs the simulation. Thus the first step was to exploit Haskell built-in multi-core parallelism to achieve the parallelization. However the results were unsatisfactory, since we were unable to scale decently beyond 7 to 10 CPUs. Thus we created a custom distribution algorithm where separate Haskell runtimes communicate with TCP sockets, similar to what happens in Erlang. This also allowed us to scale beyond a single machine. We've described this effort in the past, see the report Scaling Up a Scientific Computation and the talk Parallelizing and distributing scientific software in Haskell.

This first effort allowed us to run simulations in a much shorter time, but it still did not allow us to scale nicely to hundreds of CPUs. This article describes how we fixed that by bypassing one of the high level facilities that Haskell provides.

High level languages are all about offering such facilities, to be able to write correct programs quicker. Haskell offers a great number of abstractions to help in this regard, such as garbage collection and laziness, and GHC also is full of tools on top of the language itself to write an ever greater number of programs in a more comfortable way.

One of the features that makes GHC stand out is the sophistication of the runtime it provides. Apart from being an impressive piece of work even just for implementing Haskell efficiently, it also offers features that are very useful for the kind of systems programming that writing a distributed application requires. Specifically, green threads and the GHC event manager make writing a fast multi-threaded server much easier than in other languages. For example the first versions of Warp, Haskell's most popular web server, outperformed most web servers in just 500 lines of code, largely thanks to these facilities -- you can find more info about this effort in the report Warp: A Haskell Web Server. Warp has since grown in code size to add new features, but the core is still using the same facilities and performing well.

Since the core of the software that we built is a server coordinating the work of many slaves, for our first version we reached for these facilities to write it. The server was reasonably fast and served us for a while, but we hit a ceiling pretty quickly beyond which we were unable to scale.

However, a nice thing about GHC Haskell is that it's very easy to drop down to a lower level programming style when needed. This can be accomplished through the excellent foreign function interface to C paired with the low-level utilities in base. By doing so we were able to scale to hundreds of cores and run simulations up to 5 times faster then the best time we achieved with the previous version.

The program

As mentioned, the server in question is the master process in a distributed computing application. The application is essentially a particle filter, distributed across many processes which might be on different machines. Since we want multi-machine distribution, we use TCP sockets to communicate between the processes doing the computation.

At the core of the program logic we have a function taking some State and some Input, and generating some new states and an output associated with each one:

type Evolve = State -> Input -> [(State, Output)]

Note that a single state and input pair generates multiple states and output. The multiple outputs are due to the fact that in a particle filter each state (or rather each "particle") can be sampled 0 or multiple times. We need to run one such function on thousands of inputs:

-- Apply the `Evolve` to every given `State`, return
-- the new states and output.
evolveMany :: Evolve -> [State] -> [Input] -> [[(State, Output)]]
evolveMany f = zipWith f

Given this initial specification, there are a couple of adjustments we need to make if we want to be able to distribute the computation. First, the function will have to live in IO, since communication will happen through Sockets. Second, we won't refer to the states directly, but rather refer to them using tokens provided by the system. At the beginning we'll provide the initial states and get back tokens in result, and at each call to evolveMany we'll get -- instead of new States -- new tokens.

We can do this because we do not care about the content of the states (while we care about the outputs) and referring to them with tokens rather than directly we can avoid transferring them to other processes each time we need to operate on them, saving a lot of bandwidth and speeding up the computation greatly.

Thus, we'll also need to book-keep which slave processes are holding which state.

Finally, we'll need Sockets to communicate with the slave processes.

This gives us a new API:

-- We use `Map` and `Set` from `containers` for illustrative purposes, `HashMap`
-- from `unordered-containers` or a mutable hash table from `hashtables`
-- will most likely be more performant.
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Set (Set)
import qualified Data.Set as Set

-- Some token representing a `State` on some slave.
data StateId

-- Some token representing a slave.
data SlaveId

-- Reset the states in the system to the given ones, returns a
-- 'StateId' for each state.
resetStates ::
     Map SlaveId Socket -- Connection to the slaves
  -> [State]
  -> IO (Map SlaveId (Set StateId), [StateId])
  -- Returns how the states have been repartitioned on the slaves
  -- and a list to know which `StateId` corresponds to which `State`.

-- Evolves the states with the given inputs, returns the outputs and
-- the new 'StateId's resulting from the evolution. 
evolveMany ::
     Map SlaveId Socket -- Connections to the slaves
  -> Map SlaveId (Set StateId) -- Which states are on which slave
  -> Map StateId Input -- Inputs to each state
  -> IO (Map SlaveId (Set StateId), Map StateId [(StateId, Output)])
  -- Returns the new mapping from slaves to states, and
  -- the outputs.

When using this API, the usual pattern is to call resetStates at the beginning with the initial states and then a series of evolveMany afterwards, each using the StateIds returned from resetStates the first time and evolveMany afterwards.

The challenge is to implement evolveMany as efficiently as possible.

To give an idea of the time involved, we usually have around 2000 states, a few tens of calls to evolveMany, and each call to Evolve takes a few tenths of seconds to complete, giving a single-threaded run time of a few hours, e.g.

 2000 * -- Number of states
   80 * -- number of calls to evolveMany
0.03s = -- Evolve time 
1h 20m  -- Total running time

High level overview of the implementation

resetStates just assigns a unique StateId to each state, and then splits up and uploads the states evenly between the slaves.

All the complexity lies in evolveMany: the goal is to utilize the slaves as efficiently as possible.

We found pretty early that naively evolving the states present on each slave would not work, because:

  • Each call to Evolve results in many (possibly 0) children states (since the return type is a list), and we cannot predict how many we'll get in advance. This would cause different slaves to have a different number of states after a few calls to evolveMany, which in turn would cause the slaves to not be used efficiently, since some would end up being idle;
  • The runtime of an individual Evolve depends on the state and on the input, and we cannot predict it. This also can cause some slaves to finish earlier than others, causing inefficiencies.

More concretely, imagine a situation with 10 states, where 9 of the states take 1 second while there is an odd state that takes 10 seconds. If we have 2 slaves at our disposal, the most efficient distribution is to assign the slow state to one slave, and all the others to another slave, with one slave taking 10 seconds and the other taking 9. If we just distribute the states evenly between the slaves, 1 slave will take 14 seconds and one 5. Since the total runtime will be constrained by the slowest slave, we must be careful to avoid such long tails.

So we switched to a simple but effective method to utilize the slaves efficiently. The master process keeps track of the states present on each slave, and asks the slaves to process them in batches, say of 5. When a slave finishes its batch, it sends the output back to the master and waits for further instructions. If the slave still has states to evolve, the master sends a request for a new batch to be evolved. If the slave does not have states to update the master will search for a slave with states to spare, and request them. When a slave receives such a request it sends back the states to the master, which will forward them to the needy slave. When there are no more states to update, evolveMany is done.

The algorithm can be summed up as two state machines, one for the master and one for the slave:

-- This is what the master sends to the slave.
data Request
  -- Evolve the selected states
  = EvolveStates [StateId]
  -- Add the given states
  | AddStates [(StateId, State)]
  -- Remove the requested states, and return them to the master
  | RemoveStates [StateId]

-- This is what the slaves reply to the master.
data Response
  = StatesEvolved [(StateId, [(StateId, Output)])]
  | StatesAdded
  | StatesRemoved [(StateId, State)]

-- The slave has a set of `State`s indexed by `StateId`, and it updates
-- it at each request from the master.
slaveStateMachine :: Map StateId State -> Request -> (Map StateId State, Response)

-- Some type to refer to slaves uniquely.
data SlaveId

-- The master keeps track of which states each slave has, and will update
-- it. It also records the outputs we have received from the slaves so far.
data MasterState = MasterState
  { msSlavesStates :: Map SlaveId (Set StateId)
  , msStatesToEvolve :: Map StateId Input
  , msEvolvedStates :: Map StateId [(StateId, Output)]

-- At each response from a slave the master updates its state and then
-- might reply with a new `Request`. Note that the `Request` might not
-- be directed at the same slave that sent the `Response`, since sometimes
-- we need to steal slaves from other slaves since the slave at hand does
-- not have states to update.
masterStateMachine ::
     MasterState -> SlaveId -> Response
  -> (MasterState, Maybe (SlaveId, Request))

The most common pattern of interaction between slave and master will be of a loop of EvolveStates and StatesEvolved:

EvolveStates and StatesEvolved

This interaction between slave and master will continue until one slave will runs out of states to evolve. In that case, the master will have to reach out to some other slave to be able to provide the needy slave with something to evolve. For example, this is what will happen if slave 3 runs out of states and the master decides to ship some states to it from slave 2:

Running out of states

The exact implementation of the state machines is not relevant, but given their types what's to note is that:

  • The slave will be a very simple loop that just waits for a request, processes it, and then replies to the master.
  • The master, on the other hand, is a bit more complicated: it needs to wait for responses from any slave, which means that we'll have to multiplex over multiple channels; and then it can reply to any slave.

First attempt, and performance

Now that we have abstracted out the logic of the master and the slaves in self-contained state machines, we can describe the slave and master processes. We'll assume IO functions to send and receive messages.

The slave implementation is trivial and won't change:

-- These functions will use `recv`/`send` to work with the `Socket`s,
-- and the `store` library to efficiently deserialize and serialize
-- the requests and responses.
receiveRequest :: Socket -> IO Request
sendResponse :: Socket -> Response -> IO ()

slave ::
     Socket -- Connection to master
  -> IO a
slave sock = loop mempty -- No states at the beginning
    loop :: Map StateId State -> IO (Map StateId State)
    loop states = do
      req <- receiveFromMaster sock
      (states', resp) <- slaveStateMachine states req
      sendToMaster sock resp

Note that a slave process is not bound to a single call to evolveMany, it just takes requests from a master.

The master on the other hand is essentially the implementation of evolveMany, and we have a lot more options to implement it. Our first version is a pretty idiomatic Haskell program, using one thread per slave so that we can wait on all of them at once, with the master state stored in an MVar that can be accessed from all the slave threads:

First implementation

Each slave thread will run code waiting on a slave, modifying the shared state using the master state machine:

import Control.Concurrent.MVar

receiveResponse :: Socket -> IO Response
sendRequest :: Socket -> Request -> IO ()

-- Terminates when there is nothing left to do.
slaveThread :: Map SlaveId Socket -> MVar MasterState -> SlaveId -> IO ()
slaveThread slaveSockets masterStateVar slaveId = do
  resp <- receiveResponse (slaveSockets Map.! slaveId)
  (masterState, mbReq) <- modifyMVar masterStateVar $ \masterState ->
    let (masterState', mbReq) =
          masterStateMachine masterState slaveId resp
    return (masterState', (masterState', mbReq))
  -- Send the request if needed
    (\(slaveId, req) -> sendRequest (slaveSockets Map.! slaveId) req)
  -- Continue if there are still slates to evolve
  unless (Map.null (msStatesToEvolve masterState)) $
    slaveThread masterStateVar slaveId

-- Runs the provided actions in separate threads, returns as
-- soon as any exists
raceMany_ :: [IO ()] -> IO ()
raceMany_ xs0 = case xs0 of
  -- `race_` is from the `async` package.
  [] -> return ()
  [x] -> x
  x : xs -> race_ x (raceMany_ xs)
evolveMany ::
     Map SlaveId Socket
  -> Map SlaveId (Set StateId)
  -> Map StateId Input 
  -> IO (Map SlaveId (Set StateId), Map StateId [(StateId, Output)])
evolveMany slaveSockets slaveStates inputs = do
  masterStateVar <- newMVar MasterState
    { msSlavesStates = slaveStates
    , msStatesToEvolve = inputs
    , msEvolvedStates = mempty
  -- Run one thread per slave until one receives the response
  -- after which there are no states to evolve
  raceMany_ (map (slaveThread masterStateVar) (Map.keys slaveStates))
  -- Return the results in the `MasterState`
  masterState <- readMVar masterStateVar
  return (msSlavesStates masterState, msEvolvedStates masterState)

This implementation is simple and quite obviously correct, and it's also pretty fast. In fact, we were able to scale up to around 20 slaves quite well with it:

Performance up to 17 slaves, first implementation

Note that both axes for this and every other plot in this article are logarithmic: if we scaled perfectly we'd get a straight line, which we're pretty close to.

However, things go downhill if we try to scale beyond 20 slaves. Here is a sample of the runtime with up to 450 slaves for six different scenarios:

Performance up to 450 slaves, first implementation

These measurements were all taken on clusters of c4.8xlarge AWS instances with 18 physical cores, with up to 30 machines running at once. The benchmarking was automated using terraform, which was invaluable when evaluating the improvements.

It's evident that the distribution does not scale beyond around 40 slaves, and stalls completely between 50 and 100 slaves, after which adding slaves is detrimental to the runtime. Note that for the scenarios taking more time the scaling is better: this is because for those scenarios each individual call to the Evolve function takes longer, and thus the overhead of the distribution is less substantial. This is the case for scenario D, which starts out being the slowest with 17 slaves, taking more than 4000 seconds rather than 800-1000 seconds, but scaling much better.

From this data it was clear that if we wanted to be able to leverage a large number of machines to run our simulations in a minute or less we had to improve the performance of evolveMany.

Small aside: note how these plots contains a line "with taskset" and one without, with the one without performing noticeably worse. The line with taskset indicates measurements taken where each Haskell process is pinned to a physical CPU core: this improves performance substantially compared to letting the kernel schedule them.[^runtimes] After finding this out we ran all subsequent tests pinning slave processes to physical cores. Hyperthreading was also detrimental to the runtime, since the increased distribution overhead far outweighed the gained CPU time; so we used only one process per physical CPU core and avoided hyperthreading. Keep in mind that since we're distributing the work manually using TCP sockets each slave is a separate OS process that runs a dedicated Haskell runtime, which is why it makes sense to pin it to a single core.

Second attempt

By measuring how much time each slave spent working and how much time it spent waiting for instructions from the master, it became clear that the program was getting slower because the slaves spent more and more time waiting for instructions, rather than actually working. Thus, if we wanted proper scaling, we needed to lower the latency between the time a response reached the master and the time the slave received the next request.

Now, we tried to gain conclusive evidence of why our first version of evolveMany is slow, but profiling these sort of applications is quite hard unless you're intimately familiar with the Haskell runtime -- which is almost like saying "if you are Simon Marlow".

We had however some hypotheses of why our program was slow. One possibility is that the event manager can simply not handle hundreds of connections at the same time efficiently, at least in our use case.

Another suspicion is that the multi-threadedness of the first version played at our disadvantage since there would be a lot of pointless context-switches while one thread was already modifying the MVar MasterState. In other words, any context switch between slave threads while one slave thread is already holding the MVar MasterState is (almost) wasted, since it'll be blocked on the MVar MasterState right after receiving a slave response and will yield, delaying the completion of the loop body in the thread that was already processing the MasterState.

While our second version was based on these hypotheses we were quite short on time and did not want to take the risk of rewriting the program to find that we still could not scale as we desired. Thus, we set ourselves to write the fastest possible version of evolveMany that we could think of.

The main change we wanted was to turn the server from a multi-threaded server multiplexing through the event manager to a single-threaded application multiplexing the sockets directly.

In Linux, the epoll set of syscalls exist for this exact reason: you can register multiple sockets to wait on with epoll_ctl, and then wait for any of them to be ready using epoll_wait.

However in Haskell epoll is abstracted over by the GHC event manager, so there is no library to use these facilities directly. The GHC event manager does offer an interface to it in the form of GHC.Event.registerFd. However all these functions are callback based -- they take a function that will be called in a green thread when the socket is ready. Thus we cannot easily write a single threaded program directly using it. If we want to write a single-threaded loop we're forced to go through an additional synchronization primitive such an MVar to signal that a socket is ready to be read from in the callback provided to registerFd. Note that the normal blocking read for Haskell sockets is implemented using threadWaitRead, which uses registerFd in exactly this way, by having the callback to fill in an MVar that threadWaitRead will wait on. We tried this approach and got no performance improvement.

Thus we decided to just write the loop using epoll directly, which proved very painless given that the GHC codebase already contains bindings to the epoll functions, as part of the event manager. We released a simple library for people that need to do the same, simple-poll. Right now it only supports epoll, and is thus limited to Linux, but it should be easy to extend to other platforms by copy-pasting other bits of code from the GHC event manager.

Updating the old loop to an explicit multiplexing style, we have:

-- `System.Poll.EPoll` comes from the `simple-poll` package
import System.Poll.EPoll (EPoll)
import qualified System.Poll.EPoll as EPoll
import Network.Socket (Socket(MkSocket))
import System.Posix.Types (Fd(Fd))

-- Receives first responses to arrive from any of the slaves.
-- This amounts to calling `EPoll.wait` to get back a list of
-- sockets to read from, and then draining them in turn to
-- decode the `Response`.
-- Note that draining them might still not give us a response,
-- since the full response might not be available all at once,
-- and thus in the full version of the software this function will have
-- to hold somes state holding partially read messages.
-- Also note that in the real software it's much better to return
-- a list of `(SlaveId, Response)` pairs. We have it return only
-- one for simplicity.
receiveFromAnySlave ::
  -> Map Fd SlaveId
  -- Reverse lookup table from `Fd`s to `SlaveId`s. We need it
  -- since `EPoll.wait` gives us the `Fd`s which are ready to
  -- be read from, and from that we need to get back which
  -- `SlaveId` it corresponds to, to return it.
  -> IO (SlaveId, Response)

-- Utility to get a file descriptor out of a `Socket`
socketFd :: Socket -> Fd
socketFd (MkSocket fd _ _ _ _) = Fd fd

evolveMany ::
     Map SlaveId Socket -- All the connections to the slaves
  -> Map SlaveId (Set StateId) -- The states held by each slave
  -> Map StateId Input -- The inputs to each state
  -> IO (Map SlaveId (Set StateId), Map StateId [(StateId, Output)])
evolveMany slaveSockets slaveStates inputs = EPoll.with 256 $ \epoll -> do
  -- First register all the sockets with `epoll_ctl`. `epollIn` is to
  -- indicate that we want to be notified when a socket can be read from.
  forM_ slaveSockets $ \socket ->
    EPoll.control epoll Epoll.controlOpAdd (socketFd socket) EPoll.epollIn
  -- Then start the event loop
  masterState <- loop epoll MasterState
    { msSlavesStates = slaveStates
    , msStatesToEvolve = inputs
    , msEvolvedStates = mempty
  return (msSlavesStates masterState, msEvolvedStates masterState)
    fdToSlaveIds :: Map Fd SlaveId
    fdToSlaveIds =
      Map.fromList [(socketFd sock, slaveId) | (slaveId, sock) <- Map.toList slaveSockets]
    loop :: EPoll -> MasterState -> IO (Map StateId [(StateId, Output)])
    loop epoll masterState = do
      -- Get a response from some slave
      (slaveId, resp) <- receiveFromAnySlave epoll slaveSockets
      -- Update the state accordingly
      let (masterState', mbResp) =
            masterStateMachine masterState slaveId resp
      -- Send the new requests
      mapM_ (uncurry sendToSlave) mbResp
      -- Continue if we're not done
      unless (Map.null (msStatesToEvolve masterState')) (loop masterState')

Once we did this, the performance increased dramatically, fulfilling our current scaling needs and probably getting quite close to optimal scaling for our use case, although we have not researched what more margin for improvements we have since we do not need them for now.

Going back to the original set of plots, the blue line shows the improved performance with our second implementation:

Improved performance

The plots clearly show a much nicer scaling pattern as the number of slaves increases, and runtimes of often 100 seconds of less, which represent a 2x to 5x improvement compared to the first version.

We also integrated other micro optimizations that yielded less substantial improvements (in the 5 to 10%) range, such as

  • Using mutable hashtables instead of unordered-containers for most of the bookkeeping.
  • Reading from the Socket directly into a ByteBuffer and deserializing directly from there rather than copying into intermediate ByteStrings, reducing allocations drastically to perform deserialization, since we allocate the buffer where the socket data is read into upfront.


Our biggest takeaway from this experience is that in Haskell we can have the confidence that we'll always be able to write the task at hand to be as fast as possible with relative ease. Writing the epoll based version took around a day, including factoring out the bindings from the GHC event manager into a library.

Moreover, it's important to remember that the normal facilities for fast IO in Haskell (green threads + transparent evented IO) is fast enough for the overwhelming majority of cases, and much easier to manage and think about than manual evented IO. Michael Snoyman recently compared green threads to garbage collection, an apt comparison. Our software is one of the cases where the abstraction prevents performance, and thus we need to work without it.

Finally, it would be great to gain hard evidence on why the first program was slow, rather than just hypotheses. We tried quite hard to understand it but could not reach conclusive evidence in the time we had. We hope to get to the bottom of this issue when we have the time, and maybe make profiling these kind of programs easier in the meantime.


The work described was performed with Philipp Kant and Niklas Hambüchen. Thanks to Michael Snoyman, Philipp Kant, and Niklas Hambüchen for reviewing drafts of this blog post.


Planet Lisp: Eugene Zaikonnikov: New in CL-JPEG

In course of last few months there were numerous small changes introduced to CL-JPEG. None substantial enough to warrant own announcement, but taken together perhaps it's due for an update. So here we go, as of version 2.6:

  • Pre-allocated buffers in DECODE-IMAGE and DECODE-STREAM are now supported. This should help reduce consing in bulk-processing applications. The buffer can be pre-allocated based on dimensions via JPEG:ALLOCATE-BUFFER.
  • CMYK JPEG support. YCCK to CMYK conversion is now performed by decoder. To convert into 3-component RGB, use JPEG:CONVERT-CMYK-TO-RGB convenience function.
  • An option to disable colorspace conversion via :COLORSPACE-CONVERSION NIL supplied to decode functions has been added. Can be useful e.g. if one needs the luminance component. Support of the corresponding option for encoder to improve performance in transcoding applications is in the plans.
  • Small bugfixes and performance tweaks.

silk and spinach: Evolving the kanban board

My wife and I are planning to move house. We aren’t sure where we want to move to, or indeed how much we have to spend. Naturally, though, we want to get the highest possible selling price for our current house in order that we have as many options as possible. So we called in a “house doctor” to help.

After she (the house doctor, not the wife) had recovered from the initial shock of seeing how we have customised a fairly standard 4-bedroom house into a 6-bedroom eclectic disaster, she produced a report containing a list of cosmetic improvements we should make in order to attract prospective buyers. The list is long, with jobs for myself, my wife, and our local handyman. We needed to make the project manageable in a way that would allow us all to contribute as and when we have the time. So I found an old whiteboard in the garage and made this:


As you can see, I drew a very rough plan of the house, including sections for upstairs, downstairs, the attic, and the outside. We then wrote a small sticky note for every improvement suggested by the house doctor (blue) and some that we had always wanted to do ourselves (yellow).

When we finish a task, we simply remove the ticket. For example, you can see that we have already finished all of the tasks needed in the Office (priorities, right?).


And why am I telling you all this? Because this is what I recommend teams do for their software projects. When you pick up the next feature, draw an architecture diagram and populate it with sticky notes. The resulting board is a “map” showing the feature and the tasks that need to be done in order to deliver that feature (thanks to Tooky for that analogy).

  • The diagram you draw for Feature A might differ from the one you draw for Feature B, because you might be touching different parts of your estate. That’s cool. The diagram needs to be the one that’s most appropriate for the work you’re about to do.
  • The visual representation of your architecture allows more people to be engaged in discovering the tasks that need to be done to deliver the feature.
  • And it allows everyone, often including non-programmers, to see and understand the scope and impact of what is to be done.
  • Sometimes doing a task will spawn others: things we didn’t consider when we did the original feature break-down; things we’ve learned by making changes or completing spike tasks; things we or the Product Owner couldn’t envisage sooner. That’s fine — we simply add and remove sticky notes as we think of them (and look for opportunities to slice off a separate feature that we can push back onto the ideas heap). The whole thing is quite dynamic, and yet very well controlled at the same time.
  • If possible I like to include testing in the scope of the stickies, possibly adding a few explicit testing task stickies where necessary.
  • As you finish each task (whatever “finish” means for your team), either remove the task’s sticky note or mark it with a big green tick. For our house doctor board, we’ve decided that removing the stickies is best. But for software teams, I generally recommend adding big green ticks to completed tasks. This allows anyone to see how much progress you have made through the current feature, and which areas still need more work.
  • Sometimes the distribution of ticked and un-ticked stickies will suggest opportunities for splitting the feature and releasing a subset earlier than planned.
  • Hold stand-up meetings around the diagram as often as you need, and certainly whenever anything significant changes. (Some of the teams I coach have been known to hold informal stand-ups 4-5 times each day.) The architecture diagram helps facilitate and focus these discussions, and makes it much easier for everyone to contribute.
  • Note that all of the above works best when the team has a single feature in flight. A WIP limit of one. Single piece flow.
  • This approach works well when combined with the 5-day challenge.

As usual with the recommendations I write in this blog, this idea is probably not a new one. But it is highly effective, and I recommend you try it.


I gave a lightning talk on this topic at the Lean Agile Manchester meetup this week. There is a video, although unfortunately you can’t actually see what’s on the slides. So I uploaded the slides here.

Planet Lisp: Zach Beane: Common Lisp in the Wild - Deploying Common Lisp Applications.

Common Lisp in the Wild - Deploying Common Lisp Applications.

Planet Lisp: Zach Beane: MKCL 1.1.10 is now available

MKCL 1.1.10 is now available

New Humanist Blog: In a word: grammar

Michael Rosen's column on language and its uses

Disquiet: Bell Increments

Until yesterday evening I had never uploaded audio before to, despite being a longtime user, and despite investigations of the service playing a role in the course I teach on the role of sound in media landscape.

Anyhow, I recently added a new module to my modular synthesizer, and in the process of testing it out, I thought I would go and post some of the results. Those results became the collection, two and a half minutes total — five tracks of modulated bell tones. Below is the embedded sound and the information from the page:

This is a collection of five variations on the same bell sound. The bell is being run through a modular synthesizer, with an emphasis on a module called the ADDAC601. The ADDAC601 is a filter bank. It divides the inbound audio into eight bands across the audio spectrum, and then allows those bands to be worked upon by any manner of inputs. In this case the inputs are a variety of LFOs, or low frequency oscillators, often working in combination. Sine waves and triangle waves and saw-toothed waves consort and, in turn, exaggerate the source audio. The LFOs put the overtones into overdrive. These five tracks, each more complex than the previous, are excerpts from a larger collection that accumulated after I added the ADDAC601 to my small modular synth rig. They explore incremental changes as LFOs pile up and the variations take on more internal complexity. Because they were recorded in sequence without pause, each retains echoing, refracted elements of the previous track.

The source audio is a bell recorded by participant Sarana and uploaded for communal reuse on October 14, 2009. The source audio was pitched down a bit before being worked upon by the modular synth, and it also is run through a digital delay before hitting the ADDAC601. Here is the source audio, for comparison:

The track is licensed under this Creative Commons license:

Embedded in Academia: Zion NP and Environs in Winter

As we enter faculty and grad recruiting season, I’d like to present a bit of Utah propaganda. No heroics are required to see this stuff: just a few hours driving from Salt Lake City (on pavement) and some mild day hiking. I’ll provide detailed instructions for visiting any of these locations upon request.

TheSirensSound: New track - Bandit Queen by Sarah Beatty Comic for 2017.01.18

New Cyanide and Happiness Comic

Ideas from CBC Radio (Highlights): American Fascism: It Can't Happen Here? (Encore October 28, 2016)

What did the Trump campaign, and the voters it mobilized, have in common with Fascism, not only in Europe but in America's own dark past?

CreativeApplications.Net: Lift – A luminous petal filament that ebbs and flows

Created by Patten Studio and currently on display at SHoP Architects, Lift is comprised of 24 geometric petals attached to a single spine. Each petal, actuated using a shape memory alloy known as nitinol, can move up and down silently in response to motion it detects.

Disquiet: Natalie Braginsky’s Noise Vexations

Natalie Braginsky uploaded some serious noise about two weeks ago, two tracks of digital vexations. There “.linexp,” five minutes of brief shots of razor-edged pixel disturbances, and “total emotional collapse number four,” which embraces a thick screen of randomness. The latter focuses on the sort of sounds that often suggest the roiling sea but here seem more like an avalanche on — to borrow and bend a phrase from Godflesh — looped repeat. It takes awhile to get underway, opening with short bursts of fireworks that eventually fill the sky, the whole thing running for four-plus minutes. It’s “.linexp” that presents itself as ready for more general consumption. The noise miniatures bring to mind road-side snapshots of robotic collisions and sad-toned circuits failing in public.

Tracks originally posted at More from Braginsky, who is based in New York City, at and

Better Embedded System SW: Guest on Podcast

Elecia & Chris invited me to chat with them on this week's podcast and it was a lot of fun.

You can check out my episode here:

Also, I highly recommend listening to Jack Ganssle's excellent episode 53: "Being a grownup engineer"

Scroll through the episode list.  I'm episode 183 so you can tell they've been at this quite a while. There's a lot of great stuff to listen to.

Note added Tue. 1/17:  books are back in stock in Amazon.

Meanwhile, if you are ordering from the US, the best deal on the book is via paypal here:

Saturday Morning Breakfast Cereal: Saturday Morning Breakfast Cereal - Pop Music

Click here to go see the bonus panel!

I think 'anomie' more or less rhymes with 'shake them cheeks.'

New comic!
Today's News:

Perlsphere: Grant Proposal: Standardization, Test Coverage, and Documentation of Perl 6 I/O Routines

The Grants Committee has received one grant proposal Standardization, Test Coverage, and Documentation of Perl 6 I/O Routines for the January round. Before the Committee members vote, we would like to solicit feedback from the Perl community on the proposal.

Review the proposal below and please comment here by January 23rd, 2017. The Committee members will start the voting process following that and the conclusion will be announced approximately in one week.

Standardization, Test Coverage, and Documentation of Perl 6 I/O Routines

  • Name:

    Zoffix Znet (legal name: Pete Evstratov)

  • Amount Requested:

    USD 999


Many of Perl 6's I/O routines currently have inconsistencies in behaviour between method and subroutine forms along with inconsistencies in calling forms and failure modes compared to the rest of the language. Also some of them, despite being speculated in the synopses and implemented in Rakudo, have no test coverage in the Perl 6 Specification, and as such they remain undocumented and not part of the Perl 6 Language. Some of the routines that do have presence in the Specification, have sparse test coverage, leaving some of their functionality entirely untested.

The work funded by this grant seeks to resolve those inconsistencies, as well as provide full test coverage and documentation.

Benefits to the Perl Community

Inconsistent interfaces are difficult to master and are bug-prone due to programmers forgetting about varying details of individual routines. By making I/O routines take arguments and indicate failures consistent to the way it's done in the rest of the language, they will be much easier for programmers to learn and use. Along with a more pleasant interface, the Perl Community will also benefit by needing to provide less support for people trying to learn the language.

The largest benefit will come from the full test coverage that will no doubt reveal bugs that can be fixed before they're encountered by users in production code. The coverage will also protect from future bugs being introduced inadvertently. Also, the currently unspecced routines will be officially part of the language, and so will be documented and available for use.

As bonus benefits:

The timing of this work seeks to align with the production of "Learning Perl 6" book, in order for it to contain valid information on I/O routines and describe only routines that are actually part of the language, which will avoid confusion for its readers and folks helping those readers learn Perl 6.

Lastly, the bonus deliverables (described below) will benefit further development of Rakudo/Perl 6 by elucidating unspecced, unused, or unwanted routines. The data can also be used to produce a teaching/reference aid (e.g. flash cards with routine names or IRC bot for routine reference).


Scope: by I/O routines this grant proposal means subroutines and methods of the Rakudo implementation found in src/core/, src/core/, src/core/IO/, src/core/IO/, src/core/IO/, src/core/IO/, src/core/IO/, src/core/IO/, and src/core/IO/ as well as its subclasses found in src/core/IO/Spec/ directory. Note that IO::Socket and its subclasses are NOT in the scope of this grant proposal.


  • I/O Action Plan Report
  • Commits in rakudo implementing the Action Plan.
  • Commits in Perl 6 Specification providing full coverage for I/O routines.
  • Commits in Perl 6 Documentation providing full coverage for undocumented I/O routines, as well as any corrections for existing I/O documentation.
  • Bonus deliverable: The "Map" of Rakudo Routines
  • Bonus objective: whenever possible, I intend to fix any of the bugs found by the new test coverage. Should a bug prove to be hard to fix, the test exposing it will be fudged and a ticket for the bug will be filed.

Project Details

  • (Bonus deliverable): The "Map" of Rakudo Routines This will be semi-automatically generated (by introspection) list of all subroutines and publicly accessible object methods provided by Rakudo implementation, together with information on what calling convention they use and how they fail (e.g. returning some object, throwing, or returning a Failure object). This data will guide the decision on how the calling convetion/failure mode for I/O routines should be standardized. I intend to work on this deliverable while this grant proposal is deliberated. As such, it's a bonus deliverable and will be completed regardless of whether this grant is approved.
  • I/O Action Plan Report This will be a Markdown document detailing how the existing routines will change, what the new routines will do, if any are to be added, and whether any currently unspecced routines are to be removed. Parts of this document will eventually be re-used as documention for currently undocumented routines.
    • The scope of all of the changes will be limited by the 6.c Perl 6 language specification, so none of the changes would have to be deferred until 6.d language release.
    • This document will be placed into rakudo repository when ready and other core developers will be asked to reivew it and make comments on the proposed changes.
  • Commits The commits to rakudo/roast/doc repositories will implement changes in the Action Plan, and test and document any I/O routines that are still left untested/undocumented after those changes.


These are the inch-stones I intend to follow:

Routine Map

  • Use Perl 6's introspection facilities to locate core subroutines and classes in CORE:: lexical scope. Further introspect those classes to obtain Method objects. Further introspect the candidates and signatures of all of these routines to obtain the calling convention list (e.g. we pass arguments as adverbs or as positionals, etc)
  • Further introspect the arguments and programmatically invoke the routines with some probably-acceptable values to obtain the output range, in particular failure modes. Some heuristics or manual massaging will be needed here.
  • Part of this work already exists in a repo. If the grant is approved, this repository will be transfered to Perl 6 GitHub organization

I/O Action Plan Report

  • Using the routine map, figure out a better interface for I/O routines and then see what can be changed without breaking the 6.c language spec. Even without that map, I already can see some targets for change: the routines that take $test named arg as a predefined string of test letters in particular order, as well as the inconsistency that most methods fail() while most subroutines throw(). Based on a brief conversation with Larry Wall, the likely change would be to make all of them consistently fail().
  • Inspect the code of NewIO branch for any ideas that can be salvaged for 6.c Language. The work in this branch was created by lizmat++ in 2014-2015, but due to unfortunate circumstances never got merged to master prior to 6.c release. My understanding is it offers a lot of improvements to our current IO, but based on brief perusal of the code, I suspect it would have a lot of conflict with 6.c Language Specification tests. Under this grant, I would like to see if any of the improvements that work offers can be applied to current 6.c language.
  • Using the MoarVM coverage report tool (and by grepping the roast repo), find routines that are entirely unspecced and decide whether they should stay or be removed. For example, the currently unspecced indir() routine is a likely candidate for staying, while I've seen some calls on IRC to remove the unspecced tmpdir().
  • I forcee the largest part of this grant work to be the writing of the tests. Here are some examples of the rough current coverage state of IO routines: src/core/, IO::Argfiles, IO::Special, IO::Spec::Win32, and IO::Handle. The routines whose names are on red lines indicate they're untested in roast (this report was generated on Oct 7 and as I recall only IO::ArgFiles.lines and received any further tests since then).
  • A lot of the decisions made by the Action Plan will be able to close many of the tickets opened by brian d foy while gathering info on our I/O routines that is going to be included in Learning Perl 6 book and the concerns raised in the tickets will be used as input for the Action Plan as well. (Some of them are: RT#130460, RT#130456, RT#130454, RT#130455, RT#130489, RT#130490).
  • Write down the action plan in Markdown format, make it available in Rakudo repository, and invite other core members in #perl6-dev IRC channel to comment on it.
  • After a 1 week review period, update the Action Plan to reflect any received feedback, and proceed to implement it.


The commits will implement the Action Plan. Roast commits will be based on the changes to routines as well as the report generated by the coverage tool. And the doc commits will be done by manually searching and reading exiting documentation and amending it as needed.

(N.B.: I'm aware the coverage tool is currently busted by a commit that changed filenames in .file method for core routines; however MasterDuke++ promised to fix it, and if they won't be able to find time to do so, the fix should be simple enough that I'd fix the tool myself).

Project Schedule

I already began work on the routine map generator and will complete it by the time the decision on this grant proposal is available. After that, I expect to spend 2 weeks preparing the I/O Action Plan Report, 1 week for its review by other core members, and 2 weeks for its full implementation (including tests and docs). I also allow for extra 2 weeks for any unforseen delays in any of the steps.

If my understanding of the date when the decision on this grant would be ready is correct, I intend to finish the work before the end of March, 2017.

Completeness Criteria

  • rakudo repository will contain the IO Action Plan document and it will be fully implemented.
  • All of the I/O routines will have tests in roast and documented on If any of the currently implemented but unspecced routines are decided against being included in Perl 6 Language, their implementation will no longer be available in Rakudo.
  • The test coverage tool will report all I/O routines as covered and the information will be visible on (Perl 6's Wonderful Test Files) website. Note: due to current experimental status of the coverage tool, its report may still show some lines or conditionals untested despite them actually being tested; however, it will show the lines where routines' names are specified as covered.

Sidenote Comments

The grant amount requested may be low compared to the described amount of work because I'd like to still view part of my time on this work as donated to Perl 6. Those who see me on IRC may notice I bounced around the ideas in this proposal before.

The grant will let me finish this work much sooner and in a more complete state than I would be able to otherwise.


I'm a 30-year old Canadian who lived near Toronto for the past 14 years. I also spent some years of my life living in USA (New Jersey) and, before that, in Russia (Siberia), where I was born.

I started with Perl 5 about 12 years ago and have since released over 200 Perl 5 modules on CPAN and for the last 10 years held a single job, large part of which is web development with Perl 5.

In the fall of 2015, I switched my focus to Perl 6 and to date released 34 Perl 6 modules and delivered a couple of Perl 6 presentations at the Toronto Perl Mongers meetings.

Around July, 2016 I joined the Rakudo Perl 6 Core Development Team. I also have been Rakudo's release manager every month since the 2016.06 release.

My notable deliverables to the Perl 6 Community involve the creation of the web app driving; nearly total automation of the Rakudo's release process, including the development of web app for RT interfacing and release status tracking; and writing all of the tutorials on website.

To date, I have authored 461 commits to Rakudo and 1,823 commits to repositories in Perl 6 GitHub organization (523 of which have been to the Perl 6 Specification repository).

Tea Masters: Baozhong Zhuo Yan d'hiver 2016

A Taiwan, une vague de froid, c'est quand les températures passent sous les 20 degrés Celcius! Ce fut le cas ces derniers jours, mais aujourd'hui le soleil a fait remonter le thermomètre et m'a donné envie de goûter à mon Baozhong Zhuo Yan d'hiver. Il a été récolté le 20 novembre au Wenshan dans une plantation mixte de Qingxin Oolong et de Manzhong, 2 cultivars de qualité avec une bonne longueur en bouche et des petits rendements. Sa particularité est que ses feuilles ont été mordues par les mêmes petits criquets verts qu'on trouve dans l'Oolong Beauté Orientale.
L'infusion est un peu plus orangée que d'habitude, mais l'oxydation de ce Baozhong reste faible, bien loin de celle d'une Beauté Orientale. Néanmoins, on peut un peu ressentir l'impact de ces morsures et les arômes plus murs et fruités que pour un Baozhong standard.
L'infusion a une belle limpidité et on ressent beaucoup de douceur. Ce nouveau Chabu aux connexions multicolores symbolise les liens entre thé, terroir, météo et insectes. Tout influence le thé et chaque saison produit des situations nouvelles et des arômes inédits.
Note: Je serai en vacances du Nouvel An chinois du 21 janvier au 2 février. Derniers envois postaux ce vendredi.

Perlsphere: Maintaining the Perl 5 Core: December 2016 report

Dave Mitchell writes:

I spent December:

1) looking for quick some wins on speeding up perl compile-time, using
'perl -MCPAN -e1' as a typical example of loading and compiling several
.pm files.  I tweaked Perl_yyparse() and shaved ~2% off the compile time;
then tweaked Perl_sv_gets() and shaved another ~2% off, and also got a
pleasing run-time boost for line reading, with reading a big list of words
now ~8% faster on my system:

    perl -e'$i++ while (<>)' /usr/share/dict/words

2) investigating possible ways of making the regex engine faster by (in
some cases) processing 8 bytes at a time on 64-bit platforms. This
culminated in an this email thread:

3) as usual, working on a few miscellaneous tickets.

      1:30 RT #130385 Bleadperl breaks DNS-LDNS
      1:00 RT #130385 Bleadperl breaks List-Pairwise
      1:00 RT #130398 Bleadperl breaks Method-Signatures
      4:26 [perl #129199] Difficult-to-trigger panic
      1:01 [perl #130247] Perl_rpeep(OP *): Assertion `oldop' failed
      0:55 [perl #130307] Bug: Regex matches when it shouldn't
      0:33 [perl #130311] heap-buffer-overflow Perl_yyparse
      0:55 fix build warnings and smoke failures
      1:40 fix some CPAN modules under PERL_OP_PARENT
     19:00 investigate making find_by_class faster()
      2:37 optimise Perl_sv_gets()
      4:45 optimise Perl_yyparse()
     12:20 process p5p mailbox
      3:22 review RT tickets
      3:04 review security tickets
     58:08 TOTAL (HH::MM)

 170.1 weeks
2338.8 total hours
  13.7 average hours per week

There are 61 hours left on the grant

CreativeApplications.Net: Untethered – Voice-Driven VR Serial Drama

Untethered is a new VR serial drama created by Numinous Games that has players step into the shoes of a radio DJ and talk your way through a broadcast and an unfolding mystery.

OCaml Weekly News: OCaml Weekly News, 17 Jan 2017

  1. Prof. Spacetime 0.1.0
  2. BuckleScript New Year release
  3. Deprecating the Forge in 2017 (
  4. Postdoc position in Applied Semantics for Production Architectures
  5. Beginners Question for js_of_ocaml
  6. BER MetaOCaml N104, for OCaml 4.04.0
  7. A question about Ocaml logging Comic for 2017.01.17

New Cyanide and Happiness Comic

Ideas from CBC Radio (Highlights): Wachtel On The Arts - John Neumeier

Choreographer John Neumeier has been at the cutting edge of dance for more than fifty years. He talks to Eleanor Wachtel about how he went from being a tap-dancing kid in Milwaukee to the celebrated Artistic Director of the Hamburg Ballet.

IEEE Job Site RSS jobs: Industrial Research Chair in Energy Systems for Smart Cities

Vancouver, British Columbia, Canada Simon Fraser University Mon, 16 Jan 2017 19:22:12 -0800

s mazuk: "Social media structure creative effort ideologically as “self-creating,” but they often end up as..."

“Social media structure creative effort ideologically as “self-creating,” but they often end up as anxiety-inducing, exposing the self’s ad hoc incompleteness while structuring the demand for a fawning audience to complete us, validate every effort, as a natural expectation. Validation is nice, but as a goal for creative effort, it is somewhat limited. The quest for validation must inevitably restrict itself to the tools of attracting attention: the blunt instruments of novelty and prurience. The self one tries to express tends to be new, exciting, confessional, sexy, etc., because it plays as an advertisement. Identity is a series of ads for a product that doesn’t exist.”

- Social Media Is Not Self-Expression, Rob Horning (via rakion)

Daniel Lemire's blog: Best programming language for high performance (January 2017)?

I keep hoping that the field of programming language will evolve. I am a bit tired to program in Java and C… I’d like better languages.

I am particularly interested in what I generally call “high-performance programming”. I want to pick languages where I can get the most out of my hardware. It is fine to program in JavaScript and Python, but there comes a time where you tackle large problems on hardware that is barely sufficient.

  • For my purposes, I am going to narrow it down to popular “system programming languages” which means Swift, Rust, Go, C++, C. These are languages that well-suited to build more than applications, but also servers, database engines and so forth. They all offer ahead-of-time compilation, which makes the performance easier to reason about.

    I think there will be no disagreement that C and C++ and system programming languages. Whether Go and Swift qualify is somewhat subjective. Would you write an operating system in Go? I would not. But Wikipedia seems to be happy to consider them all as system programming languages.

  • I am going to ignore assembly because I can’t imagine using it all the time. It is simply not practical unless you are working on a tiny code base (maybe on embedded software).
  • I am going to ignore Rust, D and Nim as they have too few users. Programming is a social activity: if nobody can use your code, it does not matter that it runs fast. I think that they are very interesting languages but until many more people start coding in these languages, I am going to ignore them. Fortran is out for similar reasons: it still has important users, but they are specialized.
  • I am not including non-system languages such as JavaScript, PHP, Matlab, Ruby, R, Python because though they can be fast, they are simply not generally well suited for high performance. They are typically “fast enough” for specific purposes, but they also have hard limitations. For example, JavaScript and Python appear unable to support natively multithreaded execution. (Spawning new processes does not count.)
  • Java and C# are interesting cases. They have been both described and used as “system programming languages”. I think that the evidence is overwhelming that Java can be used to build significant systems that perform very well. However, I think that running in a virtual machine (JVM, CLR) is a hard limitation: you can never be “bare metal”. I lump Scala with Java.
  • There is a countless number of niche languages that I have not mentioned. Most of them will never pick up any amount of users.

Let me run through a few desirable features for high-performance programming along with the current languages that fare well.

  • Operating systems are built in C or C++. Moreover, many important libraries have C interfaces. This means that being able to call C functions with minimal overhead is important in some instance. While Go allows you to call C functions, there is considerable overhead in terms of performance. All other programming languages can call C with minimal overhead.
    • Obvious winners: C, C++
    • Good players: Swift
    • Loser: Go
  • Though this is controversial, I think that a language with manual memory management may have the upper hand. In modern systems, managing memory is often a major overhead. C and C++ have manual memory management. Swift has reference counting which is a form of automated memory management, but with the advantage of being purely deterministic: when your data goes out of scope, the memory is reclaimed. However, reference counting does have an overhead, especially in a multithreaded context. Go has generational garbage collection (like Java or C#) which means that “it stops the world” at some point to reclaim memory, but the Go engineers have optimized for short pauses. That’s a good thing too because “stopping the world” is not desirable. I don’t know which approach I prefer: Swift or Go.
    • Winners: C, C++
    • Losers: Go, Swift
  • Our computers have many cores. Parallel programming is important. We would like our languages to support elegantly multicore programming. I think that Go has clearly the upper hand. Of course, for example, it is possible to do everything Go does from C as far as multicore programming, but not as easily. As far as I can tell, Swift has one standard way to use multiple cores: Grand Central Dispatch. It also has Operation/OperationQueue for higher level multi-threading.  It might be fine, but it does not look on par with what I find in other languages.
    • Special mention: Go
    • Winners : C++, C
    • Loser: Swift
  • For high performance, a good programming language should have “easy to reason about performance”. This means that when looking at a piece of code, you should have a good appreciation for how fast it will run. Honestly, this has gotten very hard over time, forcing us to rely more and more on benchmarking. However, simpler languages like C and Go makes it easier to reason about performance. Simply put, the more expansive the language, the harder it gets to compile it in your head.
    • Winners: C, Go
    • Losers: Swift, C++
  • Our processors have fancy new instructions, like SIMD instructions (AVX2, Neon…). These should be readily available from the programming language. No programming language is easy to program with something like SIMD instructions, but C and C++ clearly come on top. In Go, you can write functions in assembly and call them from the language, but it comes with a discouraging performance overhead. Swift is barely better (there is a simd package, but it only works under macOS).
    • Winners: C, C++
    • Losers: Go, Swift
  • It has been decades and there is still no universal way to manage dependencies in C. There is also no standard build mechanism. Sure, your favorite IDE can make it easier to add a dependency and build your program, but having something built into the language makes life much easier. In Go and Swift, there is a standard, cross-platform way to build programs, run tests and add dependencies.
    • Winners: Go, Swift (special mention for Go)
    • Losers: C, C++

Let me summarize my analysis with a table:

C C++ Go Swift
Call C Yes Yes Slow Fair
Bare metal memory Yes Yes No No
Cores Yes Yes Great Maybe (GCD)
Simple syntax Yes No Yes No
Safety Minimal Minimal Yes Yes
SIMD Yes Yes Slow Maybe (macOS only)
Tools None None Great Good

If I were hired to build high-performance programming, I’d be happy to be “forced” into any one of these languages. They are all fine choices. They are all improving at a fast pace. I think that Go, for example, has improved tremendously since I first learned it. / 2017-01-21T19:24:16